我在获取传递给我的 WCF 服务的参数中的值时遇到了问题。当我使用 WebInvoke 时,它们都显示为 null。但是,我将以下代码中的 WebInvoke 更改为 WebGet (并且在删除 bodystyle 之后)我收到了正确的值,所以我是假设我的 webinvoke 代码有问题。据我了解,我需要 bodystyle 是裸露的,以便传递原始值而不是 json 对象。然而,我不知所措,并且几个小时以来一直在尝试修改配置。我做错了什么?
这里是相关的接口(interface)和调用。
[ServiceContract]
public interface INLCInventory
{
[WebInvoke(
Method="POST",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare,
UriTemplate = "AddItemToShrinkageReport?ReportID={ReportID}&ItemID={ItemID}&Calculated={Calculated}&Actual={Actual}&Shrinkage={Shrinkage}")]
[OperationContract]
void AddItemToShrinkageReport(string ReportID, string ItemID, string Calculated, string Actual, string Shrinkage);
}
public void AddItemToShrinkageReport(string ReportID, string ItemID, string Calculated,
string Actual, string Shrinkage)
{
string test= ReportID;
}
这里是相关的 web.config 部分:
<system.serviceModel>
<services >
<service name="NLCInventory" >
<endpoint contract="INLCInventory" address=""
binding="webHttpBinding" behaviorConfiguration="webHttp" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceTypeBehaviors" >
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="webHttp">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
最后,这就是我用 jquery 调用网络服务的方式。
function AddItemToShrinkageReport() {
Parameters = 'ReportID=' + ($('#lblUsageReportID').html()) + '&ItemID=' + $('#ddlItems').val() + '&Calculated=' + $('#txtCalculated').val() + '&Actual=' + $('#txtActual').val() + '&Shrinkage=' + $('#txtShrinkage').val();
$.ajax({
url: "http://localhost/NLCInventory.svc/AddItemToShrinkageReport",
type: 'POST',
contentType: "application/json; charset=utf-8",
data: Parameters,
dataType: "json",
success: function (data) {
}
});
}
请您参考如下方法:
我之前使用的是 uritemplate,因为这是我在其他关于如何发布到 wcf 参数的 stackoverflow 答案中看到的。在做了一些研究后,我发现尽管有可能, 这样做是不好的做法。 如果您在 URL 中使用参数,那么您的数据就有被拦截的风险——当使用 https 时,URL 是纯文本格式,未加密。另一方面,POST 将“数据”发送到请求的正文,随后在使用 https 时对其进行加密。
为了使其正常工作,我必须进行以下更改:
UriTemplate 是不必要的,所以对于帖子只需删除它。
bodystyle 也需要更改为 wrapped-- 否则会抛出错误。
BodyStyle = WebMessageBodyStyle.WrappedRequest
在我的 jquery ajax 调用中,我需要将数据更改为 JSON。像这样:
data: '{"ReportID": "test", "ItemID": "test", "Calculated": "test", "Actual": "test", "Shrinkage": "test"}'
Content/Type 告诉网络服务器您发送的数据类型。在我的问题中,我实际上是在尝试发送纯文本,同时告诉服务器我正在向它发送 JSON。
