将JSON数据发布到WCF服务时出现错误415

时间:2013-05-28 12:33:36

标签: c# json wcf rest

我正在尝试将一些JSON数据发送到我在c#和wcf中创建的服务。在Fiddler中,我的POST请求如下

的Fiddler:

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“不支持的媒体类型”。我目前的想法是,在我的Projector服务类中,也许我应该创建一个响应对象并发回200个代码?!

2 个答案:

答案 0 :(得分:8)

要使WCF端点识别[WebInvoke](或[WebGet])注释,需要将其定义为WebHTTP端点(也称为REST端点) - 这意味着使用webHttpBindingwebHttp端点行为。由于您未在web.config中定义任何端点,因此它使用该方案的默认绑定,即BasicHttpBinding。具有该绑定的端点仅响应XML(SOAP)请求,这就是您在发送JSON请求时收到该错误的原因。

尝试替换web.config中的<system.serviceModel>部分,并根据需要定义端点:

  <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>

答案 1 :(得分:5)

问题很可能是您的服务方法需要2个参数。默认只能存在1个body参数。

您可以通过两种方式解决此问题。 第一种方式: 将 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(或在Windows2012 Update 2中将JSON粘贴为类)。 以下JSON

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

将导致以下类:

public class Record
{
    public string sn { get; set; }
    public int modelCode { get; set; }
}

之后你将不得不改变你的方法来接受这个类:

void RecordBreakdown(string sn, int modelCode);

为:

void RecordBreakdown(Record record);

之后,您现在应该能够将JSON发布到服务中。

希望这有帮助!

修改 从下面加入我的答案。

再次查看配置文件后,它看起来也像是绑定配置错误。 WCF的默认绑定是'bassicHttpBinding',它基本上使用SOAP 1.1。

由于您要使用JSON和RESTFul服务,因此您必须使用'webHttpBinding'。 Here is a link到我们一直用于RESTFul服务的基本配置。您可以在需要安全传输(f.e。:https)时将安全模式设置为传输。

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