我正在使用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
我必须使用我们的合作伙伴提供的服务.我得到了很少的指导,但被告知安全性是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)
谢谢.
如何关闭WCF服务客户端的证书吊销?客户端代理由wsdl.exe生成并继承SoapHttpClientProtocol.
我使用的是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) 几天我们的应用程序出现问题.我们使用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?任何帮助或想法都非常受欢迎.
Web Service是ASMX Web服务(不是WCF)
我收到一个错误
已超出传入邮件的最大邮件大小限额(65536).要增加配额,请在相应的绑定元素上使用MaxReceivedMessageSize属性
我在使用Visual Studio为您添加"Web引用"时生成的代理(请注意我不添加"服务引用",而是使用Web引用)...这将创建一个继承自的代理 SoapHttpClientProtocol
任何人都可以帮我弄清楚如何MaxReceivedMessageSize为这种方法设置等价物?(HttpBinding.MaxReceivedMessageSize = Int32.MaxValue如果我使用WCF,我要求相当于做)
最近,我需要访问使用 SOAP::Lite 创建的 Web 服务。使用起来真的很麻烦,因为没有 WSDL,它不返回合理的数据类型等。所以我开始使用提供的示例代码。
从一开始我就遇到问题,请求超时。有时经常,有时很少,但从来没有完全没有问题。在使用 Fiddler 嗅探流量并进行搜索后,似乎 SOAP::Lite 存在/曾经存在一个错误,在处理 UTF-8 编码数据时会弄乱标头 Content-Length。这似乎是合理的,因为我的分析指出超时是由客户端等待更多数据(内容长度)而服务器表示已完成(真实数据)引起的。
所以现在我需要一种方法来对抗这个错误的标头字段,或者:
问题是,我从来没有机会使用 SoapExtension 或任何其他修改,因为 Invoke() 最终会在解析开始之前抛出 IoException 或 WebException。此外,我认为 WS 不是我的,而且相当不可更改。
我还尝试覆盖 SoapHttpClientProtocol.GetWebResponse() 来执行异步请求,但这也无济于事,因为在调用 HttpWebRequest.EndGetResponse() 之前我无法掌握 ResponseStream 并且那个总是抛出异常。
有谁知道我该如何解决这个问题?
更新:现在我也尝试过 WCF 并在 MSDN 上看到这篇文章- 答案不是很令人振奋。基本上,这在管道中发生得太深,用户代码无法访问。我现在最好的选择似乎是使用 Fiddler 脚本来更正 Content-Length 标头,这可能不是微不足道的,因为此 WS 仅可通过 HTTPS 使用。
/担
现在已经发现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(这个问题适用于那些)
我对此很好奇.我正在对这个项目进行更改,即使用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块中捕获此异常并重试?
c# ×6
web-services ×4
.net ×3
asmx ×1
client ×1
http ×1
netsuite ×1
performance ×1
service ×1
soap-client ×1
ssl ×1
wcf ×1