我有一个Web服务,可从Blob中读取数据并将其导入到sql server管理的实例中。使用sql clr调用Web服务。
clr呼叫Web服务:
string WebServiceUri = string.Format("{0}/AzureWebSrvcFunction?ConnectionString={1}&FileName={2}",
WebServiceAddress,
AzureStorageConnectionString,
FileName);
HttpWebRequest request = (HttpWebRequest)CreateHttpWebRequest(WebServiceUri);
request.Timeout = 20 * 60 * 1000; //20 minutes
request.ReadWriteTimeout = 20 * 60 * 1000; //20 minutes
request.AllowWriteStreamBuffering = false;
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) {
using(var responseStream = response.GetResponseStream()) {
StreamReader reader = new StreamReader(responseStream);
SQLTableName = reader.ReadToEnd();
}
}
网络服务功能:
[WebMethod(Description = "Read and parse blob data file", BufferResponse = true, EnableSession = false, CacheDuration = 0)]
public void AzureWebSrvcFunction(string ConnectionString, string FileName){
//imports the files from blob storage
HttpContext.Current.Response.Write("TableName" + TableName);
log("success");
}
Web服务配置文件:
<httpRuntime targetFramework="4.6.1" executionTimeout="1800"/>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_AzureServices"
maxReceivedMessageSize="2147483647"
maxBufferSize="2147483647"
maxBufferPoolSize="2147483647"
sendTimeout="00:30:00"
receiveTimeout="00:30:00"
openTimeout="00:30:00"
closeTimeout="00:30:00">
</binding>
</basicHttpBinding>
</bindings>
</system.serviceModel>
当执行时间少于1分钟左右(要导入的较小文件)时,Web服务将完美运行。当文件较大时,恰好在4分10秒之后,我收到以下错误消息
System.Net.WebException:远程服务器返回错误:(502) 错误的网关。在System.Net.HttpWebRequest.GetResponse()在 AzureStorage.AzureWebSrvcFunction(...
有时它不会引发上述错误,并且20分钟(请求超时)后,它将引发以下错误。
System.Net.WebException:操作在以下位置超时 System.Net.HttpWebRequest.GetResponse()在 AzureStorage.AzureWebSrvcFunction(...
但是webserive在后台运行并成功完成,我可以看到日志文件中的最后一步(即“成功”),但是clr没有收到响应并抛出上述错误。
从Visual Studio运行它时,我也没有遇到这个问题,只有当我在Azure和SQL Server的clr中部署Web服务时,我才遇到这个问题。
我在这里想念什么?任何指针都会有所帮助。