2011-11-08 98 views
2

當我針對創建的RESTful Web服務運行客戶端時,我得到一個{"The remote server returned an error: (415) Unsupported Media Type."}。內容類型在客戶端中是正確的。該服務在vs 2010中的WCF測試客戶端下正確運行。我認爲我的問題出現在我的客戶端代碼中,或者我發送/格式化XML的方式。任何意見是極大的讚賞。RESTful WCF返回錯誤代碼415?

使用VS2010,.NET4

Web服務代碼:

public Charge GetCharge(Charge aCharge) 
    { 
     return aCharge; 
    } 

[ServiceContract(Namespace = "http://www.test.com/Charge")] 
public interface IService1 
{ 

    [OperationContract] 
    [WebInvoke(Method = "POST", UriTemplate = "getcharge", 
     RequestFormat = WebMessageFormat.Xml, 
     ResponseFormat = WebMessageFormat.Xml, 
     BodyStyle = WebMessageBodyStyle.Bare)] 
    Charge GetCharge(Charge aCharge); 
} 


// Use a data contract as illustrated in the sample below to add composite types to service operations. 
[DataContract(Namespace = "http://www.test.com/Charge")] 
public class Charge 
{ 
    [DataMember] 
    public string ID 
    { 
     get; 
     set; 
    } 

    [DataMember] 
    public string Hours 
    { 
     get; 
     set; 
    } 


    [DataMember] 
    public string Comment 
    { 
     get; 
     set; 
    } 

    [DataMember] 
    public string DateT 
    { 
     get; 
     set; 
    } 
} 

客戶端代碼:

HttpWebRequest req = null; 
     HttpWebResponse res = null; 
     try 
     { 
      string url = "http://localhost:1657/Service1.svc/getcharge"; 
      req = (HttpWebRequest)WebRequest.Create(url); 
      req.Method = "POST"; 
      req.ContentType = "application/xml"; 
      req.Timeout = 30000; 
      req.Headers.Add("SOAPAction", url); 

      System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument(); 
      xmlDoc.XmlResolver = null; 
      xmlDoc.Load(@"c:\file\benCharge.xml"); 
      string sXML = xmlDoc.InnerXml; 
      req.ContentLength = sXML.Length; 
      System.IO.StreamWriter sw = new System.IO.StreamWriter(req.GetRequestStream()); 
      sw.Write(sXML); 
      sw.Close(); 

      res = (HttpWebResponse)req.GetResponse(); 

     } 
     catch (Exception ex) 
     { 
      System.Console.WriteLine(ex.Message); 
     } 

客戶XML:

<Charge xmlns="http://www.test.com/Charge"><ID>1</ID><Hours>10</Hours><Comment>Mobile app development</Comment><DateT>01/01/2011</DateT></Charge> 

回答

1

您可以在客戶端上創建相同的數據協定,而不是從xml文件中讀取創建對象將其轉換爲字節數組並將其發佈到流並查看您的請求是否成功。

請務必使用Fiddler監控您的請求。

我想錯誤的原因是你的xml文件。您只需確保使用DataContractSerializer反序列化時的xml以與您的對象相同的格式返回。

一些代碼來發布使用HttpWebRequest對象:

byte[] requestBodyBytes = ToByteArrayUsingDataContractSer(requestBody); 
       request.ContentLength = requestBodyBytes.Length; 
       using (Stream postStream = request.GetRequestStream()) 
        postStream.Write(requestBodyBytes, 0, requestBodyBytes.Length); 


private static byte[] ToByteArrayUsingDataContractSer<T>(T requestBody) 
     { 
      byte[] bytes = null; 
      var serializer1 = new DataContractSerializer(typeof(T)); 
      var ms1 = new MemoryStream(); 
      serializer1.WriteObject(ms1, requestBody); 
      ms1.Position = 0; 
      var reader = new StreamReader(ms1); 
      bytes = ms1.ToArray(); 
      return bytes; 
     } 

我從你的客戶想你是不是在消息傳遞因爲它需要的郵件正文的一部分。希望以上信息對您有所幫助。

0

你檢查的實際消息電線usi上的標頭ng Fiddler?同時檢查ContentType(即您要發送的內容)和Accept(接受),您想要返回的內容。任何一種MIME類型都可能導致此問題。

0

我有點困惑 - 你說這是一個RESTful服務,但後來在你的文章中你展示了一些名爲SOAP的東西 - SOAP和REST不一樣!

使用FiddlerWireshark查看您的客戶端和工作客戶端之間的差異,然後相應地更改。

對於類似的配置工作的源代碼像你看到http://social.msdn.microsoft.com/Forums/en/wcf/thread/d11a7997-d60b-4895-8f69-9ef2175087e2

基本上他們有一個charset加入ContentType,他們不會在頭部使用SOAPAction