引用控制器我碰到this宝石,这似乎是接近我想要的东西。但是,我想使用已引用程序集中的已编写控制器。自托管的WebAPI应用程序从不同的装配
我第一次破裂是引用的程序集,设置路由规则中原来一样的WebAPI项目去,但我得到400S每次我尝试调用自托管服务时间。我已经通过Fiddler的内容挑选了内容,除了地址差异之外,针对webAPI项目和自托管项目的请求是相同的。
我觉得这应该是相对简单的,但我还没有找到一个可以接受的答案。
引用控制器我碰到this宝石,这似乎是接近我想要的东西。但是,我想使用已引用程序集中的已编写控制器。自托管的WebAPI应用程序从不同的装配
我第一次破裂是引用的程序集,设置路由规则中原来一样的WebAPI项目去,但我得到400S每次我尝试调用自托管服务时间。我已经通过Fiddler的内容挑选了内容,除了地址差异之外,针对webAPI项目和自托管项目的请求是相同的。
我觉得这应该是相对简单的,但我还没有找到一个可以接受的答案。
这似乎是一个已知的问题。您必须强制.NET使用您需要的控制器加载程序集。
之前自承载Web API,你应该检索要在运行时加载参考大会类型。就像这样:
Type controllerType = typeof(ReferencedControllers.ControllerType);
这应该从这个程序集加载控制器,它不会给你404错误。
我已经确认这是正确的信息。我的步骤:(1)创建新的MVC4项目,(2)创建新的类库项目,(3)将MVC4 WebAPI NuGet包添加到类库项目中(4)从Web项目中引用类库(5)将Web API控制器添加到类库项目(5)使用类似于上述建议代码的行修改'''Application_Start'''。我可以导航到类库项目中定义的webapi控制器,所有请求都按预期运行。 –
似乎适用于当前版本的WebAPI。谢谢,肖恩! – Ross
您的注意,该行:类型controllerType = typeof(ReferencedControllers。ControllerType);只能在调试模式下工作,在发布优化时忽略它.. – Janushirsha
这link救了我的一天同样的问题:)...
我只需要改变以下声明,以适应该selfhost的WebAPI配置。
GlobalConfiguration.Configuration.Services.Replace(typeof(IAssembliesResolver), new CustomAssemblyResolver());
与
var config = new HttpSelfHostConfiguration("http://localhost:8081");
config.Services.Replace(typeof(IAssembliesResolver), new CustomAssemblyResolver());
此链接保存了一天.....我有MS“简单的例子”,不分层。谢谢! – granadaCoder
上一页普利文和Janushirsha的帖子引我到正确的方向我继续在这里:
HttpConfiguration config = new HttpConfiguration();
config.Services.Replace(typeof(IAssembliesResolver), new CustomAssembliesResolver());
:
// Not reliable in Release mode :
Type controllerType = typeof(ReferencedControllers.ControllerType);
所以,你应该用替换IAssembliesResolver
下面是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;
}
}
此代码实现的一个例子,如果第三方组件没有被引用可以很容易地进行调整,或者如果你想晚集绑定。
希望得到这个帮助。
这帮助了很多。谢谢!我认为这应该是被接受的答案。 –
感谢您的评论。乐意效劳。 –
我很努力去理解你的例子。我正在制作一个启动webApi服务的组件。我想从外部应用程序注入控制器。这可能吗?它似乎只是神奇地发现控制器在它自己的项目中? (我不知道它是如何与这些... ...某种幕后反射魔术) –
由于OP显然已经放弃了这一问题,有其他人证实无论是提出的解决方案? –
未放弃,我从来没有解决问题的WebAPI版本解决问题。 – Ross
我刚刚验证了@cypressx提出的建议,它的工作方式如上所述。谢谢。 –