Не удалось получить ответ - сервер не может добавить заголовок после отправки заголовков HTTP - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть проект .NET MVC, и я использую контроллеры API внутри проекта для API REST.Аутентификация, используемая в проекте, основана на 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 Сообщение о событии: произошло необработанное исключение.Время события: 14.02.2009 19:04:10 Время события (UTC): 14.02.2009 8:04:10 Идентификатор события: 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 (ключ строки, значения String []) в Microsoft.Owin.Infrastructure.OwinHelpers.AppendHeaderUnmodified (IDictionary 2 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.AuthenticationMiddleware 1.d__0.MoveNext () --- Конец трассировки стека из предыдущего местоположения, в котором было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) в Microsoft.AspNet.Identity.Owin.IdentityFactoryMiddleware 2.<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.IdentityFactoryMiddleware 2.d__5.MoveNext () --- Конец трассировки стека из предыдущего расположения, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача-задача) в Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegraxtSendline.IntegratedSendline.IntegraTeSign.IntegratedSepeConneD_Love.IntegraTeSpeed.Intege.из предыдущего местоположения, в котором было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача-задача) в Microsoft.Owin.Host.InipePtegratetegrateted System.d__2.MoveNext () --- Конец трассировки стека от предыдущего местоположения, где было сгенерировано исключение --- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () в Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork (IAsyncResult ar) на System.Web.HttpApplication.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () на System.Web.HttpApplication.ExecuteStep (IExecutionStep * * * * * 10 * 10 * 10 * 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;

1 Ответ

0 голосов
/ 15 февраля 2019

Вы перепутали 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);
    }
...