我有一个 blazor 服务器应用程序,我想向其中添加 WCF NetTcp 侦听端口。常规的 Blazor Server Program.cs 文件如下:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddServerSizeBlazor();
builder.Services.AddSingleton<WeatherForecastService>();
builder.Services.AddServiceModelServices();
var app builder.Build()
只要在浏览器中启动默认网页,此功能就有效。现在我想添加一个 WCF .Net Core“ServiceHost”来侦听地址“net.tcp://localhost:port”。我按照这两个文档(one & two)中的建议,将上面的代码更改为以下内容:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddServerSizeBlazor();
builder.Services.AddSingleton<WeatherForecastService>();
builder.Services.AddServiceModelServices()
.AddTransient<IContractExchange, ContractExchange>();
var app builder.Build();
app.UseServiceModel(serviceBuilder =>
{
serviceBuilder.AddService<ContractExchange>(serviceOptions => serviceOptions.DebugBehavior.IncludeExceptionDetailInFaults = true);
serviceBuilder.AddServiceEndpoint<ContractExchange, IContractExchange>(new NetTcpBinding(), "net.tcp://127.0.0.1:21701/Endpoint");
//serviceBuilder.OpenAsync();
});
现在,当我启动应用程序时,浏览器打开,提供网页,但服务器没有侦听指定的 net.tcp 端口? 如果我尝试打开端口(上面注释掉的行),则会收到 System.InvalidOperationException:“通信对象 CoreWCF.Configuration.ServiceBuilder 在处于打开状态时无法修改”错误。
据我所知,这个错误的原因是错误发生在服务器端但是你没有捕获它或者没有将其转换为soap错误。
更好的方法是在服务类上实现 IErrorHandler 接口,它提供了一种在发出异常时全局捕获所有异常的方法。以下文章提供了更多信息:实现 IErrorHandler .
完成后,您可以重新创建客户端代理并重试。
尝试 builder.WebHost.UseNetTcp();