仅当使用 unity DI 回收应用程序池时,webapi 调用才会失败
webapi call fails only when recycling application pool using unity DI
我调用的 Web api 服务仅在我第一次回收应用程序池时失败。之后所有调用都正常。
过程是这样的..
呼叫服务 --> return 确定
呼叫服务 --> return 确定
呼叫服务 --> return 确定
转到 iis 并回收应用程序池(我等了 10 秒)
呼叫服务 --> 发生内部服务器错误。请稍后再试。
呼叫服务 --> return 确定
呼叫服务 --> return 确定
呼叫服务 --> return 确定
...
转到 iis 并回收应用程序池(我等了 10 秒)
呼叫服务 --> 发生内部服务器错误。请稍后再试。
呼叫服务 --> return 确定
呼叫服务 --> return 确定
呼叫服务 --> return 确定
...
客户端是console application framework 4.0 使用此方法:
public static object Send(string webAddr, object param)
{
HttpUtil.IgnoreBadCertificates();
HttpWebRequest request = null;
object result = null;
request = (HttpWebRequest)WebRequest.Create(webAddr);
request.ContentType = "application/json; charset=utf-8";
request.Method = "POST";
request.Accept = "application/json";
String u = GetString(a1);
String p = GetString(a1) + GetString(a2);
String encoded = System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(u + ":" + p));
request.Headers.Add("Authorization", "Basic " + encoded);
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
var myJsonString = Newtonsoft.Json.JsonConvert.SerializeObject(param);
streamWriter.Write(myJsonString);
streamWriter.Flush();
}
var response = (HttpWebResponse)request.GetResponse();
using (var streamReader = new StreamReader(response.GetResponseStream()))
{
result = streamReader.ReadToEnd();
}
return result;
}
Webapi 是框架 4.5:
public class CambiosController : BaseApiController
{
private ICambioService cambioService;
public CambiosController(ICambioService cambioService)
{
this.cambioService = cambioService;
}
[HttpPost]
[Authorize]
public HttpResponseMessage Post([FromBody] CambioRequest cambioRequest)
{
HttpResponseMessage response = null;
if (cambioRequest == null)
{
Exception ex = new ArgumentException("cambioRequest");
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex);
}
try
{
var result = this.cambioService.EnviarConfiguracion(cambioRequest);
response = Request.CreateResponse(HttpStatusCode.OK, result);
}
catch (Exception ex)
{
response = Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex);
}
return response;
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
this.cambioService.Dispose();
}
base.Dispose(disposing);
}
统一配置:
public static void RegisterComponents()
{
LoggerFacility.Debug(string.Empty, string.Empty, "UnityConfig.RegisterComponents()");
var container = new UnityContainer();
container.RegisterTypes(
AllClasses.FromAssemblies(BuildManager.GetReferencedAssemblies().Cast<Assembly>())
.Where(x => x.Name != "IUnitOfWork" && x.Name != "IDbContext"),
WithMappings.FromMatchingInterface, WithName.Default, overwriteExistingMappings: true);
container.RegisterType<IUnitOfWork, UnitOfWork>(new PerResolveLifetimeManager());
container.RegisterType<IDbContext, ControlConfigContext>(new PerResolveLifetimeManager());
GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
}
WebApi应用程序池是framework 4集成模式,运行作为Network Service。 ProcessModel 空闲超时(0 分钟) 唯一的配置更改为默认值。 IIS 7.5
问题与我们的反向代理有关。对于我正在使用的 url,它被设置为仅等待 15 秒。因此,在回收应用程序池时(因为它必须加载所有统一的东西)大部分时间需要 16 秒。需要注意的是,反向代理错误将从 ASP.NET webapi 中抛出一个内部服务器错误,注意与超时相关的内容或其他内容以提供一些线索。现在很高兴知道...
我调用的 Web api 服务仅在我第一次回收应用程序池时失败。之后所有调用都正常。
过程是这样的..
呼叫服务 --> return 确定
呼叫服务 --> return 确定
呼叫服务 --> return 确定
转到 iis 并回收应用程序池(我等了 10 秒)
呼叫服务 --> 发生内部服务器错误。请稍后再试。
呼叫服务 --> return 确定
呼叫服务 --> return 确定
呼叫服务 --> return 确定
... 转到 iis 并回收应用程序池(我等了 10 秒) 呼叫服务 --> 发生内部服务器错误。请稍后再试。
呼叫服务 --> return 确定
呼叫服务 --> return 确定
呼叫服务 --> return 确定
...
客户端是console application framework 4.0 使用此方法:
public static object Send(string webAddr, object param)
{
HttpUtil.IgnoreBadCertificates();
HttpWebRequest request = null;
object result = null;
request = (HttpWebRequest)WebRequest.Create(webAddr);
request.ContentType = "application/json; charset=utf-8";
request.Method = "POST";
request.Accept = "application/json";
String u = GetString(a1);
String p = GetString(a1) + GetString(a2);
String encoded = System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(u + ":" + p));
request.Headers.Add("Authorization", "Basic " + encoded);
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
var myJsonString = Newtonsoft.Json.JsonConvert.SerializeObject(param);
streamWriter.Write(myJsonString);
streamWriter.Flush();
}
var response = (HttpWebResponse)request.GetResponse();
using (var streamReader = new StreamReader(response.GetResponseStream()))
{
result = streamReader.ReadToEnd();
}
return result;
}
Webapi 是框架 4.5:
public class CambiosController : BaseApiController
{
private ICambioService cambioService;
public CambiosController(ICambioService cambioService)
{
this.cambioService = cambioService;
}
[HttpPost]
[Authorize]
public HttpResponseMessage Post([FromBody] CambioRequest cambioRequest)
{
HttpResponseMessage response = null;
if (cambioRequest == null)
{
Exception ex = new ArgumentException("cambioRequest");
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex);
}
try
{
var result = this.cambioService.EnviarConfiguracion(cambioRequest);
response = Request.CreateResponse(HttpStatusCode.OK, result);
}
catch (Exception ex)
{
response = Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex);
}
return response;
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
this.cambioService.Dispose();
}
base.Dispose(disposing);
}
统一配置:
public static void RegisterComponents()
{
LoggerFacility.Debug(string.Empty, string.Empty, "UnityConfig.RegisterComponents()");
var container = new UnityContainer();
container.RegisterTypes(
AllClasses.FromAssemblies(BuildManager.GetReferencedAssemblies().Cast<Assembly>())
.Where(x => x.Name != "IUnitOfWork" && x.Name != "IDbContext"),
WithMappings.FromMatchingInterface, WithName.Default, overwriteExistingMappings: true);
container.RegisterType<IUnitOfWork, UnitOfWork>(new PerResolveLifetimeManager());
container.RegisterType<IDbContext, ControlConfigContext>(new PerResolveLifetimeManager());
GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
}
WebApi应用程序池是framework 4集成模式,运行作为Network Service。 ProcessModel 空闲超时(0 分钟) 唯一的配置更改为默认值。 IIS 7.5
问题与我们的反向代理有关。对于我正在使用的 url,它被设置为仅等待 15 秒。因此,在回收应用程序池时(因为它必须加载所有统一的东西)大部分时间需要 16 秒。需要注意的是,反向代理错误将从 ASP.NET webapi 中抛出一个内部服务器错误,注意与超时相关的内容或其他内容以提供一些线索。现在很高兴知道...