2017-09-08 4 views
1

ミドルウェアクラスがなくなるまで正常に実行される3つのミドルウェアクラスがあります。ミドルウェアクラスが呼び出された後、もはや私はルータにリクエストを渡したいと思います。OWINミドルウェアの後にIAppBuilder.UseWebApiを使用する方法

これを行う最善の方法は何ですか?

例えば、私はこのコードを持っている:

// Register middleware. Order is important! 
app.Use<Authentication>(); 
app.Use<Logging>(); 
app.Use<Example>(configExample); 

これはExampleその後、Loggingその後、expected.Onとしてすべての要求最初Authenticationの実行を動作します。

私は、プログラムの起動時に、これらのapp.Use<>()行がデリゲートを渡すことによって適切なミドルウェアをインスタンス化することがわかります。その代理人には、次のミドルウェアクラスを指すプロパティTargetが含まれています。明らかな理由から、Exampleクラスに渡されたデリゲートは空です(チェーン内の最後のミドルウェアクラスであるため)。

最後にチェーン化されたミドルウェアクラスのコードを変更することなく(私は重要であることを望んでいません)、どのようにルータを呼び出すことができますか?私のルータは、このようなものになります。

HttpConfiguration config = new HttpConfiguration(); 
config.Routes.MapHttpRoute(
    ... 
); 
config.Routes.MapHttpRoute(
    ... 
); 
etc. 
app.UseWebApi(config); 

を私は答えはミドルウェアが渡されていることであるミドルウェアチェーン

答えて

0

を終了する論理的な方法が存在しなければならないので、私の理解ではいくつかの大きな論理的ギャップが存在しなければならないと思いますミドルウェアがなくなると自動的にコントローラに送信されます。私が従っていたチュートリアルでは、これを防ぐミドルウェアのコード行を使用していました。

ミドルウェアを作成するための手順は、ここでは https://www.codeproject.com/Articles/864725/ASP-NET-Understanding-OWIN-Katana-and-the-Middlewaでした。

そして、この2行:

IOwinContext context = new OwinContext(environment); 
await context.Response.WriteAsync("<h1>Hello from Example " + _configExample + "</h1>"); 

は切り捨てられ、コントローラ(か何か)からの応答が生じました。これはコードです:

using System; 
using System.Collections.Generic; 
using System.Threading.Tasks; 

namespace Avesta.ASP.Middleware 
{ 
    using AppFunc = Func<IDictionary<string, object>, Task>; 

    public class Example 
    { 
     AppFunc _next; 
     string _configExample; 

     public Example(AppFunc next, string configExample) 
     { 
      _next = next; 
      _configExample = configExample; 
     } 

     public async Task Invoke(IDictionary<string, object> env) 
     { 
      //IOwinContext context = new OwinContext(environment); 
      //await context.Response.WriteAsync("<h1>Hello from Example " + _configExample + "</h1>"); 
      await _next.Invoke(env); 
     } 
    } 
} 
関連する問題