我试图通过使用REST,WCF和JSON(所有这些技术的新功能)使我的应用程序正常工作。我的“ GET”工作正常。是导致我出现问题的“ POST”。
正如您将在下面看到的那样,我使用JSON.stringify“打包” JSON,然后将POST启动到REST资源。但是,当对象进入处理请求的WCF方法时,该对象始终为null。
这是代码:
$.ajax({ type: "POST", dataType: "json", url: "Services/ContactCompanyService.svc/contactcompanies/customers", contentType: "application/json; charset=utf-8", data: JSON.stringify({ contactcompany: newCustomer }), success: function (html) { alert(html); } });
这是配置的东西:
<services> <service behaviorConfiguration="ServiceBehaviour" name="ContactCompanyService"> <endpoint address="contactcompanies" behaviorConfiguration="web" binding="webHttpBinding" contract="IContactCompanyService"/> </service> </services> <behaviors> <endpointBehaviors> <behavior name="web"> <webHttp/> <enableWebScript/> </behavior> </endpointBehaviors> <serviceBehaviors> <behavior name="ServiceBehaviour"> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> <behavior name=""> <serviceMetadata httpGetEnabled="true"/> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> </behaviors> <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true"/>
这是合同:
[OperationContract] [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "customers")] [return: MessageParameter(Name = "ContactCompany")] ContactCompany AddContactCompany(ContactCompany ContactCompanyObject);
这是实现上述接口的方法,其中ContactCompanyObject为null。
我到底在做什么错?请不要排除我的愚蠢。
进一步:我将WebMessageBodyStyle更改为.Bare,这导致对象不为null …但该对象的EVERY属性均为null。就是说,包裹是我想走的路。
我将不胜感激。让我知道您是否需要更多信息。
更新
我从头开始了一个全新的项目-剥离了。
我得到的结果完全相同-当WCF代码接收到该对象时,该对象为null。
这是我在这个新测试项目中所做的事情。
WCF合同:
(在名称空间下:NullTestService
[ServiceContract] public interface IService1 { [OperationContract] [WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "NullTestPost")] [return: MessageParameter(Name = "NullTestType")] NullTestType GettMethod(); [OperationContract] [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "NullTestPost")] [return: MessageParameter(Name = "NullTestType")] NullTestType PostMethod(NullTestType NullTestTypeObject); } [DataContract] public class NullTestType { [DataMember] public string NullTestString { get; set; } [DataMember] public int NullTestInt { get; set; } }
服务实现:(相同的名称空间)
public class Service1 : IService1 { public NullTestType PostMethod(NullTestType NullTestTypeObject) { return NullTestTypeObject; } public NullTestType GettMethod() { return new NullTestType { NullTestString = "Returned String", NullTestInt = 25 }; } }
网站项目。Service.svc:
<%@ ServiceHost Service="NullTestService.Service1" %>
Web项目中的web.config:
<system.serviceModel> <services> <service behaviorConfiguration="ServiceBehaviour" name="NullTestService.Service1"> <endpoint address="nulltestaddress" behaviorConfiguration="web" binding="webHttpBinding" contract="NullTestService.IService1"/> </service> </services> <behaviors> <endpointBehaviors> <behavior name="web"> <webHttp/> </behavior> </endpointBehaviors> <serviceBehaviors> <behavior name="ServiceBehaviour"> <serviceMetadata httpGetEnabled="false" /> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel>
最后是Web项目中的jQuery:
$(function () { // $.ajax({ // type: "GET", // url: "http://localhost:8080/TestWeb/Service.svc/nulltestaddress/nulltestpost", // success: alertResult // }); alert('about to do it'); $.ajax({ type: "POST", url: "http://localhost:8080/TestWeb/Service.svc/nulltestaddress/nulltestpost", dataType: "json", contentType: "application/json; charset=utf-8", data: '{"NullTestType":{"NullTestString":"This is a post string","NullTestInt":25}}', success: alertResult }); }); function alertResult(data) { alert(data.NullTestType.NullTestString); }
所以。(注释掉)GET可以正常工作并返回JSON。POST不这样做。在线上:
public NullTestType PostMethod(NullTestType NullTestTypeObject) { return NullTestTypeObject; }
(“返回”行)NullTestTypeObject始终为NULL。
我将非常感谢您的帮助。我为此花了很多时间。
如果要包装,则需要将请求包装在操作参数名称中:
var input = { "ContactCompanyObject" : newCustomer }; $.ajax({ data: input ... });
或对于第二个示例,如果将ajax调用更改为如下所示,则应获得预期的结果:
var input = { NullTestTypeObject: { NullTestString: "Hello", NullTestInt: 123} }; alert("Input: " + JSON.stringify(input)); $.ajax({ type: "POST", url: "./Service1.svc/nulltestaddress/NullTestPost", contentType: "application/json", data: JSON.stringify(input), success: function (result) { alert("POST result: " + JSON.stringify(result)); } });