标签: soaphttpclientprotocol

Slow SoapHttpClientProtocol构造函数

我正在使用Microsoft Dynamics CRM进行一些实验.您通过Web服务与它进行交互,并且我已将Web引用添加到我的项目中.Web服务接口非常丰富,生成的"Reference.cs"大约是90k loc.

我在控制台应用程序中使用Web引用.我经常改变一些东西,重新编译并运行.编译速度很快,但是新建Web服务引用非常慢,花费大约15-20秒: CrmService service = new CrmService(); 分析显示所有时间都花在SoapHttpClientProtocol构造函数中.

罪魁祸首显然是XML序列化代码(不包括在上面提到的90k loc中)是在运行时生成,然后才进行JIT.这在构造函数调用期间发生.在玩耍和尝试时,等待是相当令人沮丧的.

我尝试了sgen.exe,ngen和XGenPlus的各种组合(需要几个小时并生成500MB的额外代码),但无济于事.我已经考虑过实现一个几乎没有CrmService实例的Windows服务,可以在需要的时候发布,但这似乎太过分了.

有任何想法吗?

.net c# performance xml-serialization soaphttpclientprotocol

30
推荐指数
1
解决办法
1万
查看次数

在调用SoapHttpClient服务时添加http标头

我必须使用我们的合作伙伴提供的服务.我得到了很少的指导,但被告知安全性是PasswordDigest.我查了一遍,立即看到了很多对WSE的引用,所以我离开了.它非常容易实现,并且我很快就使用了PasswordDigest的标准WSE用户令牌,该令牌位于我的消息的SOAP头中.

当我们今天开始测试时,我立刻被告知(通过错误消息)事情是不对的.事实证明,伙伴不会查看SOAP标头,而是希望http标头中的安全信息.

我已经看过很多关于如何将自定义http标头添加到代理类的文章,但是我的代理继承自SoapHttpClientProtocol,它没有要添加的标头集合.我正在考虑制作一个原始的httpWebRequest,但是我有一个特定的方法来访问它有一些复杂的参数来处理(而且它感觉就像回到正确的话).

将自定义http标头添加到没有GetWebRequest方法的服务代理类的最佳方法是什么?

以供参考:

代理类decleration:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Web.Services", "2.0.50727.3053")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Web.Services.WebServiceBindingAttribute(Name="MtomServiceSoap11", namespace="http://ws.xxxxxxx.com/")]
public partial class MtomServiceService : System.Web.Services.Protocols.SoapHttpClientProtocol {
Run Code Online (Sandbox Code Playgroud)

我需要调用的目标方法:

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Bare)]
[return: System.Xml.Serialization.XmlElementAttribute("uploadDocumentResponse", Namespace="http://ws.edsmtom.citizensfla.com/")]
public uploadDocumentResponse uploadDocument([System.Xml.Serialization.XmlElementAttribute(Namespace="http://ws.xxxxxxx.com/")] uploadDocumentRequest uploadDocumentRequest) {
    object[] results = this.Invoke("uploadDocument", new object[] {
        uploadDocumentRequest});
        return ((uploadDocumentResponse)(results[0]));
    }
}
Run Code Online (Sandbox Code Playgroud)

对服务的实际调用很简单.传入的对象不是:

request.criteria = docCriteria;
request.document = document;
var result = service.uploadDocument(request);
Run Code Online (Sandbox Code Playgroud)

谢谢.

service soaphttpclientprotocol

16
推荐指数
1
解决办法
1万
查看次数

如何关闭WCF服务客户端的证书吊销?

如何关闭WCF服务客户端的证书吊销?客户端代理由wsdl.exe生成并继承SoapHttpClientProtocol.

wcf certificate-revocation soaphttpclientprotocol

8
推荐指数
1
解决办法
8897
查看次数

如何配置C#Web服务客户端以并行发送HTTP请求标头和正文?

