12

私が求めていたものに近いと思われるこの宝石に出会いました。ただし、参照アセンブリから既に作成されたコントローラーを使用したいと考えています。

私の最初のクラックは、アセンブリを参照し、元の webAPI プロジェクトと同じようにルーティング ルールを設定することでしたが、セルフホステッド サービスを呼び出そうとするたびに 400 が返されます。私は Fiddler を使用してリクエストの内部を調べました。アドレスの違いを除けば、webAPI プロジェクトと自己ホスト型プロジェクトに対するリクエストは同じです。

これは比較的簡単なはずですが、受け入れられる答えが見つかりませんでした。

4

3 に答える 3

10

Praveen と Janushirsha の以前の投稿は、私を正しい方向に導きます。ここで再開します。

// Not reliable in Release mode :
Type controllerType = typeof(ReferencedControllers.ControllerType);

したがって、次のように置き換える必要がありますIAssembliesResolver

HttpConfiguration config = new HttpConfiguration();
config.Services.Replace(typeof(IAssembliesResolver), new CustomAssembliesResolver());

の実装例を次に示します。CustomAssembliesResolver

using System.Web.Http.Dispatcher;
internal class CustomAssembliesResolver : DefaultAssembliesResolver
{
    public override ICollection<System.Reflection.Assembly> GetAssemblies()
    {
        var assemblies = base.GetAssemblies();

        // Interestingly, if we push the same assembly twice in the collection,
        // an InvalidOperationException suggests that there is different 
        // controllers of the same name (I think it's a bug of WebApi 2.1).
        var customControllersAssembly = typeof(AnotherReferencedAssembly.MyValuesController).Assembly;
        if (!assemblies.Contains(customControllersAssembly))
            assemblies.Add(customControllersAssembly);

        return assemblies;
    }
}

このコードは、サード パーティのアセンブリが参照されていない場合や、アセンブリのバインディングが必要な場合に簡単に適用できます。

この助けを願っています。

于 2014-06-26T15:27:41.203 に答える
8

これは既知の問題のようです。.NET に、必要なコントローラーを使用してアセンブリを強制的に読み込ませる必要があります。

Web API をセルフ ホストする前に、ランタイムによって読み込まれる参照アセンブリから型を取得する必要があります。このようなもの:

Type controllerType = typeof(ReferencedControllers.ControllerType);

これにより、このアセンブリからコントローラーが読み込まれ、404 エラーは発生しません。

于 2012-07-05T07:54:01.723 に答える
3

このリンクは、同じ問題で私の一日を救った:) ...

selfhost webapi 構成に合わせて、以下のステートメントを変更するだけです。

GlobalConfiguration.Configuration.Services.Replace(typeof(IAssembliesResolver), new CustomAssemblyResolver());

var config = new HttpSelfHostConfiguration("http://localhost:8081");
        config.Services.Replace(typeof(IAssembliesResolver), new CustomAssemblyResolver());
于 2012-12-15T16:23:51.963 に答える