2013-04-30 156 views
2

我想從幾天開始使用wcf寧靜的服務,但它給了我不好的reqeust。請幫助我。WCF Restful post服務退貨不良請求(400)

這裏是我的配置文件

<system.serviceModel> 

<bindings> 
    <webHttpBinding> 
    <binding name="state" allowCookies="true"> 
     <security mode="None"></security> 

    </binding> 
    </webHttpBinding> 
</bindings> 
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="ServiceBehaviour"> 
     <serviceMetadata httpGetEnabled="True"/> 
     <serviceDebug includeExceptionDetailInFaults="True"/> 
    </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
    <behavior name="web"> 
     <webHttp/> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 
<services> 
    <service behaviorConfiguration="ServiceBehaviour" name="RESTFUL_DEMO.Web.services.Calc"> 
    <endpoint address="" bindingConfiguration="state" binding="webHttpBinding" name="Http" contract="RESTFUL_DEMO.Web.services.ICalc"/> 
    <endpoint address="abcd" binding="wsHttpBinding" name="wsHttp" contract="RESTFUL_DEMO.Web.services.ICalc"/> 

    <endpoint address="mex" binding="mexHttpBinding" name="MEX" contract="IMetadataExchange"/> 

    </service> 
</services> 

我的服務合同接口和datacontract如下。

[ServiceContract(SessionMode = SessionMode.Allowed)] 
[XmlSerializerFormat] 
public interface ICalc 
{ 
    [OperationContract] 
    [WebInvoke(UriTemplate = "dowork", Method = "POST", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)] 
    int DoWork(Enroll a); 
} 


[DataContract] 
public class Enroll 
{ 
    public Enroll() 
    { 

    } 
    public Enroll(string Avalue) 
    { 
     this.Avalue = Avalue; 
    } 
    [DataMember(IsRequired = true)] 
    public string Avalue 
    { 
     get; 
     set; 
    } 


} 

我的代碼來使用服務如下

HttpWebRequest request = WebRequest.Create("http://localhost/RESTFUL_DEMO.Web/services/Calc.svc/dowork") as HttpWebRequest; 
XmlDocument doc = new XmlDocument(); 
     doc.Load(@"d:\test.xml"); 
     string sXML = doc.InnerXml; 
     request.ContentLength = sXML.Length; 
     request.ContentType = "test/xml; charset=utf-8"; 
     var sw = new StreamWriter(request.GetRequestStream()); 
     sw.Write(sXML); 
     sw.Close(); 
     WebResponse response = request.GetResponse(); 
     StreamReader stream = new StreamReader(response.GetResponseStream()); 
     String result = stream.ReadToEnd(); 
+0

'request.ContentType = 「測試/ XML的,字符集= UTF-8」;'應該是'request.ContentType = 「文本/ XML的,字符集= UTF-8」; ' – Jammer 2013-04-30 13:30:43

+0

'sXML.Length'可能與寫入流的字節長度不同,如果它包含非ascii字符的話。 – I4V 2013-04-30 13:32:52

回答

2

你犯了一個小錯誤,而使用REST服務。您已指定請求的ContentType爲test/xml; charset = utf-8,但它應該是text/xml或application/xml。

request.ContentType = "text/xml; charset=utf-8"; 

,或者它應該是

request.ContentType = "application/xml"; 
-2

獲取該服務啓動並運行在Visual Studio中的一個實例,然後使用Test Client以確保服務正在運行確定。

打開VS的新實例並添加一個服務引用,它將爲您構建客戶端代碼,然後使用此客戶端調用該服務。

+0

WCF測試客戶端不適用於WCF Restful端點。這將消耗與WSHttpBinding端點,這將無助於解決原來的問題。請參閱http://blogs.msdn.com/b/carlosfigueira/archive/2012/03/26/mixing-add-service-reference-and-wcf-web-http-aka-rest-endpoint-does-未work.aspx。 – carlosfigueira 2013-04-30 16:09:22

+0

Sla額頭,當然。 – Jammer 2013-04-30 16:18:15

0

就我而言,我的服務接口IBookService.cs方法是像下面

[OperationContract] 
[WebInvoke(Method = "PUT", UriTemplate = "/Book", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] 
IList<Book> UpdateBook(Book book); 

和我的客戶,我給

client.Headers[HttpRequestHeader.ContentType] = "text/xml"; 

代替

client.Headers[HttpRequestHeader.ContentType] = "text/json"; 

那解決了我的問題。請參閱下面我完整的解決方案

private void btnUpdateBook_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      using(WebClient client = new WebClient()) 
      { 
       client.Headers[HttpRequestHeader.ContentType] = "text/json";     
       Uri uri = new Uri(@"http://localhost:8085/BookService/Book"); 

       Book updateBook = new Book() { Id = 3, Name = "UpdateBook Name 3", Price = 77.77f }; 

       MemoryStream requestStream = new MemoryStream(); 
       DataContractJsonSerializer requestSerializer = new DataContractJsonSerializer(typeof(Book)); 
       requestSerializer.WriteObject(requestStream, updateBook); 

       client.UploadDataCompleted += OnUpdateBookCompleted; 
       client.UploadDataAsync(uri, "PUT",requestStream.ToArray()); 
      } 
     } 
     catch (Exception ex) 
     { 

     } 
    } 

    void OnUpdateBookCompleted(object sender, UploadDataCompletedEventArgs e) 
    { 
     byte[] result = e.Result as byte[]; 
     MemoryStream responseStream = new MemoryStream(result); 
     DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(IList<Book>)); 
     IList<Book> books = (IList<Book>)serializer.ReadObject(responseStream); 

     bindingSource1.DataSource = books; 
     dvBooks.DataSource = bindingSource1; 
    }