我已经阅读了很多关于此的帖子,但仍然无法使其发挥作用。 我使用的是Visual Studio 2013.我创建了一个新的MVC 5项目,并认为使用新的facebook登录集成会很酷。它在我的电脑上运行在IIS Express中。
但是当我将它上传到生产服务器时,我不断收到非常烦人的" No owin.Environment项目已在上下文中找到"消息。
这就是我所做的。
我有默认的Startup.cs类,其中包含以下内容:
using Microsoft.AspNet.Identity;
using Microsoft.Owin;
using Microsoft.Owin.Security.Cookies;
using Owin;
using System.Web.Http;
[assembly: OwinStartupAttribute(typeof(Wodivate.Startup))]
namespace Wodivate
{
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
}
}
}
在App_Start中有一个Startup.Auth.cs文件,其中包含:
using Microsoft.AspNet.Identity;
using Microsoft.Owin;
using Microsoft.Owin.Security.Cookies;
using Owin;
namespace Wodivate
{
public partial class Startup
{
// For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
public void ConfigureAuth(IAppBuilder app)
{
// Enable the application to use a cookie to store information for the signed in user
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login")
});
// Use a cookie to temporarily store information about a user logging in with a third party login provider
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
// Uncomment the following lines to enable logging in with third party login providers
//app.UseMicrosoftAccountAuthentication(
// clientId: "",
// clientSecret: "");
//app.UseTwitterAuthentication(
// consumerKey: "",
// consumerSecret: "");
var facebookOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions()
{
AppId = "xxxxxxxxxxxxxxxxxxx",
AppSecret = "xxxxxxxxxxxxxxxxxxxxxxxxx"
};
facebookOptions.Scope.Add("email"); //We want to get user's email information by adding it in scope.
app.UseFacebookAuthentication(facebookOptions);
//app.UseGoogleAuthentication();
}
}
}
我的Web.config文件包含:
<add key="owin:AppStartup" value="Wodivate.Startup, Wodivate" />
<add key="owin:AutomaticAppStartup " value="false" />
我还确保关注No owin.Environment item was found in the context - only on server上的帖子并安装了Microsoft.Owin.Host.SystemWeb
还有其他人坚持这个吗?我已经打了3天了。
答案 0 :(得分:4)
我遇到了同样的问题,这是由IIS设置引起的。
我的IIS部署有一个顶级网站,下面有几个应用程序。您应确保站点级别的“应用程序设置”不与您的应用程序冲突。
在我的情况下,我在网站级别有“owin:AutomaticAppStartup = false”,这是我的应用程序继承的。
<强>要点:强>
修改强> 我发现你可以在web.config中添加以下appSetting来覆盖任何潜在的继承冲突。我建议先了解是否存在冲突,这样你就可以做出有根据的改变。
<add key="owin:AutomaticAppStartup" value="true"/>
答案 1 :(得分:3)
我需要另外一个web.config更改来解决这个问题:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
</system.webServer>
虽然我试过了this setting is discouraged:
<modules>
<remove name="Owin" />
<add name="Owin" type="Microsoft.Owin.Host.SystemWeb.OwinHttpModule, Microsoft.Owin.Host.SystemWeb" />
</modules>
但这给了我错误:
&#34;由于对象的当前状态&#34;
,操作无效并且我不确定那里发生了什么,是否是错误的模块或其他内容。
答案 2 :(得分:3)
您是否尝试过这样的事情?
<system.webServer>
<modules runAllManagedModulesForAllRequests="false" />
<handlers>
<remove name="StaticFile" />
<add name="OWIN" path="*" verb="*" type="Microsoft.Owin.Host.SystemWeb.OwinHttpHandler" />
</handlers>
</system.webServer>
答案 3 :(得分:2)
您是否已检查正在使用的应用池模式。 OWIN使用应用程序池的集成模式。它不会在clasic模式下工作。
答案 4 :(得分:1)
当您收到异常时,在上下文中找不到owin.Environment项目。&#39;来自Request.GetOwinContext(),它通常意味着OWIN启动类检测失败。
确保IIS在启动时在Startup.cs(在根文件夹中)中执行代码。要检查它是否在生产服务器上,我建议如下。 1)插入以下行:
...
System.Diagnostics.Trace.WriteLine("OwinStartup " + this.GetType().Namespace);
ConfigureAuth(app);
...
2)从这里获取DebugView实用程序:https://technet.microsoft.com/en-us/library/bb896647.aspx
3)以管理员身份执行DbgView.exe并确保选项&#34; Capture / Capture Global Win32&#34;已启用。
4)当IIS启动时,您应该会看到上述代码中的跟踪消息(确保通过触摸web.config确实重新启动了它)。
5)如果没有执行,请点击此处:http://www.asp.net/aspnet/overview/owin-and-katana/owin-startup-class-detection
有很多原因导致它没有被执行。其中许多都在stackoverflow上。我还要补充一点:确保您没有设置&#34; batch = false&#34;关于编译&#39; web.config的节点。
答案 5 :(得分:0)
您的BIN不包括参考资料。在首选项中,将其更改为“复制本地”为TRUE。然后再发布一次。
答案 6 :(得分:0)
我为此挣扎了几天!在我能找到的每个帖子中尝试了一切,这解决了这个问题。我正在VS 2013中开发并发布到Server 2008虚拟机,并且我一直得到“在上下文中找不到owin.Environment项目”消息。
我把这个条目放在web配置中的模块中并修复了它。我不确定我理解为什么它修复了它但确实如此。
<modules runAllManagedModulesForAllRequests="true" />