2013-05-28 158 views
7

我正嘗試將一些JSON數據發送到我在c#和wcf中創建的服務。在我的提琴手POST請求如下:將JSON數據發佈到WCF服務時出現錯誤415

提琴手:

Request Header 
User-Agent: Fiddler 
Host: localhost 
Content-Length: 29 
Content-Type: application/json; charset=utf-8 

Request Body 
{sn:"2705", modelCode:1702 } 

下面是服務接口。使用該WebInvoke屬性來管理POST請求

[ServiceContract] 
public interface IProjectorService 
{ 
    [WebInvoke(Method="POST", UriTemplate="projectors", RequestFormat=WebMessageFormat.Json, ResponseFormat=WebMessageFormat.Json)] 
    [OperationContract] 
    void RecordBreakdown(Record record); 
} 

服務接口的實現需要到參數傳遞的變量和使用ADO將此數據發送到SQL數據庫。

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)] 
public partial class ProjectorService : IProjectorService 
{ 

    public void RecordBreakdown(Record record) 
    { 
     //ado code to send data to db (ie do record.SerialNumber... 
    }   
} 

POCO對象來表示多個參數

[DataContract] 
public class Record 
{  
    [DataMember] 
    public string SerialNumber { get; set; } 
    [DataMember] 
    public int ModelCode { get; set; } 
} 

.svc文件

<%@ ServiceHost Language="C#" Debug="true" Service="ProjectorService" CodeBehind="~/App_Code/ProjectorService.cs" %> 

Web.config文件:

<?xml version="1.0"?> 
<configuration> 
    <appSettings> 
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/> 
    </appSettings> 
    <system.web> 
    <compilation debug="true" targetFramework="4.5"/> 
    <httpRuntime targetFramework="4.5"/> 
    </system.web> 
    <system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <protocolMapping> 
     <add binding="basicHttpsBinding" scheme="https"/> 
    </protocolMapping> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    <directoryBrowse enabled="true"/> 
    </system.webServer> 
</configuration> 

在小提琴手,當我點擊「執行「,我收到錯誤415」不支持的媒體類型PE」。我目前的想法是,在我的Projector服務類中,也許我應該創建一個響應對象併發回200代碼?!

回答

8

對於WCF端點識別[WebInvoke](或[WebGet])註釋,它需要被定義爲一個WebHTTP端點(也稱爲REST端點) - 這意味着使用webHttpBindingwebHttp端點行爲。由於您沒有在web.config中定義任何端點,因此它使用該方案的默認綁定,即BasicHttpBinding。使用該綁定的端點僅響應XML(SOAP)請求,這就是爲什麼發送JSON請求時出現此錯誤的原因。

嘗試更換您的<system.serviceModel>部分在你的web.config,和你需要它應該定義端點:

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="Web"> 
      <webHttp/> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <services> 
     <service name="ProjectorService"> 
     <endpoint address="" 
        behaviorConfiguration="Web" 
        binding="webHttpBinding" 
        contract="IProjectorService" /> 
     </service> 
    </services> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/> 
    </system.serviceModel> 
+0

多數民衆贊成在工作。我認爲web綁定是使用svc文件中的工廠方法自動生成的(我還沒有包含它)。除了這些更改,我需要將'BodyStyle = WebMessageBodyStyle.Bare'添加到服務方法中,因爲JSON數據未包含在另一個對象中。 – beaumondo

5

問題很可能是您的服務方法需要2個參數。默認只有1個身體參數可以存在。

你可以通過兩種方式解決這個問題。 第一種方式: 添加BodyStyle = WebMessageBodyStyle.Wrapped您WebInvoke屬性,像這樣:

[WebInvoke(Method = "POST", UriTemplate = "projectors", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] 
void RecordBreakdown(string sn, int modelCode); 

方式二:爲POST數據創建一個類。例如,您可以爲想要作爲JSON發佈到服務的所有變量創建一個類。要從JSON創建類,您可以使用Json2CSharp(或將JSON粘貼爲VS2012 Update 2中的類)。 以下JSON

{"sn":2705, "modelCode":1702 } 

會導致下面的類:

之後,你將不得不改變你的方法接受這一類,像這樣:

void RecordBreakdown(string sn, int modelCode); 

到:

void RecordBreakdown(Record record); 

之後,你現在應該可以發佈JSON到服務。

希望這會有所幫助!

編輯: 加入我的答案從下面這個。

再次查看您的配置文件後,它也看起來像一個綁定錯誤配置。WCF的默認綁定是基本上使用SOAP 1.1的'bassicHttpBinding'。

既然你想使用JSON和RESTFul服務,你將不得不使用'webHttpBinding'。 Here is a link到我們總是用於我們的RESTFul服務的基本配置。當需要安全傳輸(f.e .: https)時,您可以將安全模式設置爲傳輸。

<security mode="Transport"></security> 
+0

我曾嘗試加入BodyStyle = WebMessageBodyStyle.Wrapped,但並未奏效。仍然收到415錯誤。我也刪除了多個參數,並根據您的建議創建了一個新類,我更喜歡這種方式,我認爲我已更新問題以顯示這些更改,但這也不起作用,即使仍然看到錯誤415. – beaumondo

+1

再次查看你的配置文件,它也看起來像一個綁定錯誤配置。 WCF的默認綁定是基本上使用SOAP 1.1的'bassicHttpBinding'。既然你想使用JSON和RESTFul服務,你將不得不使用'webHttpBinding'。我已經包含了一個鏈接,指向我們通常用於RESTFul服務的基本配置。 :)信息:[鏈接](http://pastebin.com/Yj4bdrHp) – Xciles

相關問題