【问题标题】:Could not get any response - Server cannot append header after HTTP headers have been sent无法获得任何响应 - 服务器无法在发送 HTTP 标头后附加标头
【发布时间】:2019-02-14 11:43:02
【问题描述】:

我有一个 .NET MVC 项目,我在项目中使用 API 控制器来处理 REST API。项目中使用的身份验证基于 OwinMiddleware。

OwinMiddleware 中使用以下代码进行身份验证

 var authValue = context.Request.Headers["Authorization"];
 if (!string.IsNullOrEmpty(authValue) && (authValue.StartsWith("Basic ")))
  {
      authValue = authValue.Substring(6).Trim();
      authValue = Encoding.UTF8.GetString(Convert.FromBase64String(authValue));
      var credentials = authValue.Split(":".ToCharArray());
      var signInStatus = await _signinManager.PasswordSignInAsync(credentials[0], credentials[1], false, false);

          switch (signInStatus)
           {
             case Microsoft.AspNet.Identity.Owin.SignInStatus.Success:
                    var user = await _userManager.FindByNameAsync(credentials[0]);
                    var identity = await _signinManager.CreateUserIdentityAsync(user);
                    context.Request.User = new ClaimsPrincipal(identity);
                     await base.Next.Invoke(context);
                     break;

             default:
                   context.Response.StatusCode = 401;
// an aobject representing error
                   var res = GetResposeData() 
                   var format = GetResponseContentType(context.Request);
                   var data = ParseToString(res , format);
                   var dataByte = Encoding.UTF8.GetBytes(data);
                  context.Response.ContentType = GetContentType(format);
                  context.Response.Body.Write(dataByte, 0, dataByte.Length);
                   break;
             }

    }

在 startup.cs 我添加了以下代码

public void ConfigureAuth(IAppBuilder app)
    {
        app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<CustomSignInManager>());
        app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<CustomUserManager>());
        app.UseCookieAuthentication(new CookieAuthenticationOptions()
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/account/index"),
            Provider = new CookieAuthenticationProvider()
            {
                OnApplyRedirect = ctx =>
                {
                    ctx.Response.Redirect(ctx.RedirectUri);
                }
            }
        });
        app.UseAutofacMiddleware(AutofacConfig.Container);
    }

当我使用邮递员连续调用 API 时,发现以下响应

无法得到任何回应。 连接到 baseUrl/api/User?pageNumber=1&pageSize=500 时出错。 为什么会发生这种情况: 服务器无法发送响应: 确保后端正常工作 自签名 SSL 证书被阻止: 通过在“设置”>“常规”中关闭“SSL 证书验证”来解决此问题 代理配置不正确 确保在设置 > 代理中正确配置代理 请求超时: 在“设置”>“常规”中更改请求超时

以下是 Windows 事件日志中的一些例外情况。

事件代码:3005 事件消息:发生未处理的异常。 活动时间:2/14/2019 7:04:10 PM 活动时间(UTC):2/14/2019 8:04:10 AM 事件 ID:22548ff89e3744adbfd5c3e2b3b66ef4 事件序列:5 事件发生:1 事件详细代码:0 应用信息: 应用域:/LM/W3SVC/1/ROOT/XYZ-2-131946050074629312 信任级别:完全 应用程序虚拟路径:/XYZ 应用路径:C:\inetpub\wwwroot\xyz\ 机器名称:ABC 工艺信息: 进程号:15228 进程名称:w3wp.exe 账户名:IIS APPPOOL\DefaultAppPool 异常信息: 异常类型:HttpException 异常消息:发送 HTTP 标头后,服务器无法附加标头。在 System.Web.HttpHeaderCollection.SetHeader(字符串 名称,字符串值,布尔替换)在 Microsoft.Owin.Host.SystemWeb.CallHeaders.AspNetResponseHeaders.Set(字符串 键,字符串 [] 值)在 Microsoft.Owin.Infrastructure.OwinHelpers.AppendHeaderUnmodified(IDictionary2 headers, String key, String[] values) at Microsoft.Owin.Infrastructure.ChunkingCookieManager.AppendResponseCookie(IOwinContext context, String key, String value, CookieOptions options) at Microsoft.Owin.Security.Cookies.CookieAuthenticationHandler.<ApplyResponseGrantAsync>d__f.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.Owin.Security.Infrastructure.AuthenticationHandler.<ApplyResponseCoreAsync>d__b.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.Owin.Security.Infrastructure.AuthenticationHandler.<ApplyResponseAsync>d__8.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.Owin.Security.Infrastructure.AuthenticationHandler.<TeardownAsync>d__5.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.Owin.Security.Infrastructure.AuthenticationMiddleware1.d__0.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Microsoft.AspNet.Identity.Owin.IdentityFactoryMiddleware2.<Invoke>d__5.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNet.Identity.Owin.IdentityFactoryMiddleware2.d__5.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContextStage.d__5.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.d__2.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult 一只老鼠 System.Web.HttpApplication.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤, Boolean & completedSynchronously)

API 控制器有以下代码来返回响应

   // create new response
// format can be json or xml
            var response = new HttpResponseMessage()
            {
                Content = new StringContent(data, Encoding.UTF8, format),
                StatusCode = httpStatus
            };

            //if last modified available
// some date value
            if (lastUpdated != null)
                response.Content.Headers.LastModified = lastUpdated; 

            return response;

【问题讨论】:

    标签: .net asp.net-mvc iis owin


    【解决方案1】:

    您混淆了 webapi 和 MVC 身份验证。将您的代码 startup.cs 更改为以下内容:

    public void ConfigureAuth(IAppBuilder app)
        {
            app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<CustomSignInManager>());
            app.CreatePerOwinContext(() => DependencyResolver.Current.GetService<CustomUserManager>());
            app.MapWhen((context) => {
                    return !IsApiRequest(context.Request);                
                }, (mvcApp) => {
                    mvcApp.UseCookieAuthentication(new CookieAuthenticationOptions()
                    {
                        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                        LoginPath = new PathString("/account/index"),
                        Provider = new CookieAuthenticationProvider()
                    });
                });
            app.UseAutofacMiddleware(AutofacConfig.Container);
        }
    

    【讨论】:

      猜你喜欢
      • 2011-09-13
      • 2011-02-21
      • 2023-03-08
      • 2015-07-01
      • 1970-01-01
      • 2012-01-20
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      相关资源
      最近更新 更多