伺服器上有兩個介面,一個是Web Services(asmx文件)介面,一個是MVC API (普通的GET請求介面) 神奇的事情是這樣的,只要我使用WebRequest請求兩次,再使用Web Services 就超時,怎麼也不行。 ~~~C static void Main() { //連續兩次請 ...
伺服器上有兩個介面,一個是Web Services(asmx文件)介面,一個是MVC API (普通的GET請求介面)
神奇的事情是這樣的,只要我使用WebRequest請求兩次,再使用Web Services 就超時,怎麼也不行。
static void Main()
{
//連續兩次請求使用WebRequest
GetRequest();
GetRequest();
//此處請求web servics 超時。。。
ServiceReference1.WebService1SoapClient clent = new ServiceReference1.WebService1SoapClient("WebService1Soap", "http://" + ServerAddress + "/WebService1.asmx");
string result = clent.HelloWorld();
Console.WriteLine(result);
Console.ReadKey();
}
public static void GetRequest()
{
string UpdateReportStatusURL = "http://" + ServerAddress + "/API/Default/updateReportStatus?sglno=234";
string url = UpdateReportStatusURL;
WebRequest wq = WebRequest.Create(url);
WebResponse response = wq.GetResponse();
response.GetResponseStream();
// response.Dispose();
}
排查
WebRequest 和 WebService1SoapClient 請求的是同一臺伺服器,會復用TCP鏈接。
當使用WebRequest 連接後,TCP被掛起,導致Web Services 一直等待連接直到超時。。
註意,抓包不能使用Fiddler,因為Fiddler是代理,只要Fidder會自己和伺服器建立TCP,只要打開Fiddler就好了。
修複
response 使用完成後,要釋放對象。不然response會占用TCP,導致Web Services 超時。。
response.Dispose();
經驗學習
WebRequest 和 WebService1SoapClient 雖然是不同的對象,但是.NET發現請求同一個地址時,會復用TCP埠。
https://github.com/zifeiniu/TestBugWebServices