CORS的WebAPI和Ninject [英] WebAPI CORS and Ninject

查看:354
本文介绍了CORS的WebAPI和Ninject的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有了ninject一个C#的WebAPI项目和所有的get功能正在工作。
但是每一次我尝试发布一次我从API是不允许的方法的回应。

我读了几个地方,这是因为当API被拒绝交叉起源的电话。

所以我用包管理器控制台,并安装了Microsoft.AspNet.WebApi.Cors
纽金特包和遵循的指示按照文章的http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api.

我的问题是现在Ninject不工作,但扔了以下内容:
试图通过法System.Web.Http.GlobalConfiguration..cctor()来接入领域System.Web.Http.GlobalConfiguration.CS $<> 9__CachedAnonymousMethodDelegate2'。失败}

谁能帮助我在这里?

引发错误的路线是:
System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver =新Ninject.WebApi.DependencyResolver.NinjectDependencyResolver(内核);

Ninject配置文件

 公共静态类NinjectWebCommon
{
    私人静态只读引导程序引导程序=新的引导程序();    ///<总结>
    ///启动应用
    ///< /总结>
    公共静态无效的start()
    {
        DynamicModuleUtility.RegisterModule(typeof运算(OnePerRequestHttpModule));
        DynamicModuleUtility.RegisterModule(typeof运算(NinjectHttpModule));
        bootstrapper.Initialize(CreateKernel);
    }    ///<总结>
    ///停止应用程序。
    ///< /总结>
    公共静态无效停止()
    {
        bootstrapper.ShutDown();
    }    ///<总结>
    ///创建将管理应用程序的内核。
    ///< /总结>
    ///<收益方式>创建的内核和LT; /回报>
    私有静态的iKernel CreateKernel()
    {
        VAR内核=新StandardKernel();
        kernel.Bind<&Func键LT;的iKernel>方式>()ToMethod(CTX =>()=>新建引导程序()内核。);
        kernel.Bind&所述; IHttpModule的方式>()到< HttpApplicationInitializationHttpModule>();        RegisterServices(内核);        System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver =新Ninject.WebApi.DependencyResolver.NinjectDependencyResolver(内核);        返回内核;
    }    ///<总结>
    ///装入模块或在这里注册您服务!
    ///< /总结>
    ///< PARAM NAME =内核方式>内核< /参数>
    私有静态无效RegisterServices(内核的iKernel)
    {
        kernel.Bind<MyCompany.Services.Domain.Repositories.IWorkRepository>().To<MyCompany.Services.Domain.Repositories.WorkRepository>();
        kernel.Bind<MyCompany.Services.Domain.Services.IAuthenticationService>().To<MyCompany.Services.Domain.Services.AuthenticationService>();
        kernel.Bind<MyCompany.Services.Domain.Utilties.IServiceFactory>().To<MyCompany.Services.Domain.Utilties.ServiceFactory>();
    }
}

Web配置文件

 &LT;?XML版本=1.0编码=UTF-8&GT?;
&LT;! -
  有关如何配置ASP.NET应用程序的更多信息,请访问:
  http://go.microsoft.com/fwlink/?LinkId=169433
   - &GT;
