您可以更改 WCF 客户端请求的 XML 声明吗?如果是这样,怎么办?

2024-01-15

我正在编写一个库来使用第三方 Web 服务(我显然无法更改)。该库当前设置为 .Net Standard 2.0,以便我可以在当前的应用程序 (.Net Framework 4.6.2) 以及未来可能在 .Net Core 中开发的项目中使用它。这不是一个要求,但如果可能的话我想保持这种方式。

我使用 Microsoft WCF Web 服务参考提供程序实用程序从 WSDL 生成代理类。所以我的基本客户端工厂如下所示:

public static class AuthenticationClientFactory
{
    public static AuthenticationClient CreateNew()
    {
        //Specify the binding to be used for the client.
        BasicHttpsBinding binding = new BasicHttpsBinding();

        //Specify the address to be used for the client.
        EndpointAddress address = new EndpointAddress(Globals.WebServiceAuthenticationURL);

        var client = new AuthenticationClient(binding, address);

        return client;
    }
}

当在上面生成的 AuthenticationClient 上调用“AuthenticateAsync”方法时,将创建如下请求:

<?xml version="1.0" encoding="utf-16"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <h:MessageId i:nil="true" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:h="http://centiro.com/facade/shared/1/0/datacontract" />
  </s:Header>
  <s:Body>
    <AuthenticateRequest xmlns:d3p1="http://schemas.datacontract.org/2004/07/Centiro.Facade.Common.Operations.Authenticate" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://centiro.com/facade/shared/1/0/servicecontract">
      <d3p1:Password>Pass123</d3p1:Password>
      <d3p1:UserName>User123</d3p1:UserName>
    </AuthenticateRequest>
  </s:Body>
</s:Envelope>

使用 SoapUI,我针对服务测试了 XML,并收到了“HTTP/1.1 400 Bad Request”。起初,我剥离了肥皂消息中的所有内容,最后将问题范围缩小到 XML 声明。完全剥离 XML 声明或将声明更改为“”允许服务成功处理请求。

所以问题是,我如何完全剥离 XML 声明,或者更好地将声明更改为“utf-8”(我通过 SoapUI 确认可以使用)?

我已经尝试过的事情:

  • 将 BasicHttpsBinding 上的 TextEncoding 显式更改为 utf-8。 XML 声明仍然显示 utf-16。
  • 创建 CustomBinding,并将 TextMessageEncodingBindingElement 显式设置为 Soap11 和 utf-8 编码。
  • 使用 MessageInspector 使用 utf-8 重新编码消息。 (但这最终只会重新编码消息的主体)

看起来这应该是一个如此简单的改变。此时,我已准备好通过 WebClient 对象构建我自己的客户端,以便我可以更好地控制,并且我将自己构建对象和序列化。我在多个地方读到,默认情况下,WCF 自动将所有内容编码为 utf-8,因此我不确定为什么声明一开始就声明“utf-16”。


通常,绑定的配置已经设置了文本编码。 请尝试使用下面的方式。

  IService service = factory.CreateChannel();
            using (OperationContextScope scope = new OperationContextScope((IContextChannel)service))
            {
                WebOperationContext.Current.OutgoingRequest.ContentType = "text/xml;charset=utf-8";
                service.GetData();
            }

如果我们使用代理类。

  ServiceReference1.ServiceClient client = new ServiceClient();
            using (OperationContextScope ocs=new OperationContextScope(client.InnerChannel))
{

另外,请使用客户端代理类来调用服务,它应该已经封装了文本编码。
我曾经遇到过类似的问题,但我不知道解决方案是否解决了问题。但愿它对你有用。
如果问题仍然存在,请随时告诉我。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

您可以更改 WCF 客户端请求的 XML 声明吗?如果是这样,怎么办? 的相关文章

  • 静态构造函数和 BeforeFieldInit?

    如果类型没有静态构造函数 则将执行字段初始值设定项 就在使用该类型之前 或者在某个时间点突发奇想 运行时 为什么这段代码 void Main start Dump Test EchoAndReturn Hello end Dump clas
  • 使用 ADAL v3 使用 ClientID 对 Dynamics 365 进行身份验证

    我正在尝试对我们的在线 Dynamics CRM 进行身份验证以使用可用的 API 我能找到的唯一关于执行此操作的官方文档是 https learn microsoft com en us dynamics365 customer enga
  • 是否可以使用 http url 作为 DirectShow .Net 中源过滤器的源位置?

    我正在使用 DirectShow Net 库创建一个过滤器图 该过滤器图通过使用 http 地址和 WM Asf Writer 来流式传输视频 然后 在网页上 我可以使用对象元素在 Windows Media Player 对象中呈现视频源
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 防止控制台应用程序中的内存工作集最小化?

    我想防止控制台应用程序中的内存工作集最小化 在Windows应用程序中 我可以这样做覆盖 SC MINIMIZE 消息 http support microsoft com kb 293215 en us fr 1 但是 如何在控制台应用程
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • Libev,如何将参数传递给相关回调

    我陷入了 libev 中争论的境地 通常 libev 在类似的函数中接收包 接收回调 没关系 但是实际操作中 我们需要派遣一个亲戚 写回调 根据收到的包裹处理具体工作 例如 S RECV MSG pstRecvMsg S RECV MSG
  • 测量进程消耗的 CPU 时钟

    我用 C 语言编写了一个程序 它是作为研究结果创建的程序 我想计算程序消耗的确切 CPU 周期 精确的循环次数 知道我怎样才能找到它吗 The valgrind tool cachegrind valgrind tool cachegrin
  • 如何防止 Blazor NavLink 组件的默认导航

    从 Blazor 3 1 Preview 2 开始 应该可以防止默认导航行为 https devblogs microsoft com aspnet asp net core updates in net core 3 1 preview
  • 在 azure blob 存储中就地创建 zip 文件

    我将文件存储在 Blob 存储帐户内的一个容器中 我需要在第二个容器中创建一个 zip 文件 其中包含第一个容器中的文件 我有一个使用辅助角色和 DotNetZip 工作的解决方案 但由于 zip 文件的大小最终可能达到 1GB 我担心在进
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • 我们可以通过指针来改变const定义的对象的值吗?

    include
  • SQLAPI++ 的免费替代品? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何免费 也许是开源 的替代品SQLAPI http www sqlapi com 这个库看起来
  • 读取依赖步行者输出

    I am having some problems using one of the Dlls in my application and I ran dependency walker on it i am not sure how to
  • .NET 和 Mono 之间的开发差异

    我正在研究 Mono 和 NET C 将来当项目开发时我们需要在 Linux 服务器上运行代码 此时我一直在研究 ASP NET MVC 和 Mono 我运行 Ubuntu 发行版 想要开发 Web 应用程序 其他一些开发人员使用 Wind
  • 使用 Xpath 进行部分匹配

    我正在尝试创建一个搜索功能 允许使用 Xpath 按歌曲标题或流派进行部分匹配 这是我的 XML 文件
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • 在哪里可以找到 Microsoft.Build.Utilities.v3.5

    如何获取 Microsoft Build Utilities v3 5 我正在使用 StyleCop 4 7 Stylecop dll 中的 StyleCop msbuild 任务似乎依赖于 Microsoft Build Utilitie
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配

随机推荐