我选择将OWIN IIS主机用于某个具体项目,当我想从Web API资源发送请求时,我陷入了僵局。
这里是Startup
班级代码:
[assembly: Microsoft.Owin.OwinStartup(typeof(MyProduct.IdentityClient.Startup))]
namespace MyProduct.IdentityClient
{
using Newtonsoft.Json.Serialization;
using Owin;
using ServerMyWeb.Shared.Http;
using System.Web.Http;
public class Startup
{
public void Configuration(IAppBuilder app)
{
HttpConfiguration config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
app.UseWebApi(config);
}
}
}
我已经实现了某种代理,它可以向其他API(即另一台主机)提供实际的HTTP请求。当我执行该请求时,代理Web API进入死锁状态。
// Simplified sample of proxying a HTTP/GET request
public virtual Task<HttpResponseMessage> Get(string apiRelativeUri)
{
HttpRequestMessage request = ControllerContext.Request;
request.RequestUri = new Uri("[URI to some API]");
// Client == HttpClient singleton
// HERE IS THE DEADLOCK. Client.SendAsync never returns/continues
HttpResponseMessage response = await Client.SendAsync(request);
// Some stuff to maniuplate response message...
return response;
}
我已经完成了类似的实现,它在OWIN / Katana中运行,我确信这与IIS进程和线程模型有关,它有副作用(也许请求线程可以&#39 ;在HttpClient.SendAsync结束异步操作后,恢复继续...)。
您是否有关于此问题的任何有关OWIN IIS托管的问题和可能的解决方案(或者我在IIS上托管OWIN时跳过了一些配置步骤?)?
注意:在执行我的代码期间,没有Task.Result
,Task.Wait
或Task.WaitAll
或类似内容。
我可以确认这是OWIN IIS托管的一个问题,因为我已经最低限度地重构了ASP.NET Web API初始化以使用旧式Global.asax
和GlobalConfiguration
,以及相同的代码工作完美无缺。