从 C# 中的 OperationContext 读取 JSON 格式的请求内容

Posted

技术标签:

【中文标题】从 C# 中的 OperationContext 读取 JSON 格式的请求内容【英文标题】:Read request content in JSON form from OperationContext in C# 【发布时间】:2018-06-03 22:18:28 【问题描述】:

我创建了如下 WCF RESTful 服务:

[OperationContract]
[WebInvoke(Method = "PUT",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "/Customer/customerID/profile")]
string PutCustomerProfileData(string customerID);

我正在使用 Postman 进行调试,并在 BODY 中传递 JSON 数据,如下所示:

"customerID":"RC0064211", "TermsAgreed":"true"

public string PutCustomerProfileData(string customerID)

    Message requestMessage = OperationContext.Current.RequestContext.RequestMessage;

RequestMessage中返回的内容如下:

<root type="object">
  <customerID type="string">RC0064211</customerID>
  <TermsAgreed type="string">true</TermsAgreed>
</root>

我想要这个 JSON 格式的请求正文。我可以拥有吗?如果不是,我可以为提到的RequestMessage 创建 JSON 字符串的其他方法是什么?

【问题讨论】:

您可以尝试在 Postman 中添加 Accept: application/json 标头。但老实说,这不是您的 PutCustomerProfileData 的实际代码 - 您要返回什么? 我也已经设置了该标题,但无论如何都没有帮助我。而对于PutCustomerProfileData,它只会返回带有正确消息的 JSON 格式。 PutCustomerProfileData 显然没有返回 JSON,因为您看到的是 XML。您能否粘贴PutCustomerProfileData 的完整代码(或至少与构造输出字符串相关的所有内容)。 【参考方案1】:

我尝试使用 DataContractDataMember,它对我有用。

下面是示例代码:

[OperationContract]
    [WebInvoke(Method = "PUT",
        RequestFormat = WebMessageFormat.Json,
        ResponseFormat = WebMessageFormat.Json,
        UriTemplate = "/Customer/customerID/verification")]
    string PutCustomerVerificationData(string customerID, CustomerVerification customerVerification);


[DataContract]
public class CustomerVerification

    [DataMember]
    public string PasswordHash  get; set; 

    [DataMember]
    public string PasswordSalt  get; set; 

然后我将该 DataContract 转换为 JSON 字符串并进一步使用它,如下所示:

public string PutCustomerVerificationData(string customerID, CustomerVerification customerVerification)

      javascriptSerializer js = new JavaScriptSerializer();
      string requestBody = js.Serialize(customerVerification);
      string serviceResponse = bllCustomerDetails.PutCustomerVerificationData(customerID, requestBody).Replace("\"", "'");
      return serviceResponse;

【讨论】:

【参考方案2】:

在要转换为 JSON 的成员变量上添加 [DataMember]

【讨论】:

如果可能的话,您能否提供一些代码示例,因为我不知道如何使用DataMember c-sharpcorner.com/UploadFile/0d4efc/data-contract-in-wcf - 你指的是同一个吗? 不,我在大约 6 个月前遇到了这个问题,所以 [DataMember] 为我修复了。【参考方案3】:

我实际上并没有完全理解这个问题,但作为一个建议,我可能会提出建议;

你应该像这样为 Json 设计你的 WebConfig;

    <services>
  <service name="Your Service Name"

    <endpoint address="" behaviorConfiguration="webHttp" binding="webHttpBinding"
              bindingConfiguration="webHttpBindingWithJsonP" contract="YourProjectName">

    </endpoint>
  </service>
</services>
<bindings>
  <webHttpBinding>
    <binding name="webHttpBindingWithJsonP" />

             </binding>
  </webHttpBinding>
</bindings>


<behaviors>
  <endpointBehaviors>
    <behavior name="webHttp">
      <webHttp />
    </behavior>
  </endpointBehaviors>

你的数据成员应该喜欢这个(只是例子);

   [DataContract]
public class Customer

   [DataMember]
    public int ID  get; set; 

    [DataMember]
    public int customerID  get; set; 


此外,您可以在 Fiddler 4 上尝试您的网络服务,您可以请求和响应 JSON 或您想要的内容。

【讨论】:

以上是关于从 C# 中的 OperationContext 读取 JSON 格式的请求内容的主要内容,如果未能解决你的问题,请参考以下文章

C# WCF 服务,阅读soapenv 标头安全部分

“OperationContext.Current.GetCallbackChannel”实际上是做啥的?

OperationContext

从请求上下文中添加和检索数据

识别 WCF 服务中的客户端

读取请求消息正文时出错