&LT;结构&gt;
  &LT; configSections&GT;
    &LT;! - 有关Entity Framework的配置的详细信息,请访问http://go.microsoft.com/fwlink/?LinkID=237468 - &GT;
    &lt;节名称=的EntityFrameworkTYPE =System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection,的EntityFramework,版本5.0.0.0 =文化=中性公钥= b77a5c561934e089requirePermission =FALSE/&GT;
  &LT; / configSections&GT;
  &LT;! -
        应用程序设置
     - &GT;
  &LT;&的appSettings GT;
    &LT;添加键=网页:版本值=2.0.0.0/&GT;
    &LT;添加键=网页:启用VALUE =FALSE/&GT;
    &LT;添加关键=preserveLoginUrlVALUE =真/&GT;
    &LT;添加键=ClientValidationEnabledVALUE =真/&GT;
    &LT;添加键=UnobtrusiveJavaScriptEnabledVALUE =真/&GT;
  &LT; /的appSettings&GT;
  &LT;! -
        连接字符串
     - &GT;
  &LT;&是connectionStrings GT;
    &LT; - 编辑:!删除 - &GT;
  &LT; /&是connectionStrings GT;
  &LT;! -
        系统网络
     - &GT;
  &LT;&的System.Web GT;
    &LT;编译调试=真targetFramework =4.5/&GT;
    &LT;的httpRuntime targetFramework =4.5/&GT;
    &LT;身份验证模式=无/&GT;
    &LT;网页和GT;
      &LT;&命名空间GT;
        &LT;添加命名空间=System.Web.Helpers/&GT;
        &LT;添加命名空间=System.Web.Mvc/&GT;
        &LT;添加命名空间=System.Web.Mvc.Ajax/&GT;
        &LT;添加命名空间=System.Web.Mvc.Html/&GT;
        &LT;添加命名空间=System.Web.Optimization/&GT;
        &LT;添加命名空间=System.Web.Routing/&GT;
        &LT;添加命名空间=System.Web.WebPages/&GT;
      &LT; /命名空间&GT;
    &LT; /页&GT;
    &LT;型材defaultProvider =DefaultProfileProvider&GT;
      &LT;供应商&GT;
        &LT;添加名称=DefaultProfileProviderTYPE =System.Web.Providers.DefaultProfileProvider,System.Web.Providers,版本= 1.0.0.0,文化=中性公钥= 31bf3856ad364e35的connectionStringName =DefaultConnection的applicationName =// &GT;
      &LT; /供应商&GT;
    &LT; / profile文件&GT;
    &LT;会员defaultProvider =DefaultMembershipProvider&GT;
      &LT;供应商&GT;
        &LT;添加名称=DefaultMembershipProviderTYPE =System.Web.Providers.DefaultMembershipProvider,System.Web.Providers,版本= 1.0.0.0,文化=中性公钥= 31bf3856ad364e35的connectionStringName =DefaultConnectionenablePasswordRetrieval =false的enablePasswordReset设置=真requiresQuestionAndAnswer =假requiresUniqueEmail =假maxInvalidPasswordAttempts =5minRequiredPasswordLength =6minRequiredNonalphanumericCharacters =0passwordAttemptWindow =10的applicationName =//&GT;
      &LT; /供应商&GT;
    &LT; /会员&GT;
    &LT; roleManager defaultProvider =DefaultRoleProvider&GT;
      &LT;供应商&GT;
        &LT;添加名称=DefaultRoleProviderTYPE =System.Web.Providers.DefaultRoleProvider,System.Web.Providers,版本= 1.0.0.0,文化=中性公钥= 31bf3856ad364e35的connectionStringName =DefaultConnection的applicationName =// &GT;
      &LT; /供应商&GT;
    &LT; / roleManager&GT;
    &LT;的sessionState模式=是InProccustomProvider =DefaultSessionProvider&GT;
      &LT;供应商&GT;
        &LT;添加名称=DefaultSessionProviderTYPE =System.Web.Providers.DefaultSessionStateProvider,System.Web.Providers,版本= 1.0.0.0,文化=中性公钥= 31bf3856ad364e35的connectionStringName =DefaultConnection/&GT;
      &LT; /供应商&GT;
    &LT; /&的sessionState GT;
  &LT; /system.web>
  &LT;! -
        系统Web服务器
     - &GT;
  &LT; system.webServer&GT;
    &LT;验证validateIntegratedModeConfiguration =FALSE/&GT;
    &LT;&处理GT;
      &LT;清除NAME =ExtensionlessUrlHandler-ISAPI-4.0_32bit/&GT;
      &LT;清除NAME =ExtensionlessUrlHandler-ISAPI-4.0_64bit/&GT;
      &LT;清除NAME =ExtensionlessUrlHandler - 集成 - 4.0/&GT;
      &LT;添加名称=ExtensionlessUrlHandler-ISAPI-4.0_32bitPATH =*。动词=GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS模块=IsapiModulescriptProcessor ​​=%WINDIR%\\ Microsoft.NET \\框架\\ v4.0.30319 \\ ASPNET_ISAPI.DLLpreCondition = classicMode,runtimeVersionv4.0,bitness32responseBufferLimit =0/&GT;
      &LT;添加名称=ExtensionlessUrlHandler-ISAPI-4.0_64bitPATH =*。动词=GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS模块=IsapiModulescriptProcessor ​​=%WINDIR%\\ Microsoft.NET \\ Framework64 \\ v4.0.30319 \\ ASPNET_ISAPI.DLLpreCondition = classicMode,runtimeVersionv4.0,bitness64responseBufferLimit =0/&GT;
      &LT;添加名称=ExtensionlessUrlHandler - 集成 - 4.0PATH =*。动词=GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONSTYPE =System.Web.Handlers.TransferRequestHandlerpreCondition =integratedMode,runtimeVersionv4.0/&GT;
      &LT;清除NAME =OPTIONSVerbHandler/&GT;
      &LT;清除NAME =TRACEVerbHandler/&GT;
    &LT; /处理器&GT;
    &LT; httpProtocol&GT;
      &LT; customHeaders&GT;
        &LT;! - 添加以下自定义的HTTPHeader将帮助prevent CORS从停止请求 - &GT;
        &LT;添加名称=访问控制允许来源VALUE =*/&GT;
        &LT;添加名称=访问控制 - 允许 - 头VALUE =Content-Type的/&GT;
      &LT; / customHeaders&GT;
    &LT; / httpProtocol&GT;
  &LT; /system.webServer>
  &LT;! -
        运行
     - &GT;
  &LT;&运行GT;
    &LT; assemblyBinding的xmlns =瓮:架构 - 微软COM:asm.v1&GT;
      &LT; dependentAssembly&GT;
        &LT; assemblyIdentity名称=System.Web.Helpers公钥=31bf3856ad364e35/&GT;
        &LT; bindingRedirect oldVersion =1.0.0.0-2.0.0.0NEWVERSION =2.0.0.0/&GT;
      &LT; / dependentAssembly&GT;
      &LT; dependentAssembly&GT;
        &LT; assemblyIdentity名称=System.Web.Mvc公钥=31bf3856ad364e35/&GT;
        &LT; bindingRedirect oldVersion =0.0.0.0-4.0.0.0NEWVERSION =4.0.0.0/&GT;
      &LT; / dependentAssembly&GT;
      &LT; dependentAssembly&GT;
        &LT; assemblyIdentity名称=System.Web.WebPages公钥=31bf3856ad364e35/&GT;
        &LT; bindingRedirect oldVersion =0.0.0.0-2.0.0.0NEWVERSION =2.0.0.0/&GT;
      &LT; / dependentAssembly&GT;
      &LT; dependentAssembly&GT;
        &LT; assemblyIdentity名称=System.Net.Http.Formatting公钥=31bf3856ad364e35文化=中性/&GT;
        &LT; bindingRedirect oldVersion =0.0.0.0-5.0.0.0NEWVERSION =5.0.0.0/&GT;
      &LT; / dependentAssembly&GT;
      &LT; dependentAssembly&GT;
        &LT; assemblyIdentity名称=System.Web.Http公钥=31bf3856ad364e35文化=中性/&GT;
        &LT; bindingRedirect oldVersion =0.0.0.0-5.0.0.0NEWVERSION =5.0.0.0/&GT;
      &LT; / dependentAssembly&GT;
    &LT; / assemblyBinding&GT;
  &LT; /运行&GT;
  &LT;&的EntityFramework GT;
    &LT; defaultConnectionFactory TYPE =System.Data.Entity.Infrastructure.SqlConnectionFactory,的EntityFramework/&GT;
  &LT; /&的EntityFramework GT;
&LT; /结构&gt;


解决方案

您必须记住您的Microsoft.AspNet.WebApi添加或更新到RC版:
http://www.nuget.org/packages/Microsoft.AspNet.WebApi

在程序包管理器控制台:

  PM&GT;安装封装Microsoft.AspNet.WebApi  -  prePM&GT;安装封装Microsoft.AspNet.WebApi.Client  -  prePM&GT;安装封装Microsoft.AspNet.WebApi.Core  -  pre

I have a c# WebAPI project that has ninject and all the get functions are working. However every time i try to post i get a "Method Not Allowed" response from the api.

I have read a few places that this is cause when the api is refusing cross origin calls.

So i used the package manager console and installed the Microsoft.AspNet.WebApi.Cors nugent package and followed the instructions as per the article http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api.

My issue is now the Ninject is not working but throwing the following: Attempt by method 'System.Web.Http.GlobalConfiguration..cctor()' to access field 'System.Web.Http.GlobalConfiguration.CS$<>9__CachedAnonymousMethodDelegate2' failed."}

Can anyone help me here?

the line throwing the error is: System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = new Ninject.WebApi.DependencyResolver.NinjectDependencyResolver(kernel);

Ninject Configuration File

public static class NinjectWebCommon
{
    private static readonly Bootstrapper bootstrapper = new Bootstrapper();

    /// <summary>
    /// Starts the application
    /// </summary>
    public static void Start()
    {
        DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
        DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
        bootstrapper.Initialize(CreateKernel);
    }

    /// <summary>
    /// Stops the application.
    /// </summary>
    public static void Stop()
    {
        bootstrapper.ShutDown();
    }

    /// <summary>
    /// Creates the kernel that will manage your application.
    /// </summary>
    /// <returns>The created kernel.</returns>
    private static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
        kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

        RegisterServices(kernel);

        System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = new Ninject.WebApi.DependencyResolver.NinjectDependencyResolver(kernel);

        return kernel;
    }

    /// <summary>
    /// Load your modules or register your services here!
    /// </summary>
    /// <param name="kernel">The kernel.</param>
    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<MyCompany.Services.Domain.Repositories.IWorkRepository>().To<MyCompany.Services.Domain.Repositories.WorkRepository>();
        kernel.Bind<MyCompany.Services.Domain.Services.IAuthenticationService>().To<MyCompany.Services.Domain.Services.AuthenticationService>();
        kernel.Bind<MyCompany.Services.Domain.Utilties.IServiceFactory>().To<MyCompany.Services.Domain.Utilties.ServiceFactory>();
    }
}

Web Configuration File

<?xml version="1.0" encoding="utf-8"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <!-- 
        Application Settings 
    -->
  <appSettings>
    <add key="webpages:Version" value="2.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="PreserveLoginUrl" value="true" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>
  <!-- 
        Connection Strings 
    -->
  <connectionStrings>
    <!-- EDITED : Removed -->
  </connectionStrings>
  <!-- 
        System Web 
    -->
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
    <authentication mode="None" />
    <pages>
      <namespaces>
        <add namespace="System.Web.Helpers" />
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Web.WebPages" />
      </namespaces>
    </pages>
    <profile defaultProvider="DefaultProfileProvider">
      <providers>
        <add name="DefaultProfileProvider" type="System.Web.Providers.DefaultProfileProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" />
      </providers>
    </profile>
    <membership defaultProvider="DefaultMembershipProvider">
      <providers>
        <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" />
      </providers>
    </membership>
    <roleManager defaultProvider="DefaultRoleProvider">
      <providers>
        <add name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" applicationName="/" />
      </providers>
    </roleManager>
    <sessionState mode="InProc" customProvider="DefaultSessionProvider">
      <providers>
        <add name="DefaultSessionProvider" type="System.Web.Providers.DefaultSessionStateProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" />
      </providers>
    </sessionState>
  </system.web>
  <!-- 
        System Web Server
    -->
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
    </handlers>
    <httpProtocol>
      <customHeaders>
        <!-- Adding the following custom HttpHeader will help prevent CORS from stopping the Request-->
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>
  <!-- 
        Runtime
    -->
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Net.Http.Formatting" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  </entityFramework>
</configuration>

解决方案

You must remember to Add or Update your Microsoft.AspNet.WebApi to the RC version: http://www.nuget.org/packages/Microsoft.AspNet.WebApi

In the Package Manager Console:

PM> Install-Package Microsoft.AspNet.WebApi -Pre

PM> Install-Package Microsoft.AspNet.WebApi.Client -Pre

PM> Install-Package Microsoft.AspNet.WebApi.Core -Pre

etc

这篇关于CORS的WebAPI和Ninject的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