gpt4 book ai didi

wcf - 将 JSON 发送到 WCF Rest 服务 - 对象始终为 null

转载 作者:行者123 更新时间:2023-12-03 21:58:36 25 4
gpt4 key购买 nike

我正在尝试使用 REST、WCF 和 JSON(对所有这些技术来说都是新的)来让我的应用程序正常运行。我的“GET”工作正常。正是“POST”给我带来了问题。

正如您将在下面看到的,我使用 JSON.stringify“打包”我的 JSON,然后触发对 REST 资源的 POST。但是,当对象到达正在处理请求的 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"/>

这是契约(Contract):

    [OperationContract]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "customers")]
[return: MessageParameter(Name = "ContactCompany")]
ContactCompany AddContactCompany(ContactCompany ContactCompanyObject);

它是实现上述接口(interface)的方法,其中 ContactCompanyObject 为 null。

我到底做错了什么?请不要排除我的愚蠢行为。

进一步:我将 WebMessageBodyStyle 更改为 .Bare,这导致对象不为空...但对象的每个属性都为空。也就是说,包裹是我想要走的路。

如果有任何帮助,我将不胜感激。如果您需要更多信息,请告诉我。

更新

我从头开始了一个全新的项目 - 剥离了。

我得到了完全相同的结果 - 当 WCF 代码接收到该对象时,该对象为 null。

这是我在这个新测试项目中所做的事情。

WCF 契约(Contract):

(命名空间下: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 };
}

}

网站项目。服务.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。

我将非常感谢您的帮助。我为此浪费了很多时间。

最佳答案

如果您想要做的是Wrapped,那么您需要将请求包装在操作参数名称中:

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));
}
});

关于wcf - 将 JSON 发送到 WCF Rest 服务 - 对象始终为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6049454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com