首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用WCF REST服务POST方法处理Json请求数据

用WCF REST服务POST方法处理Json请求数据
EN

Stack Overflow用户
提问于 2015-10-26 10:52:05
回答 1查看 2.8K关注 0票数 2

我使用POST方法和对象作为输入param创建REST服务。当客户端请求无法获得实际的JSON数据时,客户端已经发布了。有没有办法从C# WCF服务中挖掘JSON代码。

我的代码:

代码语言:javascript
运行
复制
namespace ACTService
{
  public class AssortmentService : IAssortmentService
  {
    public void DeleteColor(DeleteColorContarct objdelcolor)
    {
         new Methods.ColorUI().DeleteColorDetails(objdelcolor);
    }
  }
}

我的界面是

代码语言:javascript
运行
复制
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格式

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-26 15:45:06

WCF提供了许多可扩展点,其中之一是一个名为MessageInspector的特性。您可以创建一个自定义消息检查器,以便在请求反序列化为C#对象之前接收它。尽你所能处理原始请求数据。

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

代码语言:javascript
运行
复制
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接口:

代码语言:javascript
运行
复制
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派生的额外类。

代码语言:javascript
运行
复制
public class InspectMessageBehaviorExtension : BehaviorExtensionElement
{
    public override Type BehaviorType
    {
        get { return typeof(InsepctMessageBehavior); }
    }

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

现在,在您的配置中,首先在system.servicemodel标记下注册行为:

代码语言:javascript
运行
复制
    <extensions>
      <behaviorExtensions>
        <add name="inspectMessageBehavior" 
type="WcfRestAuthentication.MessageInspector.InspectMessageBehaviorExtension, WcfRestAuthentication"/>
      </behaviorExtensions>
    </extensions>

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

代码语言:javascript
运行
复制
  <endpointBehaviors>
    <behavior name="defaultWebHttpBehavior">
      <inspectMessageBehavior/>
      <webHttp defaultOutgoingResponseFormat="Json"/>
    </behavior>
 </endpointBehaviors>

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

就这样,您的服务现在将捕获所有消息,然后再反序列化它们。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33343908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档