我使用的是VS2008 .Net 3.5中生成的传统C#Web服务客户端,继承自SoapHttpClientProtocol.这是连接到用Java编写的远程Web服务.

在客户端初始化期间,所有配置都在代码中完成,如下所示:

        ServicePointManager.Expect100Continue = false;
        ServicePointManager.DefaultConnectionLimit = 10;

        var client = new APIService
        {
            EnableDecompression = true,
            Url = _url + "?guid=" + Guid.NewGuid(),
            Credentials = new NetworkCredential(user, password, null),
            PreAuthenticate = true,
            Timeout = 5000 // 5 sec
        };
Run Code Online (Sandbox Code Playgroud)

一切正常,但执行最简单的方法调用所花费的时间几乎是网络ping时间的两倍.而Java测试客户端与网络ping时间大致相同:

C# client ~ 550ms
Java client ~ 340ms
Network ping ~ 300ms
Run Code Online (Sandbox Code Playgroud)

在分析会话的TCP流量后发现以下内容:

基本上,C#客户端按以下顺序发送TCP数据包.

Client Send HTTP Headers in one packet.
Client Waits For TCP ACK from server.
Client Sends HTTP Body in one packet.
Client Waits …
Run Code Online (Sandbox Code Playgroud)

c# client web-services http soaphttpclientprotocol

8
推荐指数
1
解决办法
1816
查看次数

SoapHttpClientProtocol日志响应xml

几天我们的应用程序出现问题.我们使用SoapHttpClientProtocol来调用java mbeans.这基本上调用java webservice来调用方法.

我们的问题是,有时我们会得到以下异常:

XML文档中存在错误(1,172089).
System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse上的System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader,String encodingStyle)中的System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader,String encodingStyle,XmlDeserializationEvents事件)处(位于JMXConnectorService.cs的DynamicMBeanResourceBinding.Invoke(OperationRequestType ManagedResourceOperation)中的System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName,Object []参数)中的SoapClientMessage消息,WebResponse响应,Stream responseStream,Boolean asyncCall:JMXWSClient中的第781行连接\ Client.cs中的.InvokeMethodOnObject(String objectName,String methodName,ParameterType [] paramValue):第132行

引起:发生了意外的文件结束.以下元素未关闭:图标

我们在通信层中的最后一个代码是:

 /// <remarks/>
[System.Web.Services.Protocols.SoapHeaderAttribute("soapHeaders", Direction = SoapHeaderDirection.In)]
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://jsr262.dev.java.net/DynamicMBeanResource/Invoke", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
[return: System.Xml.Serialization.XmlElementAttribute("ManagedResourceOperationResult", Namespace = "http://jsr262.dev.java.net/jmxconnector")]
public GenericValueType Invoke([System.Xml.Serialization.XmlElementAttribute(Namespace = "http://jsr262.dev.java.net/jmxconnector")] OperationRequestType ManagedResourceOperation)
{
    object[] results = this.Invoke("Invoke", new object[] {ManagedResourceOperation});
    return ((GenericValueType)(results[0]));
}
Run Code Online (Sandbox Code Playgroud)

在框架反序列化之前,有没有办法记录响应xml?任何帮助或想法都非常受欢迎.

c# web-services soaphttpclientprotocol webservice-client

8
推荐指数
1
解决办法
7794
查看次数

ASMX Web服务引用如何设置等效于MaxReceivedMessageSize

Web Service是ASMX Web服务(不是WCF)

我收到一个错误

已超出传入邮件的最大邮件大小限额(65536).要增加配额,请在相应的绑定元素上使用MaxReceivedMessageSize属性

我在使用Visual Studio为您添加"Web引用"时生成的代理(请注意我不添加"服务引用",而是使用Web引用)...这将创建一个继承自的代理 SoapHttpClientProtocol

任何人都可以帮我弄清楚如何MaxReceivedMessageSize为这种方法设置等价物?(HttpBinding.MaxReceivedMessageSize = Int32.MaxValue如果我使用WCF,我要求相当于做)

