2010-01-13 4 views
1

В настоящее время я работаю над приложением WCF, которое использует службу REST REST. Проблема заключается в том, когда я делаю обновление или удалить запрос, Rails не возвращает XML, только заголовок:Связь между Rails и WCF

HTTP/1.1 200 OK 
Date: Wed, 13 Jan 2010 13:56:25 GMT 
Server: Apache/2.2.14 (Debian) 
X-Powered-By: Phusion Passenger (mod_rails/mod_rack) 2.2.7 
X-Runtime: 20 
Cache-Control: private, max-age=0, must-revalidate 
Set-Cookie: _Shop-R+Server_session=BAh7BzoPc2Vzc2lvbl9pZCIlODY0NmZlZjQyZTg1OTcyNTE0ZTRlN2NkNTcyZDVmYTEiCmZsYXNoSUM6J0FjdGlvbkNvbnRyb2xsZXI6OkZsYXNoOjpGbGFzaEhhc2h7BjoLbm90aWNlIidDdXN0b21lciB3YXMgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQuBjoKQHVzZWR7BjsHRg%3D%3D--88d0f739a64ea3a92e3a034d73365393dcfeee1e; path=/; HttpOnly 
Content-Length: 1 
Status: 200 
Content-Type: application/xml; charset=utf-8 

Это следует ожидать и исправить, насколько я знаю. Однако при вызове следующего запроса службы из WCF мы получаем ProtocolException (InnerException: XMLException Неожиданный конец файла).

[ServiceContract] 
    [XmlSerializerFormat] 
    public interface ICustomerService 
    { 

     [OperationContract] 
     [WebGet(
      BodyStyle = WebMessageBodyStyle.Bare, 
      ResponseFormat = WebMessageFormat.Xml, 
      UriTemplate = "customers/{id}.xml")] 
     Customer GetCustomer(string id); 

     [OperationContract] 
     [WebInvoke(
      BodyStyle = WebMessageBodyStyle.Bare, 
      UriTemplate = "customers/{id}.xml", 
      Method = "PUT")] 
     void UpdateCustomer(string id, Customer newCustomer); 

     [OperationContract] 
     [WebInvoke(
      BodyStyle = WebMessageBodyStyle.Bare, 
      ResponseFormat = WebMessageFormat.Xml, 
      UriTemplate = "customers.xml", 
      Method = "POST")] 
     Customer CreateCustomer(Customer newCustomer); 

     [OperationContract] 
     [WebInvoke(
      BodyStyle = WebMessageBodyStyle.Bare, 
      UriTemplate = "customers/{id}.xml", 
      Method = "DELETE")] 
     void DeleteCustomer(string id); 

    } 

Методы GetCustomer и CreateCustomer работать без проблем, UpdateCustomer и DestroyCustomer бросить исключение. Мы подозреваем, что это связано с тем, что XML ожидается в качестве ответа.

Есть ли у кого-нибудь опыт работы с Rails и WCF и знает решение/обходное решение этой проблемы?

Для полноты здесь детали исключения:

ProtocolException { «. Там находится проблема с XML, который был получен из сети См внутреннего исключения для более подробной информации»}

XmlException (InnerException) { "Неожиданный конец файла."} StackTrace:

at System.Xml.EncodingStreamWrapper.ProcessBuffer(Byte[] buffer, Int32 offset, Int32 count, Encoding encoding) 
    at System.Xml.XmlUTF8TextReader.SetInput(Byte[] buffer, Int32 offset, Int32 count, Encoding encoding, XmlDictionaryReaderQuotas quotas, OnXmlDictionaryReaderClose onClose) 
    at System.Xml.XmlDictionaryReader.CreateTextReader(Byte[] buffer, Int32 offset, Int32 count, Encoding encoding, XmlDictionaryReaderQuotas quotas, OnXmlDictionaryReaderClose onClose) 
    at System.ServiceModel.Channels.TextMessageEncoderFactory.TextMessageEncoder.UTF8BufferedMessageData.TakeXmlReader() 
    at System.ServiceModel.Channels.BufferedMessageData.GetMessageReader() 
    at System.ServiceModel.Channels.BufferedMessage..ctor(IBufferedMessageData messageData, RecycledMessageState recycledMessageState, Boolean[] understoodHeaders) 
    at System.ServiceModel.Channels.TextMessageEncoderFactory.TextMessageEncoder.ReadMessage(ArraySegment`1 buffer, BufferManager bufferManager, String contentType) 
    at System.ServiceModel.Channels.WebMessageEncoderFactory.WebMessageEncoder.ReadMessage(ArraySegment`1 buffer, BufferManager bufferManager, String contentType) 
    at System.ServiceModel.Channels.HttpInput.DecodeBufferedMessage(ArraySegment`1 buffer, Stream inputStream) 
+0

Похоже, плохой XML, вы можете С.Е. стельку или какой-либо другой инструмент для захвата XML Response вы отправляете из Rails? – Nate

+0

Это проблема, нет (и не должно быть) ответа xml. Единственное, на что реагирует действие рельсов, - это код состояния. – Ferdy

+0

Почему вы определяете контракт на обслуживание WCF для чужого удаленного API? Почему бы просто не использовать HttpClient, чтобы сделать HTTP-запрос непосредственно в Rails-интерфейсе? –

ответ

0

Я уже нашел его благодаря «Дарину Димитрову» и «Нейт Броссу». Они были правы, что WCF ожидает XML, когда вы устанавливаете тип контента в application/xml. Я изменил тип контента на text/plain (в rails), и он работает.

Изменение следующих в ваших рельсам форматирования:

format.xml { head :ok } 

в

format.xml { head :ok, :content_type => 'text/plain' } 
1
Content-Length: 1 
Content-Type: application/xml; charset=utf-8 

Разве это не правильный ответ XML.

+0

Хорошая точка, это касается кода рельсов по умолчанию. Скорее всего, нам не удастся использовать код rails, поскольку он используется в другом приложении. Код для уничтожения: reply_to do | формат | format.html {redirect_to (customers_url)} format.xml {head: ok} end Это создает исключение в клиенте WCF. Если действие реагирует на XML, например get, это не проблема. Код для показа (получения): reply_to do | формат | формат.html # новый.html.erb format.xml {render: xml => @customer} end – Ferdy

0

Go скачать REST Starter Kit Preview 2 и взглянуть на пространство имен Microsoft.Http. Используя эту библиотеку, делающего POST к интерфейсу Rails так же просто, как это:

var client = new HttpClient("http://railsinterface.com"); 
var content = HttpContent.CreateXmlSerializable<Customer>(customer); 
var response = client.Post("customers.xml",content); 
Смежные вопросы