Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >WCF请求体有时是流,有时是缓冲的?

WCF请求体有时是流,有时是缓冲的?
EN

Stack Overflow用户
提问于 2011-10-09 14:20:04
回答 3查看 4.6K关注 0票数 4

我有一个WCF网络服务。每当收到请求时,我都试图通过实现MessageInspector并在AfterReceiveRequest()事件中进行日志记录来进行一些日志记录。

由于某种原因,每当我使用WCFTestClient.exe向the服务发送请求时,一切都正常。该消息将被记录下来,请求将如常进行。

但是,当我使用SOAPUI作为客户端向when服务发送请求时,请求消息的副本将导致主体只显示<body>... stream ...</body>,并且为了验证起见,它稍后无法作为XML文档加载。

我猜来自WCFTestClient.exe的请求是用缓冲消息体接收的,而来自SOAPUI的请求是作为流体接收的?这怎麽可能?

  • 有什么方法我可以写一些代码来安全地复制任何一个版本吗?我还没有弄清楚如何安全地复制流版本,因为CreateBufferedCopy()显然没有做到这一点。
  • 或者我可以将WCF配置为始终创建一个缓冲消息体,而不是一个流?

下面是我用来记录和复制请求消息的代码:

代码语言:javascript
运行
AI代码解释
复制
object IDispatchMessageInspector.AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
{
    try
    {

        MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue);
        request = buffer.CreateMessage();

        Message copy = buffer.CreateMessage();

        LogRequest(copy);

        ValidateMessage(ref request);
    }
    catch (Exception e)
    {
        throw new FaultException<>()...
    }
    return null;
}

如果请求消息来自带有流体的SOAPUI,则请求消息的副本无法加载到ValidateMessage()方法中的XML文档中。如果它来自具有缓冲体的WCFTestClient.exe,则它将成功地作为XML文档加载。

代码语言:javascript
运行
AI代码解释
复制
void validateMessage(ref System.ServiceModel.Channels.Message message)
{
    XmlDocument bodyDoc = new XmlDocument();
    //This load throws exception if request came from SOAPUI with streamed body...
    bodyDoc.Load(message.GetReaderAtBodyContents());
    ...
}

Load()方法引发的异常是:

System.InvalidOperationException {“指定节点不能作为此节点的有效子节点插入,因为指定的节点是错误的类型”}。 在System.Xml.XmlDocument.AppendChildForLoad(XmlNode newChild,XmlDocument doc,at System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc)在System.Xml.XmlLoader.Load(XmlDocument doc,XmlReader reader,Boolean ),System.Xml.XmlDocument.Load(XmlReader reader)

EN

回答 3

Stack Overflow用户

发布于 2011-10-24 06:44:06

我相信SOAPUI总是将它构建为Stream的消息请求发送出去。我不确定这是否可以通过SOAPUI测试上的代码或SOAPUI上的一些SOAPUI配置选项/文件来修改。

检查绑定的TransferMode属性,如解释的这里这里。对于发送缓冲请求和流请求的客户端,您可能会使用不同的自定义绑定来拥有多个端点。

希望这能有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2011-10-18 09:46:28

抛出的异常是什么?GetReaderAtBodyContents()返回的读取器位于主体内的第一个元素,而不是主体标记本身上。因此,加载消息的方式是不正确的,因为正文可能包含多个节点,在这种情况下,它将失败。

为了检查,您是否可以使用下面的代码来验证整个消息(副本)的内容,看看正文在从SOAPUI发送时是否包含完全相同的内容?

代码语言:javascript
运行
AI代码解释
复制
using (MemoryStream stream = new MemoryStream())
{
    using (XmlWriter writer = XmlWriter.Create(stream))
    {
        message.WriteMessage(writer);
        writer.Flush();
        stream.Position = 0;
    }
}

如果您想要体内的所有节点,您可能必须自己创建一个body节点。

票数 1
EN

Stack Overflow用户

