9

私の最後の投稿に基づいて、バッチ処理を機能させることができました...ある時点まで。ルート固有のハンドラーの登録に加えて、2 つの委任ハンドラーもあります。

  1. ユーザーを認証する
  2. ロギング

バッチ ハンドラーは委任ハンドラーを経由して、ユーザーを認証し、要求をログに記録します。messagehandlerinvoker が子/ネストされたリクエストの送信を開始すると、次の例外がスローされます。

System.ArgumentException was unhandled by user code
  HResult=-2147024809
  Message=The 'DelegatingHandler' list is invalid because the property 'InnerHandler' of 'AuthenticationMessageHandler' is not null.
Parameter name: handlers
  Source=System.Net.Http.Formatting
  ParamName=handlers
  StackTrace:
       at System.Net.Http.HttpClientFactory.CreatePipeline(HttpMessageHandler innerHandler, IEnumerable`1 handlers)
       at System.Web.Http.HttpServer.Initialize()
       at System.Web.Http.HttpServer.<EnsureInitialized>b__3()
       at System.Threading.LazyInitializer.EnsureInitializedCore[T](T& target, Boolean& initialized, Object& syncLock, Func`1 valueFactory)
       at System.Threading.LazyInitializer.EnsureInitialized[T](T& target, Boolean& initialized, Object& syncLock, Func`1 valueFactory)
       at System.Web.Http.HttpServer.EnsureInitialized()
       at System.Web.Http.HttpServer.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
       at System.Net.Http.HttpMessageInvoker.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
       at RoutingRequest.Service.Startup.BatchMessageHandler.<>c__DisplayClassd.<PrcoessRequest>b__b(Task`1 m) in C:\CEI\Clients\Footlocker.com\FL - Vendor Routing Portal\source\RoutingRequest.Service\Startup\BatchMessageHandler.cs:line 45
       at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()
       at System.Threading.Tasks.Task.Execute()
  InnerException: 

不足している構成オプションはありますか、または委任ハンドラーをバイパスする必要がありますか?

ここで編集 は私の認証ハンドラです。

public class AuthenticationMessageHandler
    : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        SetCurrentUser(request);
        return base.SendAsync(request, cancellationToken);
    }

    private void SetCurrentUser(HttpRequestMessage request)
    {
        var values = new List<string>().AsEnumerable();
        if (request.Headers.TryGetValues("routingrequest-username", out values) == false) return;

        var username = values.First();

        var user = Membership.GetUser(username, true);
        if (user == null)
        {
            var message = string.Format("membership information for '{0}' could not be found.", username);
            throw new HttpRequestException(message);
        }

        var roles = Roles.GetRolesForUser(username);

        Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity(user.UserName), roles);
    }
}

Kiran の回答に基づいて、サブクラス化された httpserver は 1 つの問題を修正し、別の問題を導入します。ロール プロバイダーで null 参照例外が発生しています。それを今調べています。

4

2 に答える 2

1

バッチ処理なしでこのエラーが発生しました。私はHttpClientFactory自分のを作りましたHandlerFactory

コンストラクターでメソッドを呼び出し、HandlerFactory.Create()作成した結果のハンドラーを格納します。

System.Net.Http.HttpClientFactory.Create(...)これらは、ファクトリが新しい を作成する必要があるときはいつでもメソッドに渡されますHttpClient

ただし、ハンドラー自体が .NET コードによって変更され、再利用できない状態のままになるため、1 回の呼び出しにのみ適しています。

コンストラクターを変更して、事前にハンドラーを作成しないようにしましたが、毎回です。それは今動作します。

于 2016-01-27T18:18:28.210 に答える