微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 只有在使用统一DI回收应用程序池时,webapi调用才会失败

我正在调用一个web api服务,该服务仅在我第一次回收应用程序池时失败.之后所有通话都运转正常.

这个过程是这样的..

呼叫服务 – >好的

呼叫服务 – >好的

呼叫服务 – >好的

转到iis并回收应用程序池(我等待10秒)

呼叫服务 – >发生内部服务器错误.请稍后再试.

呼叫服务 – >好的

呼叫服务 – >好的

呼叫服务 – >好的


转到iis并回收应用程序池(我等待10秒)
呼叫服务 – >发生内部服务器错误.请稍后再试.

呼叫服务 – >好的

呼叫服务 – >好的

呼叫服务 – >好的

客户端是使用此方法的控制台应用程序框架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);
        }

Unity配置:

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应用程序池是框架4集成模式,作为网络服务运行. ProcessModel空闲超时(分钟0)唯一的配置已从认值更改. IIS 7.5

解决方法

问题与我们的反向代理有关.设置为我使用的网址仅等待15秒.因此,在回收应用程序池时(因为它必须加载所有统一内容),大多数时间需要16秒.需要注意的是,反向代理错误将从ASP.NET webapi引发内部服务器错误,注意与Timeout相关或者某些东西提供一些线索.现在很高兴知道……

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