发布于 2013-06-07 06:26:52

GetReaderAtBodyContents()方法返回主体的结束元素和soap信封的结束元素之间的任何字符。当XmlReader通过主体的结束元素时,线程中前面列出的异常将失败。

这里有更多信息:http://www.katlaconsulting.co.uk/blog/wcfxmlschemavalidation

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

https://stackoverflow.com/questions/7706944

复制
相关文章
Android中JNI与NDK
JNI的定义:Java Native Interface 也就是Java本地的接口。它的作用就是使Java与本地的其他语言(C C++)交互。
全栈程序员站长
2021/04/07
8440
Android NDK Makefile相关与示例
Android Studio 3之前,需要编写Android.mk和Application.mk文件。
AnRFDev
2021/02/01
8470
Android JNI(一)——NDK与JNI基础
Android 平台从一开就已经支持了C/C++了。我们知道Android的SDK主要是基于Java的,所以导致了在用Android SDK进行开发的工程师们都必须使用Java语言。不过,Google从一开始就说明Android也支持JNI编程方式,也就是第三方应用完成可以通过JNI调用自己的C动态度。于是NDK就应运而生了。
隔壁老李头
2018/08/30
4.5K0
Android JNI(一)——NDK与JNI基础
Android NDK 直播推流与引流
首先利用快直播 app (其他支持 RTMP 推流与引流的 app 亦可)和 ffplay.exe 对流媒体服务器进行测试。
字节流动
2021/06/09
4.7K0
Android NDK 直播推流与引流
Android NDK 初步
将手机通过USB连接到电脑,adb shell进入手机根目录,执行cat /proc/cpuinfo
AnRFDev
2021/02/01
1K0
Android NDK MediaCodec
Android 从 API 16 开始提供java层的 MediaCodec 视频硬解码接口;从 API 21,也就是Android 5.0 开始提供 native 层的 MediaCodec的接口。
字节流动
2021/04/23
3.2K0
Android NDK Hello
Android应用程序访问android的根文件系统中的文件时,由于应用程序的权限限制,无法访问这些文件,怎么办?
阳光岛主
2019/02/19
9450
Android NDK Hello
Android NDK Debug
前言:说真的Android NDK debug还是推荐lldb,gdb经常莫名其妙的不成功。不过下面的这个流程是谷歌官方建议的,还是有参考价值的。尤其是在App启动时Debug的流程。
望天
2020/02/13
2K0
【Android NDK 开发】Android NDK 下载 ( 下载指定历史版本 NDK | Android NDK r10e - 2015 年 5 月 )
进入到 ndk 下载的 " 修订历史记录 " 页面 https://developer.android.google.cn/ndk/downloads/revision_history ;
韩曙亮
2023/03/30
3.8K0
【Android NDK 开发】Android NDK 下载 ( 下载指定历史版本 NDK | Android NDK r10e - 2015 年 5 月 )
Flurry 分析 API 中文教程(Flurry Analytics API)
API 地址:https://api-metrics.flurry.com/public/v1/data/
他叫自己MR.张
2020/05/28
2.2K0
RetentionScience:与Swym合作集成应用程序
RetentionScience是基于人工智能的营销自动化平台,可为每个接触点的每个客户提供自定义体验。我们很高兴与Swym集成,此应用程序可以帮助用户通过愿望清单,补货警报和触发消息来创建自己的购物体验。Swym整合了Shopify、BigCommerce和Magento等领先的电子商务平台。
AiTechYun
2019/06/15
7640
android 之ndk开发
1、Android NDK简介 NDK全称为native development kit本地语言(C&C++)开发包。而对应的是经常接触的Android-SDK,(software development kit)软件开发包(只支持java语言开发)。 简单来说利用NDK,可以开发纯C&C++的代码,然后编译成库,让利用Android-SDK开发的Java程序调用。NDK开发的可以称之为底层开发或者jni(java  native interface)层开发,SDK开发可以称为上层开发。 2、为何要用NDK
xiangzhihong
2018/01/29
8840
android Ndk JNI 入门
相信很多人对于NDK 开发都是懵逼的,比如都知道把加密的逻辑以及密钥放在so文件中,但是你知道怎么生成so文件吗?你知道开发jni吗?你熟悉jni语法吗?怎么配置android studio 中的NDK环境?此时你一定很懵逼,我也是从这过来的,我不能帮助你开发Ndk,但是我可以让你不懵逼。
Anymarvel
2018/10/22
1.3K0
android Ndk JNI 入门
Android NDK开发入门
JNI (Java Native Interface英文缩写),译为Java本地接口。是Java众多开发技术中的一门技术,意在利用本地代码,为Java程序提供更高效、更灵活的拓展。尽管Java一贯以其良好的跨平台性而著称,但真正的跨平台非C/C++莫属,因为当前世上90%的系统都是基于C/C++编写的。同时,Java的跨平台是以牺牲效率换来对多种平台的兼容性,因而JNI就是这种跨平台的主流实现方式之一。
xiangzhihong
2022/11/30
1.7K0
Android NDk环境配置
概论 NDK全称是Native Development Kit,NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。NDK集成了交叉编译器(交叉编译器需要UNIX或LINUX系统环境),并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。 JNI的全称是Java Native Interface,它提供了若干的API实现了Java和其他语言的通信
xiangzhihong
2018/02/05
9820
Android NDk环境配置
Android NDK开发基础
NDK即Native Development Kit,是Android上用来开发c/c++的开发工具包。 安装步骤:developer.android.com/studio/proj…
没关系再继续努力
2021/12/03
2K0
Android 集成 Flutter | 与交互
使用 Flutter 已经有一段时间了,开发体验还是非常好的,但是一般我们在正式使用 Flutter 的时候很少会去创建一个纯 Flutter 项目,而是需要在之前的项目中已集成的方式来编写 Flutter。这篇文章将以如何在 Android 项目中集成 Flutter 和 如何在两者之间进行交互为主要内容。
345
2022/02/11
2K0
Android 集成 Flutter | 与交互
如何配置Seata以便与应用程序集成?
Seata是一款开源的分布式事务解决方案,可以为分布式应用程序提供事务管理和协调功能。为了实现Seata与应用程序的集成,需要进行如下几个步骤:
用户1289394
2023/09/11
3150
如何配置Seata以便与应用程序集成?
Android NDK编程(一)---NDK介绍及环境搭建
NDK全称为Native Development Kit,是Android的一个工具开发包,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。
Vaccae
2019/07/25
1.7K0
Android进阶-NDK技术
    在学习ndk技术前,我们需要先了解一下JNI(Java Native Interface)技术,JNI技术是一种实现Java代码和C/C++代码之间交互的技术,它提供了一组编程接口,使得Java程序可以调用C/C++代码并与其进行通信。通过JNI技术,开发者可以将C/C++代码嵌入Java项目中,并在Java代码中调用这些C/C++函数。那么,NDK技术和它有什么关系呢?NDK是一种用于开发Android应用程序的工具集,它允许开发者使用C/C++编写部分或全部的Android应用程序代码,以便提高性能和访问底层系统功能。这样看起来NDK技术和JNI技术是一回事,就是为了实现Java调用C/C++或C/C++调用Java。确实如此,用一句话概括它们之间的关系就是:开发者使用NDK技术在Android应用程序中编写C/C++代码,并将其编译成共享库(如.so文件),然后使用JNI技术在Java代码中加载并与这些C/C++代码进行交互。
故乡的樱花开了
2023/10/22
4730
Android进阶-NDK技术

相似问题

Android Flurry与admob广告的集成

12

NDK与Android Studio集成

11

将BlackBerry应用程序与Flurry集成

42

将duktape与android ndk集成

11

Flurry未集成到android应用程序中

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档