2

クラス ライブラリ内にいくつかの WebApi コントローラーがあり、IIS 内でそれらをホストしたいと考えています。コンソール アプリケーションまたは Windows サービス内でのセルフ ホスティングのソリューションは知っていますが、それはローカルでの使用にのみ適しています。IISでのホスティングに実際に理想的なAsp.Net Web/WebApiアプリケーション内のコントローラーアセンブリを解決するにはどうすればよいですか?

私は、異なるホスティング シナリオでのみこのアプローチのようなものを探しています: http://www.strathweb.com/2012/06/using-controllers-from-an-external-assembly-in-asp-net-web-api

4

1 に答える 1

1

これを行う最も簡単な方法は、属性ルーティングを活用することです

たとえば、ApiController を含むサンプル クラス ライブラリを考えてみましょう。属性ルーティングを使用して、クラスをルートで装飾できます。

//Inside API controller class library
[RoutePrefix("Persons")]
public class PersonController : ApiController
{
    [Route("")]
    public List<Person> GetAll()
    {
        List<Person> results = new List<Person>();

        try
        {
            //TODO: Call Data Access Layer
            //FORNOW: Mock up some data
            results.Add(new Person() { Name = "Ryan C" });
            results.Add(new Person() { Name = "Siavash R" });
        }
        catch
        {
            //TODO: Handle error
        }

        return results;
    }
}

上記のコードは、/Persons適切にルーティングされた HTTP リクエストに応答します。

IIS でホストされる WebApi プロジェクトで、次の操作を行う必要があります。

クラス ライブラリへの参照を追加する

私はこれがおそらく「当然」であることを知っていますが、これを形式としてここに置くだけです. WebApi プロジェクトの API コントローラー クラス ライブラリへの参照を追加する必要があります。

登録方法を作成する

App_Start\RouteConfig.csまたは newでApp_Start\WebApiConfig.cs、次のように を呼び出しますMapHttpAttributeRoutes();

//Inside App_Start\WebApiConfig.cs
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Map all Web API routes
        config.MapHttpAttributeRoutes();
    }
}

ASP.NET フレームワークは、参照されているアセンブリを検索し、パブリック ApiController 派生クラス (この場合は、属性ルーティング用に装飾されたクラス) を探すのに十分なほどスマートです。

Global.asax の呼び出し登録メソッド

最後の手順は、Global.asax ファイルで登録メソッドを実際に呼び出すことです。

//Inside Global.asax
public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
}

その後、あなたは行く準備ができているはずです!ローカルでテストし、完全な例を作成しましたが、問題なく動作します。必要に応じて、サンプル プロジェクトを github に投稿できますが、上記のコードが重要なポイントです。

への呼び出しを行うhttp://localhost:xxxx/Persons/と、次の結果になりました。

<ArrayOfPerson xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Ryancdotnet.WebApiClassLib.Model">
  <Person>
    <Name>Ryan C</Name>
  </Person>
  <Person>
    <Name>Siavash R</Name>
  </Person>
</ArrayOfPerson>

参考までに、必要に応じて、私の ApiController クラス ライブラリはこれらの Nuget パッケージを使用しました。どれが正確に必要かはわかりませんが、クラス ライブラリにはこれらで十分でした。

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net46" />
  <package id="Microsoft.Bcl" version="1.1.10" targetFramework="net46" />
  <package id="Microsoft.Bcl.Build" version="1.0.14" targetFramework="net46" />
  <package id="Microsoft.Net.Http" version="2.2.29" targetFramework="net46" />
  <package id="Newtonsoft.Json" version="6.0.4" targetFramework="net46" />
  <package id="System.Web.Http.Common" version="4.0.20126.16343" targetFramework="net46" />
</packages>

ハッピー API イング!

于 2016-07-01T04:45:58.173 に答える