我知道之前已经提出过这个问题,并且已经提出了很多建议,但是我已经尝试了所有这些问题而没有任何工作,所以我试图看看是否有人对此事有额外的了解。
方案: 我有一个控制台应用程序,我在其中添加了一个ASMX Web服务的Web引用。 在控制台应用程序中,我生成了一个派生类,如下所示:
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);
}
}
使用调试器,我可以清楚地看到调用,并返回一个有效的数据表,但是当最后一个return语句生成时,代码进入catch块,但“底层连接已关闭” :预计将保持活动状态的连接被服务器关闭。“被抛出
框架是4.5。
我还可以采取哪些其他建议来防止抛出异常?
答案 0 :(得分:1)
解决方案是一系列变化:
1)正如Kirill建议的那样,添加数据表的名称
2)在服务中使用dt.WriteXml(writer, XmlWriteMode.WriteSchema, false);
,生成XML字符串
3)使用
using (StringReader r = new StringReader(XMLSerializedResult))
{
dt.ReadXml(XmlReader.Create(r));
}
在客户端中反序列化XML字符串。
谢谢大家的建议。
答案 1 :(得分:0)
结帐Closing WCF connection。基本上,当使用块调用Dispose时会发生这种情况。解决方案:跳过使用并根据需要调用.Close或.Abort。
MSDN链接:http://msdn.microsoft.com/en-us/library/aa355056.aspx