我正在写代理使用一些HTTP请求的ASP.NET Web API和我挣扎识别间歇错误的来源的应用程序。 这似乎是一个竞争条件......但我不能完全肯定。
我细讲之前这里是应用程序的常规通信流程:
- 客户端发出一个HTTP请求到代理服务器1。
- 代理1中继HTTP请求的内容,以代理2
- 代理2个继电器HTTP请求的内容,目标网络应用
- 目标Web应用程序响应该HTTP请求和响应被流传输(块传输)到代理2
- 代理2返回到代理1的响应继而响应原始调用客户端 。
代理服务器应用程序是使用.NET 4.5中编写的ASP.NET Web API RTM。 执行继电器的代码如下所示:
//Controller entry point.
public HttpResponseMessage Post()
{
using (var client = new HttpClient())
{
var request = BuildRelayHttpRequest(this.Request);
//HttpCompletionOption.ResponseHeadersRead - so that I can start streaming the response as soon
//As it begins to filter in.
var relayResult = client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).Result;
var returnMessage = BuildResponse(relayResult);
return returnMessage;
}
}
private static HttpRequestMessage BuildRelayHttpRequest(HttpRequestMessage incomingRequest)
{
var requestUri = BuildRequestUri();
var relayRequest = new HttpRequestMessage(incomingRequest.Method, requestUri);
if (incomingRequest.Method != HttpMethod.Get && incomingRequest.Content != null)
{
relayRequest.Content = incomingRequest.Content;
}
//Copies all safe HTTP headers (mainly content) to the relay request
CopyHeaders(relayRequest, incomingRequest);
return relayRequest;
}
private static HttpRequestMessage BuildResponse(HttpResponseMessage responseMessage)
{
var returnMessage = Request.CreateResponse(responseMessage.StatusCode);
returnMessage.ReasonPhrase = responseMessage.ReasonPhrase;
returnMessage.Content = CopyContentStream(responseMessage);
//Copies all safe HTTP headers (mainly content) to the response
CopyHeaders(returnMessage, responseMessage);
}
private static PushStreamContent CopyContentStream(HttpResponseMessage sourceContent)
{
var content = new PushStreamContent(async (stream, context, transport) =>
await sourceContent.Content.ReadAsStreamAsync()
.ContinueWith(t1 => t1.Result.CopyToAsync(stream)
.ContinueWith(t2 => stream.Dispose())));
return content;
}
发生间歇性的错误是:
异步模块或处理程序而异步操作仍有待完成。
这个错误通常发生在最初的几个请求后未再见过错误的代理应用程序。
当抛出Visual Studio中从来没有捕捉异常。 但该错误可以在Global.asax Application_Error事件捕获。 不幸的是,异常没有堆栈跟踪。
代理应用程序托管在Azure的Web角色。
任何标识的罪魁祸首帮助将不胜感激。