C# web服务调用中引发的基础连接关闭异常
我知道以前有人问过这个问题,也提出过很多建议,但我都试过了,没有一个奏效,所以我想看看是否有人对这件事有额外的了解 情景: 我有一个控制台应用程序,其中添加了对ASMXWeb服务的web引用。 在控制台应用程序中,我生成了如下派生类:C# web服务调用中引发的基础连接关闭异常,c#,asmx,webservice-client,C#,Asmx,Webservice Client,我知道以前有人问过这个问题,也提出过很多建议,但我都试过了,没有一个奏效,所以我想看看是否有人对这件事有额外的了解 情景: 我有一个控制台应用程序,其中添加了对ASMXWeb服务的web引用。 在控制台应用程序中,我生成了如下派生类: public class OverridenWebRequestReporting : webservice.Reporting { public OverridenWebRequestReporting(string addr) : ba
public class OverridenWebRequestReporting : webservice.Reporting
{
public OverridenWebRequestReporting(string addr)
: base(addr)
{
}
protected override System.Net.WebRequest GetWebRequest(Uri uri)
{
System.Net.HttpWebRequest webRequest = (System.Net.HttpWebRequest)base.GetWebRequest(uri);
webRequest.KeepAlive = false;
webRequest.ProtocolVersion = HttpVersion.Version10;
webRequest.ServicePoint.ConnectionLimit = 1;
return webRequest;
}
}
对web服务方法的调用如下所示:
OverridenWebRequestReporting reportingService = new OverridenWebRequestReporting("http://some_web_location_where_the_service_is_deployed/Reporting.svc");
CredentialCache cache = new CredentialCache();
cache.Add(new Uri("http://some_web_location_where_the_service_is_deployed/Reporting.svc"), "NTLM",new NetworkCredential("username", "password", "domain"));
reportingService.Credentials = cache;
System.Net.ServicePointManager.Expect100Continue = false;
DataTable dt = new DataTable();
using (reportingService)
{
try
{
dt = reportingService.GetAllDocumentsMetadataFromSP("someString", "anotherString");
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
}
使用调试器,我可以清楚地看到调用已经发出,并且它返回了一个有效的datatable,但是当发出最后一个return语句时,代码进入catch块,除了“底层连接已关闭:预期保持活动状态的连接已被服务器关闭”之外
框架是4.5
我还可以做些什么来防止抛出异常?有什么建议吗?请签出。基本上,当使用块调用Dispose时会发生这种情况。解决方案:跳过使用并调用。根据需要关闭或。中止
MSDN链接:解决方案是一系列更改的组合: 1) 正如Kirill所建议的,向datatable添加一个名称 2) 使用
dt.WriteXml(writer,XmlWriteMode.WriteSchema,false)服务中的code>,以生成XML字符串
3) 使用
在客户端中对XML字符串进行反序列化
谢谢大家的建议。有时,当您尝试将服务添加为服务引用时,代码生成器会抛出相同的异常,但会显示一条详细消息。我的猜测是,您的返回值中有无法序列化到客户端的内容,或者您访问了在返回完成之前释放的惰性变量。console应用程序只是一个“测试环境”。这是一个古老的遗产。我可以简单地将其添加为服务引用。你认为这可能会对通话产生负面影响吗?我刚刚添加了一个asmx作为网络参考。原因(我花了一段时间才记住:P)是我无法将对System.ServiceModel的引用添加到我的应用程序中。发送到客户端的所有内容都必须可序列化,因为客户端必须知道将数据重新生成为正确数据类型的规则。我认为数据表是不可序列化的。如果不再抛出异常,则可能将结果作为一个concatated字符串返回以进行测试,这将使您走上正确的轨道。DataTable
序列化很好。不过,您必须遵循某些规则,例如在服务器端设置TableName
属性(这是过去对我影响最大的一个)。我尝试过删除using块(实际上,它在开始时不存在),但它仍然会命中catch块。我只是添加了using块,希望这能解决这个问题。事实并非如此。。。
using (StringReader r = new StringReader(XMLSerializedResult))
{
dt.ReadXml(XmlReader.Create(r));
}