gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:40:30 24 4
gpt4 key购买 nike

我正在使用 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# 对象之前接收请求。并尽你所能处理原始请求数据。

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

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)
{
}
}

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

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

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 服务,那么您将通过配置注入(inject)新的行为。为了实现这一点,您必须创建一个从 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"

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

关于c# - 在 WCF REST 服务 POST 方法中处理 Json 请求数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33343908/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com