在 WCF REST 服务 POST 方法中处理 Json 请求数据

Posted

技术标签:

【中文标题】在 WCF REST 服务 POST 方法中处理 Json 请求数据【英文标题】:Handle Json Request data in WCF REST Service POST method 【发布时间】:2016-01-25 10:38:59 【问题描述】:

我正在使用 POST 方法和 OBJECT 作为输入参数创建 REST 服务。虽然客户端请求无法获取客户端已发布的实际 JSON 数据。有没有办法从 C# WCF 服务中挖掘 JSON 代码。

我的代码:

namespace ACTService

  public class AssortmentService : IAssortmentService
  
    public void DeleteColor(DeleteColorContarct objdelcolor)
    
         new Methods.ColorUI().DeleteColorDetails(objdelcolor);
    
  

和我的界面一样

namespace ACTService

  [ServiceContract]
  public interface IAssortmentService
  
    [OperationContract]
    [WebInvoke(UriTemplate = "DeleteColor", Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json,BodyStyle=WebMessageBodyStyle.Wrapped)]
    void DeleteColor(DeleteColorContarct objColor);
  

我需要访问其他类文件ColorUI

中的JSON格式

【问题讨论】:

所以对象,objColor 和 objdelcolor 是正确的 JSON 格式,你只需要在 C# 中解析它们?或者我在这里遗漏了一些东西 不,它们是正确的 C# 格式。我只需要客户端发送给我的实际请求消息(JSON 格式)。 【参考方案1】:

WCF 提供了很多可扩展点,其中之一是名为 MessageInspector 的功能。您可以创建自定义消息检查器以在将请求反序列化为 C# 对象之前接收请求。并使用原始请求数据尽你所能。

为了实现它,您需要实现System.ServiceModel.Dispatcher.IDispatchMessageInspector 接口,如下所示:

public class IncomingMessageLogger : IDispatchMessageInspector

    const string MessageLogFolder = @"c:\temp\";
    static int messageLogFileIndex = 0;

    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
    
        string messageFileName = string.Format("0Log1:000_Incoming.txt", MessageLogFolder, Interlocked.Increment(ref messageLogFileIndex));
        Uri requestUri = request.Headers.To;

        HttpRequestMessageProperty httpReq = (HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name];

        // Decode the message from request and do whatever you want to do.
        string jsonMessage = this.MessageToString(ref request);

        return requestUri;
    

    public void BeforeSendReply(ref Message reply, object correlationState)
    
    

这是完整的code snippet gist。 Actual source.

现在您需要将此消息检查器添加到端点行为。要实现这一点,您将实现System.ServiceModel.Description.IEndpointBehavior 接口,如下所示:

public class InsepctMessageBehavior : IEndpointBehavior

    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
    
    

    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    
    

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
    
        endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new IncomingMessageLogger());
    

    public void Validate(ServiceEndpoint endpoint)
    
    

现在,如果您使用自托管,即以编程方式托管您的服务,您可以直接将此新实现的行为附加到您的服务端点。例如

endpoint.Behaviors.Add(new IncomingMessageLogger());

但是,如果您在 IIS 中托管了 WCF Rest 服务,那么您将通过配置注入新的行为。为了实现这一点,您必须创建一个从BehaviorExtensionElement 派生的附加类:

public class InspectMessageBehaviorExtension : BehaviorExtensionElement

    public override Type BehaviorType
    
        get  return typeof(InsepctMessageBehavior); 
    

    protected override object CreateBehavior()
    
        return new InsepctMessageBehavior();
    

现在在你的配置中首先注册system.servicemodel标签下的行为:

    <extensions>
      <behaviorExtensions>
        <add name="inspectMessageBehavior" 
type="WcfRestAuthentication.MessageInspector.InspectMessageBehaviorExtension, WcfRestAuthentication"/>
      </behaviorExtensions>
    </extensions>

现在将此行为添加到端点行为中:

  <endpointBehaviors>
    <behavior name="defaultWebHttpBehavior">
      <inspectMessageBehavior/>
      <webHttp defaultOutgoingResponseFormat="Json"/>
    </behavior>
 </endpointBehaviors>

在您的端点中设置属性behaviorConfiguration="defaultWebHttpBehavior"

就是这样,您的服务现在将在反序列化之前捕获所有消息。

【讨论】:

以上是关于在 WCF REST 服务 POST 方法中处理 Json 请求数据的主要内容,如果未能解决你的问题,请参考以下文章

自托管 WCF REST 服务 JSON POST 方法不允许

wcf REST 服务和 JQuery Ajax Post:方法不允许

WCF REST 服务为 POST 返回 405

Angular 4 POST 到 WCF REST 服务返回 NULL 响应

WCF Rest POST 方法接受 JSON 和 XML

WCF REST的POST时候报400错误是怎么回事