正如官方document所述,我正在UseOwin
尝试在Startup.cs.
内使用/ IAppBuilder (Microsoft.Owin.Builder.AppBuilder)
IApplicationBuilder (Microsoft.AspNetCore.Builder.IApplicationBuilder)
中实施IAppBuilder
。我使用{。{1}}编写的遗留代码在.Net Framework 4.5上正常运行。
我已经看过几个关于在IAplicationBuilder中使用IAppBuilder的例子,例如example 1 example 2。这些尝试是关于.netcore 1.1而不是.net core 2.0。可能这是我无法移植的原因。
请分享您的想法,我是否正在尝试实现.net core 2.0中目前无法实现的功能,或者我的代码中存在一些错误。
注意:
我正在使用dotnetcore 2.0
与Visual Studio 2017
错误
我收到了以下错误。
返回owinAppBuilder.Build, 任务>>(); TypeLoadException:无法加载类型 ' System.Security.Cryptography.DpapiDataProtector'从装配 ' System.Security,Version = 4.0.0.0,Culture = neutral, 公钥= b03f5f7f11d50a3a'
我的尝试
app.UseOwin(setup => setup(next =>
{
var owinAppBuilder = new AppBuilder();
var aspNetCoreLifetime =
(IApplicationLifetime)app.ApplicationServices.GetService(typeof(IApplicationLifetime));
new AppProperties(owinAppBuilder.Properties)
{
OnAppDisposing = aspNetCoreLifetime?.ApplicationStopping ?? CancellationToken.None,
DefaultApp = next,
AppName = "test"
};
// Only required if CORS is used, configure it as you wish
var corsPolicy = new System.Web.Cors.CorsPolicy
{
AllowAnyHeader = true,
AllowAnyMethod = true,
AllowAnyOrigin = true,
SupportsCredentials = true
};
//corsPolicy.GetType()
// .GetProperty(nameof(corsPolicy.ExposedHeaders))
// .SetValue(corsPolicy, tusdotnet.Helpers.CorsHelper.GetExposedHeaders());
owinAppBuilder.UseCors(new Microsoft.Owin.Cors.CorsOptions
{
PolicyProvider = new CorsPolicyProvider
{
PolicyResolver = context => Task.FromResult(corsPolicy)
}
});
PublicClientId = "self";
OAuthAuthorizationServerOptions OAuthOptions = new OAuthAuthorizationServerOptions
{
TokenEndpointPath = new Microsoft.Owin.PathString("/Login"),
Provider = new MyServiceProvider(PublicClientId),
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(60),
AllowInsecureHttp = true,
RefreshTokenProvider = new MyRefreshTokenProvider(),
};
owinAppBuilder.UseOAuthBearerTokens(OAuthOptions);
//owinAppBuilder.UseTus(context => new DefaultTusConfiguration
//{
// // Excluded for brevity, use the same configuration as you would normally do
//});
return owinAppBuilder.Build<Func<IDictionary<string, object>, Task>>();
}));
答案 0 :(得分:2)
Microsoft.Owin
和相关的包没有.NET Core的目标,没有.NET Standard的目标。他们所拥有的只是针对完整.NET的dll。您可以从针对.NET Core的项目中引用这些库,但是不能保证它们可以正常工作,因为您看到自己,因为完整.NET和.NET Core的API(类/方法\签名集)是不同的。 Visual Studio甚至会在您执行此操作时显示警告,例如:
Package&#39; Microsoft.Owin 3.1.0&#39;恢复使用 &#39; .NETFramework,版本= v4.6.1&#39;而不是项目目标框架 &#39; .NETCoreApp,版本= 2.0&#39 ;.此包可能不完全兼容 与您的项目。
有Microsoft.AspNetCore.Owin
个软件包,您可以在.NET Core应用程序中使用OWIN中间件作为您的第一个链接描述,但它提供的几乎所有内容都是UseOwin
扩展方法。那里没有AppBuilder
类型,依此类推,并且没有Microsoft.AspNetCore.Owin.Cors
个包或类似的包。所以你必须自己实现所有这些(没有理由,因为你可以使用asp.net核心框架提供的相同功能)或者等待面向.NET Standard \ Core的OWIN包并做到这一点(没有理由)检查,也许他们甚至已经存在了。)
因此,您的代码使用的包确实与您的目标框架不兼容,因为您在运行时显示的异常。因此,另一个答案(由于某种原因,downvoted)在技术上是正确的。
如果您仍然希望可靠地使用这些软件包 - 您需要定位完整的.NET Framework而不是.NET Core。为此,请打开.csproj文件并更改
<TargetFramework>netcoreapp2.0</TargetFramework>
支持.NET Standard 2.0的某些.NET框架版本,例如:
<TargetFramework>net47</TargetFramework>
然后去nuget包管理器,如果你有microsoft.aspnetcore.all
包(或其他针对.NET Core的包) - 卸载它,你无论如何都不需要它。然后安装Microsoft.AspNetCore
包和所需的所有其他asp.net核心包(如果尚未安装)。重建,运行,它会正常工作。
这是有效的,因为所有(大多数?)AspNetCore包都以.NET Standard为目标,而不是.NET Core,您可以在面向完整.NET Framework的项目中使用它们。
请注意,通过这样做你有asp.net Core项目,但不是在.NET Core上,由此产生的所有后果(无法与dotnet run
一起运行),linux上需要运行单声道,所以上)。
答案 1 :(得分:-1)
Microsoft.Owin组件不适用于dotnet core 2.0,它们仅适用于.NET 4.5 +