我一直无法在传递给我的WCF服务的参数中获取值。当我使用WebInvoke时,它们都显示为null。但是,我将以下代码中的 WebInvoke 更改为 WebGet (并在删除了bodystyle后),我正确地接收了值 ,所以我是假设我的webinvoke代码有问题。根据我的理解,我需要bodystyle是裸的,以便传递原始值而不是json对象。然而,我不知所措,并且一直试图修补配置几个小时。我做错了什么?
这是相关的界面和电话。
[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调用Web服务的方式。
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) {
}
});
}
答案 0 :(得分:3)
之前我使用的是uritemplate,因为我在其他stackoverflow上看到了如何发布到wcf参数的答案。经过一些研究后我发现虽然有可能,这样做是不好的做法。 如果您在URL中使用参数,则会将数据置于拦截风险之下 - 使用https时,URL为plain / text且未加密。另一方面,POST会发送&#39;数据&#39;在使用https时随后加密 的请求正文。
为了使其发挥作用,我必须做出的改变是以下变化:
UriTemplate是不必要的,所以对于帖子只需删除它。
bodystyle也需要更改为wrap - 否则会抛出错误。
BodyStyle = WebMessageBodyStyle.WrappedRequest
在我的jquery ajax调用中,我需要将数据更改为JSON。像这样:
data: '{"ReportID": "test", "ItemID": "test", "Calculated": "test", "Actual": "test", "Shrinkage": "test"}'
内容/类型告诉网络服务器您发送的数据类型。在我的问题中,我基本上试图发送纯文本,同时告诉服务器我发送它JSON。
答案 1 :(得分:1)
设置
BodyStyle = WebMessageBodyStyle.Bare
要
BodyStyle = WebMessageBodyStyle.WrappedRequest
此外,我注意到$(n#39;#lblUsageReportID&#39; .html():
附近可能不需要额外的括号Parameters = 'ReportID=' + ($('#lblUsageReportID'.html())