从 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】:
我尝试使用 DataContract
和 DataMember
,它对我有用。
下面是示例代码:
[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 格式的请求内容的主要内容,如果未能解决你的问题,请参考以下文章