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

标签 c# xml wcf rest

我有一个 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/

相关文章:

c# - SqlBulkCopy - 哪个数据库导致异常?

c# - 使用 Sync Framework 自定义架构

c# - 在 C# 中存储矩阵值的快速且有用的方法

c# - Directory.GetDirectories 返回带有 *.* 模式的错误结果

c# - 订阅一个类的多个实例的事件

css - 有没有可以实时显示转换的 XML/XSL 编辑器?

xml - 如果节点有某些子节点,则拆分该节点

c# - 使用 C# 将文件名封装在 app.config 文件中

WCF:我需要用动态命名空间替换 "http://tempuri.org/"吗?

wcf - 有了 WCF 为什么还需要服务总线?