无法在 ASP.NET Core 5.0 下的 IIS 中托管 CoreWcf

Posted

技术标签:

【中文标题】无法在 ASP.NET Core 5.0 下的 IIS 中托管 CoreWcf【英文标题】:Cannot host CoreWcf in IIS under ASP.NET Core 5.0 【发布时间】:2021-09-16 06:02:15 【问题描述】:

我尝试将我的 WCF Web 服务从 .Net Framework 4.7.1 迁移到 .Net5.0。 我使用 nugget CoreWcf 并尝试在 IIS 上运行它。

阅读此问题* 我不确定我们是否可以将 IIS 托管与 nuget WcfCore 0.1.0 一起使用。

*"无法在 ASP.NET Core 3.1 下的 IIS 中托管 CoreWcf: https://github.com/CoreWCF/CoreWCF/issues/313"

这是我在运行我的应用程序时观察到的情况

启动应用程序时出错。 InvalidOperationException:应用程序正在 IIS 进程内运行,但未配置为使用 IIS 服务器。 Microsoft.AspNetCore.Server.IIS.Core.IISServerSetupFilter+c__DisplayClass2_0.b__0(IApplicationBuilder 应用)

程序.cs

    public class Program
    
        public static void Main(string[] args)
        
            CreateWebHostBuilder(args).Build().Run();
        

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
            .UseIISIntegration()
            .UseStartup<Startup>()
            ;
    

Startup.cs

    public class Startup
    
        public Startup(IConfiguration configuration)
        
            Configuration = configuration;
        

        public IConfiguration Configuration  get; 

        public void ConfigureServices(IServiceCollection services)
        
            services.AddServiceModelServices();
            services.Configure<IISServerOptions>(options => // and or the same call with KestrelServerOptions
            
                options.AllowSynchronousIO = true;
            );
            services.AddRouting();
            services.AddControllers();
        

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        
            app.UseRouting();
            app.UseServiceModel(builder =>
            
                builder
                    .AddService<MyService>()
                    .AddServiceEndpoint<MyService, IMyService>(new BasicHttpBinding(), "/service.svc");

            );
            app.UseEndpoints(endpoints =>
            
                endpoints.MapControllers();
            );
        
    

我的 csproj

 <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <OutputType>Exe</OutputType>
    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
  </PropertyGroup>

Launche 设置:

 "IIS": 
      "commandName": "IIS",
      "launchBrowser": true,
      "launchUrl": "http://localhost/service.svc",
      "environmentVariables": 
        "ASPNETCORE_ENVIRONMENT": "Development"
      
    ,

当我作为“项目”启动时,它运行良好,但我想将它托管在 IIS 上。

我尝试了https://www.gitmemory.com/issue/CoreWCF/CoreWCF/313/782387998的解决方法

它不能正常工作,因为应用程序已启动,但所有请求都返回空响应 202 Accepted。

目前是否可以使用 .Net5 在 IIS 上托管我的 WCF 服务?

更新

感谢您的反馈!

最后,我按照本文档将我的 WCF 服务托管为 Windows 服务:

https://docs.microsoft.com/fr-fr/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-5.0&tabs=visual-studio

https://dotnetcoretutorials.com/2019/12/21/hosting-an-asp-net-core-web-app-as-a-windows-service-in-net-core-3/

  Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                
                    webBuilder.UseStartup<Startup>();

                ).ConfigureWebHost(config =>
                
                    config.UseUrls("http://*:5050");

                )
                .UseWindowsService();

希望未来我们会将服务迁移到 gRPC。

【问题讨论】:

如果您想为您的应用使用in-process 模式,请尝试.UseIIS() 而不是.UseIISIntegration() 同样的错误:System.InvalidOperationException: '应用程序正在 IIS 进程中运行,但未配置为使用 IIS 服务器。我将 WCF 服务移至 Windows 服务,现在可以了。 【参考方案1】:

wcf在.net 5中有很多限制,如果你想迁移,可以查看你的wcf服务的各种特性在.net 5中是否支持。

这里有一些参考:Supporting the community with WF and WCF OSS projects。

这是netcore中支持的wcf功能,大家可以看看:WCF Features in .Net Core 2.0

【讨论】:

谢谢,我决定将我的 WCF 服务转移到 Windows 服务。我想我会在不久的将来使用 gRPC。

以上是关于无法在 ASP.NET Core 5.0 下的 IIS 中托管 CoreWcf的主要内容,如果未能解决你的问题,请参考以下文章

如何按照存储库模式在 Asp.Net Core 5.0 项目上实现 .Net Core Identity?

ASP.NET CORE 5.0 Identity 显示当前登录用户

在 ASP.NET Core 5.0 Web API 中实现 DelegatingHandler?

在 Asp.Net Core 5.0 中注册 HttpClient 时注入 ILogger

EF Core 5.0 - 更新 ASP.NET Core Web API 中的多对多实体

从 ASP.NET Core 3.1 升级到 ASP.NET 5.0 后,User.Claims 为空