所有参数的WCF WebInvoke POST为null

时间:2014-07-15 15:33:49

标签: c# asp.net web-services wcf

我一直无法在传递给我的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) {

    }
});

}

2 个答案:

答案 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())