Использование последней версии ServiceModel.Grpc для сервера и клиента из https://github.com/max-ieremенко/Servic ... tag/1.11.1
Контракт на обслуживание:
[ServiceContract]
public interface ITestService
{
[OperationContract]
Task
PingAsync();
}
Реализация:
public partial class TestService : ITestService
{
public async Task
PingAsync()
{
return new PingReply
{
Message = "TestService Service is Available",
Status = "Success",
};
}
}
Запуск на стороне сервера:
builder.Services.AddServiceModelGrpc();
builder.Services.AddScoped();
.
.
.
app.MapGrpcService().EnableGrpcWeb().RequireCors("AllowGrpc");
Запуск клиента Blazor:
builder.Services
.AddGrpcClientEx()
.AddSingleton(provider =>
{
var baseAddress = provider.GetRequiredService().BaseAddress;
var httpHandler = new GrpcWebHandler(GrpcWebMode.GrpcWebText, new HttpClientHandler());
return GrpcChannel.ForAddress(baseAddress, new GrpcChannelOptions { HttpHandler = httpHandler, UnsafeUseInsecureChannelCallCredentials = true, ThrowOperationCanceledOnCancellation = false });
})
.AddSingleton(_ => new ClientFactory());
и имп AddGrpcCleintEx:
public static IServiceCollection AddGrpcClientEx(this IServiceCollection services) where T : class
{
return services.AddScoped(provider =>
{
var channel = provider.GetRequiredService();
return provider.GetRequiredService().CreateClient(channel);
});
}
Вызов метода Ping на стороне клиента (Webassembly Blazor):
var service = ServiceLocator.ServiceProvider.GetRequiredService();
var ret = await service.PingAsync();
В режиме разработки проблем нет, но когда я развертываю его как образ Docker в Linux, возникает следующее исключение:
Компонент отрисовки необработанных исключений: OperationDescriptorBuilder не содержит ctor с 2 параметрами.
System.ArgumentException: OperationDescriptorBuilder не содержит ctor с 2 параметрами.
at ServiceModel.Grpc.Emit.ReflectionTools.Constructor(тип типа, параметры Int32Count)
в ServiceModel.Grpc.Emit.CodeGenerators.ReflectDescriptor..ctor()
в ServiceModel.Grpc.Emit.CodeGenerators.EmitContractBuilder. Сборка (ModuleBuilder, ModuleBuilder, ContractDescription1 description, String className) at ServiceModel.Grpc.Emit.EmitGenerator.GenerateContract(Type serviceType, ILogger logger) at ServiceModel.Grpc.Emit.EmitGenerator.GenerateClientBuilder[ITestService](ILogger logger) at ServiceModel.Grpc.Client.ClientRegistration.EmitBuilder[ITestService](ILogger ) at ServiceModel.Grpc.Client.ClientRegistration.Build[ITestService](IClientBuilder1, ServiceModelGrpcClientOptions, Действие1 ) at ServiceModel.Grpc.Client.ClientFactory.RegisterClient[ITestService](IClientBuilder1 , Действие1 , Boolean ) at ServiceModel.Grpc.Client.ClientFactory.CreateClient[ITestService](CallInvoker ) at ServiceModel.Grpc.Client.ClientFactory.CreateClient[ITestService](ChannelBase ) at ServiceModel.Grpc.Client.GrpcClientExtensions.c__01[[Server.ITestService, Server.Infra, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]].b__0_0(поставщик IServiceProvider)
в Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver .VisitFactory(FactoryCallSite, RuntimeResolverContext)
в Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor2[[Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeResolverContext, Microsoft.Extensions.DependencyInjection, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60],[System.Object, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].VisitCallSiteMain(ServiceCallSite , RuntimeResolverContext ) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite , RuntimeResolverContext , ServiceProviderEngineScope , RuntimeResolverLock ) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite , RuntimeResolverContext ) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor2[[Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeResolverContext, Microsoft.Extensions.DependencyInjection, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60],[System.Object, System.Private.CoreLib, Version =8.0.0.0, Культура=нейтральная, PublicKeyToken=7cec85d7bea7798e]].VisitCallSite(ServiceCallSite callSite, аргумент RuntimeResolverContext)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite, ServiceProviderEngineScope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeServiceProviderEngine.c__DisplayClass4_0.b__0(область ServiceProviderEngineScope)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(ServiceIdentifier, ServiceProviderEngineScope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type )
в Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider , Type )
в Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredServiceITestService
но я провел некоторые исследования по журналу и отладке и не знаю, почему в режиме разработки метод ниже будет вызываться из ReflectionTools из ServiceModel.Grpc.Emit< /code> как:
public static ConstructorInfo Constructor(this Type type, params Type[] parameters)
но вместо этого в режиме производства докера будет вызван метод отражения ниже:
public static ConstructorInfo Constructor(this Type type, int parametersCount)
Подробнее здесь: https://stackoverflow.com/questions/793 ... r-with-2-p
ServiceModel.Grpc.Emit OperationDescriptorBuilder не содержит ctor с двумя параметрами в образе Docker Linux ⇐ C#
Место общения программистов C#
1736003557
Anonymous
Использование последней версии ServiceModel.Grpc для сервера и клиента из https://github.com/max-ieremенко/ServiceModel.Grpc/releases/tag/1.11.1
Контракт на обслуживание:
[ServiceContract]
public interface ITestService
{
[OperationContract]
Task
PingAsync();
}
Реализация:
public partial class TestService : ITestService
{
public async Task
PingAsync()
{
return new PingReply
{
Message = "TestService Service is Available",
Status = "Success",
};
}
}
Запуск на стороне сервера:
builder.Services.AddServiceModelGrpc();
builder.Services.AddScoped();
.
.
.
app.MapGrpcService().EnableGrpcWeb().RequireCors("AllowGrpc");
Запуск клиента Blazor:
builder.Services
.AddGrpcClientEx()
.AddSingleton(provider =>
{
var baseAddress = provider.GetRequiredService().BaseAddress;
var httpHandler = new GrpcWebHandler(GrpcWebMode.GrpcWebText, new HttpClientHandler());
return GrpcChannel.ForAddress(baseAddress, new GrpcChannelOptions { HttpHandler = httpHandler, UnsafeUseInsecureChannelCallCredentials = true, ThrowOperationCanceledOnCancellation = false });
})
.AddSingleton(_ => new ClientFactory());
и имп AddGrpcCleintEx:
public static IServiceCollection AddGrpcClientEx(this IServiceCollection services) where T : class
{
return services.AddScoped(provider =>
{
var channel = provider.GetRequiredService();
return provider.GetRequiredService().CreateClient(channel);
});
}
Вызов метода Ping на стороне клиента (Webassembly Blazor):
var service = ServiceLocator.ServiceProvider.GetRequiredService();
var ret = await service.PingAsync();
В режиме разработки проблем нет, но когда я развертываю его как образ Docker в Linux, возникает следующее исключение:
Компонент отрисовки необработанных исключений: OperationDescriptorBuilder не содержит ctor с 2 параметрами.
System.ArgumentException: OperationDescriptorBuilder не содержит ctor с 2 параметрами.
at ServiceModel.Grpc.Emit.ReflectionTools.Constructor(тип типа, параметры Int32Count)
в ServiceModel.Grpc.Emit.CodeGenerators.ReflectDescriptor..ctor()
в ServiceModel.Grpc.Emit.CodeGenerators.EmitContractBuilder. Сборка (ModuleBuilder, ModuleBuilder, ContractDescription1 description, String className) at ServiceModel.Grpc.Emit.EmitGenerator.GenerateContract(Type serviceType, ILogger logger) at ServiceModel.Grpc.Emit.EmitGenerator.GenerateClientBuilder[ITestService](ILogger logger) at ServiceModel.Grpc.Client.ClientRegistration.EmitBuilder[ITestService](ILogger ) at ServiceModel.Grpc.Client.ClientRegistration.Build[ITestService](IClientBuilder1, ServiceModelGrpcClientOptions, Действие1 ) at ServiceModel.Grpc.Client.ClientFactory.RegisterClient[ITestService](IClientBuilder1 , Действие1 , Boolean ) at ServiceModel.Grpc.Client.ClientFactory.CreateClient[ITestService](CallInvoker ) at ServiceModel.Grpc.Client.ClientFactory.CreateClient[ITestService](ChannelBase ) at ServiceModel.Grpc.Client.GrpcClientExtensions.c__01[[Server.ITestService, Server.Infra, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]].b__0_0(поставщик IServiceProvider)
в Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver .VisitFactory(FactoryCallSite, RuntimeResolverContext)
в Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor2[[Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeResolverContext, Microsoft.Extensions.DependencyInjection, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60],[System.Object, System.Private.CoreLib, Version=8.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].VisitCallSiteMain(ServiceCallSite , RuntimeResolverContext ) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitCache(ServiceCallSite , RuntimeResolverContext , ServiceProviderEngineScope , RuntimeResolverLock ) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScopeCache(ServiceCallSite , RuntimeResolverContext ) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor2[[Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeResolverContext, Microsoft.Extensions.DependencyInjection, Version=8.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60],[System.Object, System.Private.CoreLib, Version =8.0.0.0, Культура=нейтральная, PublicKeyToken=7cec85d7bea7798e]].VisitCallSite(ServiceCallSite callSite, аргумент RuntimeResolverContext)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.Resolve(ServiceCallSite, ServiceProviderEngineScope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.RuntimeServiceProviderEngine.c__DisplayClass4_0.b__0(область ServiceProviderEngineScope)
at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(ServiceIdentifier, ServiceProviderEngineScope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type )
в Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider , Type )
в Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredServiceITestService
но я провел некоторые исследования по журналу и отладке и не знаю, почему в режиме разработки метод ниже будет вызываться из ReflectionTools из ServiceModel.Grpc.Emit< /code> как:
public static ConstructorInfo Constructor(this Type type, params Type[] parameters)
но вместо этого в режиме производства докера будет вызван метод отражения ниже:
public static ConstructorInfo Constructor(this Type type, int parametersCount)
Подробнее здесь: [url]https://stackoverflow.com/questions/79329065/servicemodel-grpc-emit-operationdescriptorbuilder-does-not-contain-ctor-with-2-p[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия