3

次のパッケージが Azure ワーカー ロールにインストールされている場合:

  <package id="Microsoft.AspNet.WebApi.Client" version="5.1.0" targetFramework="net451" />
  <package id="Microsoft.AspNet.WebApi.Core" version="5.1.0" targetFramework="net451" />
  <package id="Microsoft.AspNet.WebApi.OData" version="5.1.0" targetFramework="net451" />
  <package id="Microsoft.AspNet.WebApi.Owin" version="5.1.0" targetFramework="net451" />
  <package id="Microsoft.AspNet.WebApi.OwinSelfHost" version="5.1.0" targetFramework="net451" />
  <package id="Microsoft.Data.Edm" version="5.6.0" targetFramework="net451" />
  <package id="Microsoft.Data.OData" version="5.6.0" targetFramework="net451" />
  <package id="Microsoft.Data.Services.Client" version="5.6.0" targetFramework="net451" />
  <package id="Microsoft.Owin" version="2.0.2" targetFramework="net451" />
  <package id="Microsoft.Owin.Host.HttpListener" version="2.0.2" targetFramework="net451" />
  <package id="Microsoft.Owin.Hosting" version="2.0.2" targetFramework="net451" />
  <package id="Microsoft.WindowsAzure.ConfigurationManager" version="2.0.3" targetFramework="net451" />
  <package id="Newtonsoft.Json" version="5.0.8" targetFramework="net451" />
  <package id="Owin" version="1.0" targetFramework="net451" />
  <package id="RavenDB.Client" version="2.5.2750" targetFramework="net451" />
  <package id="System.Spatial" version="5.6.0" targetFramework="net451" />
  <package id="Unity" version="3.0.1304.1" targetFramework="net451" />
  <package id="Unity.WebAPI" version="5.1" targetFramework="net451" />
  <package id="WindowsAzure.Storage" version="3.0.2.0" targetFramework="net451" />

IoC コンテナーを登録しようとしない限り、アプリケーションを動作させることができます。

この行を Startup.cs ファイルに挿入するとすぐに、次のようになります。

config.DependencyResolver = new UnityDependencyResolver(new UnityContainer());

次の例外が発生します。

タイプ 'System.Reflection.TargetInvocationException' の未処理の例外が Microsoft.WindowsAzure.ServiceRuntime.dll で発生しました

まったく同じコードをコンソール アプリケーションに配置すると、例外をスローすることなく動作します。これが私の WorkerRole.cs クラスの完全な内容です。

    public class WorkerRole : RoleEntryPoint
    {
        IDisposable _app;

        public override void Run()
        {
            Trace.TraceInformation("Timbre.Catalogue.ApiRole entry point called");

            while (true)
            {
                Thread.Sleep(10000);
                Trace.TraceInformation("Working");
            }
        }

        public override bool OnStart()
        {
            ServicePointManager.DefaultConnectionLimit = 12;

            var endpoint = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["ApiEndpoint"];
            var baseUri = string.Format("{0}://{1}", endpoint.Protocol, endpoint.IPEndpoint);
            Trace.TraceInformation("Starting OWIN at {0}", baseUri);
            _app = WebApp.Start<Startup>(new StartOptions(baseUri));

            return base.OnStart();
        }

        public override void OnStop()
        {
            if (_app != null)
                _app.Dispose();

            base.OnStop();
        }
    }

彼女のは、私の Startup.cs クラスの完全なコンテンツです。

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            var config = new HttpConfiguration();
            config.Formatters.Remove(config.Formatters.XmlFormatter);
            config.MapHttpAttributeRoutes();
            config.DependencyResolver = new UnityDependencyResolver(new UnityContainer());

            app.UseWebApi(config);
        }
    }

次のパッケージで Castle.Windsor を使用しようとすると、同じ問題が発生します。

<package id="WebApiContrib.IoC.CastleWindsor" version="0.10.0.0" targetFramework="net451" />

代わりにこのコード行:

config.DependencyResolver = new WindsorResolver(new WindsorContainer().Install(FromAssembly.This()));

ここで何が間違っているのか、誰かが私に手がかりを与えることができますか? コンソール アプリケーションで完全に動作するため、Azure コンピューティング エミュレーターに問題があると思われますが、それ以上の診断方法はわかりません。

4

1 に答える 1

3

5.1 バージョンのUnity.WebApinuget パッケージは5.0、Web API のバージョンを参照してビルドされました。そのため、Unity5.1を Web API のバージョンで動作させるにはバインディング リダイレクトが必要です。

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.1.0.0" newVersion="5.1.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

例外の詳細を把握することに関する後のコメントに関連しています。

Web API 5.1の新しいグローバル エラー処理機能をチェックアウトできます。以下はその一部です。

config.Services.Add(typeof(IExceptionLogger), new CustomExceptionLogger());

public class CustomExceptionLogger : ExceptionLogger
{
    public override void Log(ExceptionLoggerContext context)
    {
        //TODO: Log the exception details
        //context.Request
        //context.Exception
    }
}
于 2014-01-24T14:56:17.893 に答える