Связь между Rails и WCF - PullRequest
       6

Связь между Rails и WCF

1 голос
/ 13 января 2010

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

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)

Ответы [ 3 ]

1 голос
/ 13 января 2010
Content-Length: 1
Content-Type: application/xml; charset=utf-8

Не является правильным ответом XML.

0 голосов
/ 13 января 2010

Загрузите 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);
0 голосов
/ 13 января 2010

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

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

format.xml { head :ok }

до

format.xml { head :ok, :content_type => 'text/plain' }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...