IIS не находит angular заголовок запроса - PullRequest
0 голосов
/ 28 мая 2020

Мой IIS не может получить requestHeader от angular. Я нашел похожие вопросы, но ни на один из них нет хорошего ответа, поэтому, пожалуйста, не указывайте как повторяющийся вопрос.

Вот мой angular код:

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable } from 'rxjs';
@Injectable({
  providedIn: 'root'
})
export class CustomHttpService {

  constructor(private http:HttpClient) { }

  get(url:string,userName:any, password:any):Observable<any>{
    let headers = new HttpHeaders({'username':userName, 'Password':password});
    return this.http.get('https://localhost:44345/api/'+url, {headers});
  }
  //other code...
          }

Вот код на C#:

    public class ResponseHandler : DelegatingHandler
{
    async protected override Task<HttpResponseMessage>
SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {

        try
        {

            var b = request.Headers.GetValues("username").FirstOrDefault();
        }
        catch (Exception ex)
        {
            //handle exception...
        }
        try
        {

            var c = request.Headers.GetValues("Password").FirstOrDefault();
        }
        catch (Exception ex)
        {
            //handle exception...
        }
        HttpResponseMessage response = await base.SendAsync(request, cancellationToken);

        return response;
    }
}

На стороне C# я получаю исключение - заголовок не найден. В чем может быть проблема?

1 Ответ

0 голосов
/ 28 мая 2020

Предполагается, что вы уже правильно применили DelegateHandler к конвейеру запросов.

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {

        config.MessageHandlers.Add(new MessageHandler2());


        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

Наиболее вероятно, что включение функции CORS мешало заголовкам Http, добавленным из внешнего интерфейса. При условии, что вы просто проверяете ошибку на стороне сервера, попробуйте проверить ошибку на стороне клиента, отображаемую в браузере. Это может быть ошибка ниже:

Имя пользователя поля заголовка запроса не разрешено Access-Control-Allow-Headers в предварительном ответе.

Возьмите модуль IIS CORS ( расширение для решения проблемы CORS в IIS) в качестве примера. После установки IIS CORS нам нужно добавить некоторые исключения:

<system.webServer>
    <cors enabled="true">
      <add origin="*">
<allowHeaders allowAllRequestedHeaders="true" />
</add>
    </cors>

Тогда Http Headers работает правильно.
enter image description here
App.component.ts

export class AppComponent {
  title = 'my angular';
  data='';
  private url="https://vabqia593vm:8734/api/values"
  constructor(
    private http: HttpClient
  ){
  }
  getData():Observable<string>{
    return this.http.get<string>(this.url,{responseType:'json'});
  }
ngOnInit(){
    let myheaders = new HttpHeaders({'username':"Abraham", 'Password':"123456"});
    this.http.get(this.url, {headers:myheaders,responseType:"text"}).subscribe((res:any)=>{
      console.log(res);
      this.data=res;
    })
}
}

MessageHandler.

    public class MessageHandler2 : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(
  HttpRequestMessage request, CancellationToken cancellationToken)
    {
        StringBuilder sb = new StringBuilder();
        foreach (var item in request.Headers)
        {
            sb.Append(item.Key.ToString()+" : "+item.Value.FirstOrDefault()+"\n");
        }

        // Create the response.
        var response = new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new StringContent(sb.ToString())
        };

        var tsc = new TaskCompletionSource<HttpResponseMessage>();
        tsc.SetResult(response);   // Also sets the task state to "RanToCompletion"
        return tsc.Task;
    }
}

Не стесняйтесь, позвольте мне узнать, существует ли проблема.

...