c# web-services asmx soaphttpclientprotocol soap-client

6
推荐指数
1
解决办法
7947
查看次数

扩展 SoapHttpClientProtocol 以纠正错误的服务器内容长度

最近,我需要访问使用 SOAP::Lite 创建的 Web 服务。使用起来真的很麻烦,因为没有 WSDL,它不返回合理的数据类型等。所以我开始使用提供的示例代码。

从一开始我就遇到问题,请求超时。有时经常,有时很少,但从来没有完全没有问题。在使用 Fiddler 嗅探流量并进行搜索后,似乎 SOAP::Lite 存在/曾经存在一个错误,在处理 UTF-8 编码数据时会弄乱标头 Content-Length。这似乎是合理的,因为我的分析指出超时是由客户端等待更多数据(内容长度)而服务器表示已完成(真实数据)引起的。

所以现在我需要一种方法来对抗这个错误的标头字段,或者:

  1. 提供正确的 Content-Length 或
  2. 填充有效负载以匹配 Content-Length

问题是,我从来没有机会使用 SoapExtension 或任何其他修改,因为 Invoke() 最终会在解析开始之前抛出 IoException 或 WebException。此外,我认为 WS 不是我的,而且相当不可更改。

我还尝试覆盖 SoapHttpClientProtocol.GetWebResponse() 来执行异步请求,但这也无济于事,因为在调用 HttpWebRequest.EndGetResponse() 之前我无法掌握 ResponseStream 并且那个总是抛出异常。

有谁知道我该如何解决这个问题?

更新:现在我也尝试过 WCF 并在 MSDN 上看到这篇文章- 答案不是很令人振奋。基本上,这在管道中发生得太深,用户代码无法访问。我现在最好的选择似乎是使用 Fiddler 脚本来更正 Content-Length 标头,这可能不是微不足道的,因为此 WS 仅可通过 HTTPS 使用。

/担

.net c# web-services soaphttpclientprotocol content-length

5
推荐指数
0
解决办法
870
查看次数

System.Web.Services.Protocols.SoapHttpClientProtocol使用什么版本的SSL/TLS?

现在已经发现SSL 3容易受到POODLE攻击:

System.Web.Services.Protocols.SoapHttpClientProtocol在连接到任何https Uri时使用的是什么版本的SSL/TLS?

我使用SoapHttpClientProtocol连接到几个第三方SOAP API.其中一个已经表示他们将阻止任何使用SSL 3的请求.但SoapHttpClientProtocol是.Net核心框架的一部分(使用4.5),因此它使用的SSL版本或如何覆盖版本并不明显.

请注意,此问题与System.Net.WebRequest支持哪些版本的SSL/TLS不重复.我使用了几个API,一些是REST(另一个问题是针对那些),有些是SOAP(这个问题适用于那些)

.net c# ssl soaphttpclientprotocol poodle-attack

5
推荐指数
1
解决办法
6481
查看次数

SoapHttpClientProtocol在异常后自动重试?

我对此很好奇.我正在对这个项目进行更改,即使用NetSuite Web服务,有时它会随机抛出一个SoapException,"一次只能对一个会话发出一个请求".

    private NetSuiteService _service;

    SessionResponse response = _service.login(passport); //if SoapException, retries??
    Status status = response.status;

Reference.cs:
    public partial class NetSuiteService : 
System.Web.Services.Protocols.SoapHttpClientProtocol
Run Code Online (Sandbox Code Playgroud)

我的问题是:如果我处于调试模式,我跟踪它,我点击F5,它似乎在抛出异常后自动重试(代码保持运行,没有实现try catch块,没有while循环)直到成功( status.isSuccess == true).当我在发布模式下运行它作为Windows服务时,日志显示它在抛出异常后停止运行.

这怎么可能?是否更好地在try catch块中捕获此异常并重试?

soaphttpclientprotocol netsuite soapexception

3
推荐指数
1
解决办法
920
查看次数