14

今日、WebApiアプリケーションで奇妙な動作に遭遇しました

protected void Application_Start() {

    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    GlobalConfiguration.Configuration
        .MessageHandlers.Add(new DummyMessageHandler());
}

そして、私のDelegatingHandlerは次のようになります。

public class DummyMessageHandler : DelegatingHandler {

    protected override Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken) {

*       if (request.Headers.Authorization.Scheme == "Basic")
            Thread.CurrentPrincipal = new GenericPrincipal(
                new GenericIdentity("Authenticated"), new string[0]);

        return base.SendAsync(request, cancellationToken);
    }
}

私が遭遇した問題は、委任ハンドラーが実行されていないことでした。*でマークされた行にブレークポイントがあり、コードの実行がそこで停止することはありません。

私のnugetpackages.configは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.AspNet.Mvc" version="4.0.20710.0" targetFramework="net40" />
  <package id="Microsoft.AspNet.Razor" version="2.0.20710.0" targetFramework="net40" />
  <package id="Microsoft.AspNet.Web.Optimization" version="1.0.0" targetFramework="net40" />
  <package id="Microsoft.AspNet.WebApi" version="4.0.20710.0" targetFramework="net40" />
  <package id="Microsoft.AspNet.WebApi.Client" version="4.1.0-alpha-120809" targetFramework="net40" />
  <package id="Microsoft.AspNet.WebApi.Core" version="4.0.20710.0" targetFramework="net40" />
  <package id="Microsoft.AspNet.WebApi.WebHost" version="4.0.20710.0" targetFramework="net40" />
  <package id="Microsoft.AspNet.WebPages" version="2.0.20710.0" targetFramework="net40" />
  <package id="Microsoft.Net.Http" version="2.0.20710.0" targetFramework="net40" />
  <package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net40" />
  <package id="Newtonsoft.Json" version="4.5.8" targetFramework="net40" />
  <package id="WebGrease" version="1.1.0" targetFramework="net40" />
</packages>

私はこれを長い間見ていますが、私が欠けているものを指摘してもらえますか?ありがとうございました

4

2 に答える 2

13

あなたがしたことは正しいです。が Web API コントローラーアクションを呼び出したときにのみ実行されるため、問題が発生している可能性があります。DelegatingHandler例えば:

これはApiController であるため、 Message Handler を呼び出します。

public class ValuesController : ApiController
{
    // GET api/values
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }
}

これは単なるコントローラーであるため、そうではありません。

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Title = "Home Page";

        return View();
    }
}

Web API コントローラー アクションを呼び出していることを確認してください。そうしないと、デバッガーがブレーク ポイントにヒットしません。

于 2014-05-06T19:38:33.547 に答える
6

global.asax ではなく、WebApiConfig ファイルにハンドラーを登録する必要があります。

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

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


    }
于 2014-02-12T22:54:38.380 に答える