簡體   English   中英

在WCF REST服務POST方法中處理Json請求數據

[英]Handle Json Request data in WCF REST Service POST method

我正在使用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格式

WCF提供了許多可擴展點,其中一個是名為MessageInspector的功能。 您可以創建自定義消息檢查器以在將請求反序列化為C#對象之前接收請求。 並使用Raw請求數據執行任何操作。

為了實現它,您需要實現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("{0}Log{1: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)
    {
    }
}

這是完整的代碼片段要點 實際來源

現在,您需要將此消息檢查器添加到端點行為。 要實現這一點,您將實現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服務,那么您將通過配置注入新的Behavior。 為了實現這一點,您必須創建一個派生自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>

現在將此行為添加到Endpoint行為:

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

在端點中設置屬性behaviorConfiguration="defaultWebHttpBehavior"

這就是您的服務現在將在反序列化之前捕獲所有消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM