gpt4 book ai didi

c# - WCF REST 网络服务 : getting request data when the content is not xml valid

转载 作者:数据小太阳 更新时间:2023-10-29 02:08:06 26 4
gpt4 key购买 nike

我有一个 WCF REST 网络服务操作,它使用包含来自 PHP 网站的模式固定 XML 内容的 POST 请求调用。 Web 服务跟踪上有滚动文件日志,以跟踪处理请求时的任何错误。

有时无法处理传入消息,因为 POST 请求中的 xml 无效(例如缺少结束元素)。为了解该问题,我希望在我的日志中将来自请求的源 XML 作为原始字符串查看。

我确实尝试过实现一个 IDispatchMessageInspector,但每当我尝试访问请求正文时,我都会(正确地)得到一个 XmlException。

System.ServiceModel.MessageLogging 上添加监听器对于这种情况也不起作用。

有什么办法可以实现吗?

最佳答案

我终于按照 this post 中的描述使用了反射.

我的问题是我没有正确执行此操作的内部类型。通过 ILSpy,我找到了我需要的类型。

我现在使用 IDispatchMessageInspector 进行日志记录,如下所示:

 public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
{
// Loggin incoming message
log.WriteLine("Incoming message :");

MessageEncoder encoder = OperationContext.Current.IncomingMessageProperties.Encoder;
string contentType = encoder.ContentType;
Match characterSetMatch = re.Match(contentType);

if (!characterSetMatch.Success)
{
log.WriteLine("Failed to extract character set from request content type: " + contentType);
}
else
{
try
{
Type bufferedMessageType = typeof(Message).Assembly.GetType("System.ServiceModel.Channels.BufferedMessage");
Type bufferedMessageData = typeof(Message).Assembly.GetType("System.ServiceModel.Channels.BufferedMessageData");

string characterSet = characterSetMatch.Groups[0].Value;

object messageData = bufferedMessageType.InvokeMember("MessageData",
BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetProperty,
null, request, null);

object buffer = bufferedMessageData.InvokeMember("Buffer",
BindingFlags.Instance | BindingFlags.Public | BindingFlags.GetProperty,
null, messageData, null);


ArraySegment<byte> arrayBuffer = (ArraySegment<byte>)buffer;
Encoding encoding = Encoding.GetEncoding(characterSet);

string requestMessage = encoding.GetString(arrayBuffer.Array, arrayBuffer.Offset, arrayBuffer.Count);

log.WriteLine(requestMessage);
}
catch(Exception e)
{
log.WriteLine("Error in decoding incoming message");
log.WriteException(e);
}

}

return null;
}

找到我用来获取内容类型的正则表达式 here :

Regex re = new Regex("(?<=charset=)[^;]*");

关于c# - WCF REST 网络服务 : getting request data when the content is not xml valid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32630897/

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