Skip to main content
 首页 » 编程设计

c#之所有参数的 WCF WebInvoke POST null

2024年02月06日31TianFang

我在获取传递给我的 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。