2010-01-13 8 views
1

Je travaille actuellement sur une application WCF qui utilise un service Rails REST. Le problème est quand je fais une mise à jour ou supprimer la demande, Rails ne retourne pas XML, seul l'en-tête suivant:Communication entre Rails et 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 

Ceci est à prévoir et corriger pour autant que je sais. Toutefois, lors de l'appel de la demande de service suivante à partir de WCF, nous obtenons une exception ProtocolException (InnerException: XMLException inattendue fin du fichier).

[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); 

    } 

Les méthodes getCustomer et createCustomer fonctionnent sans problème, et UpdateCustomer DestroyCustomer jettent l'exception. Nous suspectons que c'est parce que XML est attendu comme une réponse.

Quelqu'un at-il une expérience avec Rails et WCF et connaît une solution/solution de contournement pour ce problème?

Pour être complet ici les détails d'exception:

ProtocolException { ". Il y a un problème avec le XML qui a été reçu à partir du réseau Voir exception interne pour plus de détails"}

XMLException (InnerException) { "fin de fichier inattendue."} 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

Sons comme le mauvais XML, pouvez-vous Sé Fiddler ou un autre outil pour capturer la réponse XML que vous envoyez de Rails? – Nate

+0

C'est le problème, il n'y a pas (et pas censé être) une réponse XML. La seule chose que l'action rails répond est un code d'état. – Ferdy

+0

Pourquoi définissez-vous un contrat de service WCF pour l'API distante de quelqu'un d'autre? Pourquoi ne pas simplement utiliser HttpClient pour faire la requête HTTP directement à l'interface Rails? –

Répondre

0

Je l'ai déjà trouvé, grâce à "Darin Dimitrov" et "Nate Bross". Ils avaient raison que WCF attende XML quand vous définissez le type de contenu à application/xml. J'ai changé le type de contenu en texte/plain (dans les rails) et cela fonctionne.

Modifier les éléments suivants dans vos rails de mise en forme:

format.xml { head :ok } 

à

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

est-ce pas une réponse XML valide.

+0

Bon point, cela concerne le code des rails par défaut. Nous préférons ne pas risquer le code des rails puisque cela est utilisé dans une autre application. Code d'action de destruction: respond_to do | format | format.html {redirect_to (customers_url)} format.xml {head: ok} end Cela génère l'exception dans le client WCF. Si l'action répond avec XML, comme get, ce n'est pas un problème. Code pour l'action show (get): respond_to do | format | format.html # nouveau.html.erb format.xml {render: xml => @customer} fin – Ferdy

0

Go télécharger le REST Starter Kit Preview 2 et jeter un oeil à l'espace de noms Microsoft.Http. En utilisant cette bibliothèque faire le POST à ​​l'interface Rails est aussi facile que cela:

var client = new HttpClient("http://railsinterface.com"); 
var content = HttpContent.CreateXmlSerializable<Customer>(customer); 
var response = client.Post("customers.xml",content);