我正在尝试将一些JSON数据发送到我在c#和wcf中创建的服务.在Fiddler中,我的POST请求如下
小提琴手:
Request Header
User-Agent: Fiddler
Host: localhost
Content-Length: 29
Content-Type: application/json; charset=utf-8
Request Body
{sn:"2705", modelCode:1702 }
Run Code Online (Sandbox Code Playgroud)
以下是服务界面.它使用WebInvoke属性来管理POST请求
[ServiceContract]
public interface IProjectorService
{
[WebInvoke(Method="POST", UriTemplate="projectors", RequestFormat=WebMessageFormat.Json, ResponseFormat=WebMessageFormat.Json )]
[OperationContract]
void RecordBreakdown(Record record);
}
Run Code Online (Sandbox Code Playgroud)
服务接口的实现将传入的参数传递给参数,并使用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...
}
}
Run Code Online (Sandbox Code Playgroud)
POCO对象表示多个参数
[DataContract]
public class Record
{
[DataMember]
public string SerialNumber { get; set; }
[DataMember]
public int ModelCode { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
.svc文件
<%@ ServiceHost Language="C#" Debug="true" Service="ProjectorService" CodeBehind="~/App_Code/ProjectorService.cs" %>
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
在小提琴手中,当我点击"执行"时,我收到错误415"不支持的媒体类型".我目前的想法是,在我的Projector服务类中,也许我应该创建一个响应对象并发回200个代码?!
要使WCF端点识别[WebInvoke](或[WebGet])注释,需要将其定义为WebHTTP端点(也称为REST端点) - 这意味着使用端点行为webHttpBinding和webHttp端点行为.由于您没有在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>
Run Code Online (Sandbox Code Playgroud)
问题很可能是您的服务方法需要2个参数.默认只能存在1个body参数.
您可以通过两种方式解决此问题.第一种方法:将BodyStyle = WebMessageBodyStyle.Wrap添加到WebInvoke属性中,如下所示:
[WebInvoke(Method = "POST", UriTemplate = "projectors", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
void RecordBreakdown(string sn, int modelCode);
Run Code Online (Sandbox Code Playgroud)
第二种方法:为POST数据创建一个类.例如,您可以为要作为JSON发布到服务的所有变量创建一个类.要从JSON创建类,您可以使用Json2CSharp(或将VS JSON作为VS2012 Update 2中的类).以下JSON
{"sn":2705, "modelCode":1702 }
Run Code Online (Sandbox Code Playgroud)
将导致以下类:
public class Record
{
public string sn { get; set; }
public int modelCode { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
之后你将不得不改变你的方法来接受这个类,如下所示:
void RecordBreakdown(string sn, int modelCode);
Run Code Online (Sandbox Code Playgroud)
至:
void RecordBreakdown(Record record);
Run Code Online (Sandbox Code Playgroud)
之后,您现在应该能够将JSON发布到服务中.
希望这可以帮助!
编辑: 从下面加入我的答案.
再次查看配置文件后,它看起来也像绑定配置错误.WCF的默认绑定是'bassicHttpBinding',它基本上使用SOAP 1.1.
由于您要使用JSON和RESTFul服务,因此您必须使用'webHttpBinding'. 以下是我们一直用于RESTFul服务的基本配置的链接.您可以在需要安全传输(fe:https)时将安全模式设置为传输.
<security mode="Transport"></security>
Run Code Online (Sandbox Code Playgroud)