CoreWCF с интерфейсом в качестве параметра
я пытаюсь использовать CoreWCF для создания службы Windows со всеми подключениями любого поставщика базы данных, который реализует IDbConnection
транспорт сериализованной информации работает с простыми типами, такими как int, string и т. д., со сложными типами с атрибутом [DataContract] для
но я хочу создать метод, который возвращает IDBConnection клиенту... к сожалению, в wcf возникает общее исключение "базовое соединение было закрыто, соединение было неожиданно закрыто"
я не знаю, возможно ли транспортировать объект, основываясь только на информации об интерфейсе, надеюсь, кто-нибудь может мне помочь с этим
пытался настроить ведение журнала, но, по-видимому, на сервере не возникает никаких ошибок, отладка в конце.. только на клиенте
моя серверная программа.cs
public class Program
{
public static void Main()
{
try
{
var builder = WebApplication.CreateBuilder();
builder.WebHost.ConfigureKestrel((context, options) => options.AllowSynchronousIO = true);
builder.Services.AddServiceModelServices();
builder.Services.AddServiceModelMetadata();
builder.Services.AddSingleton<IServiceBehavior, UseRequestHeadersForMetadataAddressBehavior>();
builder.Services.AddSingleton<FirebirdDataBase>();
var app = builder.Build();
app.UseServiceModel(serviceBuilder =>
{
serviceBuilder.AddService<FirebirdDataBase>(x => x.DebugBehavior.IncludeExceptionDetailInFaults = true) ;
serviceBuilder.AddServiceEndpoint<FirebirdDataBase, IDataBaseFunctions>(GenerateBasicHttpBinding(), "/Service.svc");
serviceBuilder.AddServiceEndpoint<FirebirdDataBase, IDataBaseFunctions>(GenerateWSHttpBinding(), "/WSHttps.svc");
var serviceMetadataBehavior = app.Services.GetRequiredService<ServiceMetadataBehavior>();
serviceMetadataBehavior.HttpsGetEnabled = true;
});
app.Run();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
Console.ReadKey();
}
}
private static BasicHttpBinding GenerateBasicHttpBinding()
{
var bindHttp = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
bindHttp.Security.Mode = BasicHttpSecurityMode.None;
bindHttp.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
return bindHttp;
}
private static WSHttpBinding GenerateWSHttpBinding()
{
var bindWS = new WSHttpBinding(SecurityMode.Transport);
bindWS.Security.Mode = SecurityMode.None;
bindWS.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
return bindWS;
}
}
реализованная услуга
[ServiceContract]
public interface IDataBaseFunctions
{
[OperationContract]
IDbConnection CreateConnectionAux(int type);
}
public class FirebirdDataBase : IDataBaseFunctions
{
public IDbConnection CreateConnectionAux(int tipoConexao)
{
//implementation
return new FbConnection("");
}
}
клиент
static void Main(string[] args)
{
CallWsHttpBinding("http://localhost:5266");
}
private static void CallWsHttpBinding(string hostAddr)
{
var binding = new WSHttpBinding(SecurityMode.None);
binding.MaxReceivedMessageSize = int.MaxValue;
var factory = new ChannelFactory<IDataBaseFunctions>(binding, new EndpointAddress($"http://localhost:5266/WSHttps.svc"));
try
{
IDataBaseFunctions client = factory.CreateChannel();
var results = client.CreateConnectionAux(0);
}
catch(Exception ex)
{
ex.ToString();
}
}
и de stacktrace
System.ServiceModel.CommunicationException
HResult=0x80131501
Message= The underlying connection was closed: The connection was closed unexpectedly
Source=mscorlib
StackTrace:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at ConsoleApp2.ServiceReference1.IDataBaseFunctions.CreateConnectionAux(Int32 tipoConexao)
at ConsoleApp2.Program.CallWsHttpBinding(String hostAddr) in C:\Users\maico\source\repos\ConsoleApp2\Program.cs:line 33
This exception was originally thrown at this call stack:
[External Code]
Inner Exception 1:
WebException: The underlying connection was closed: The connection was closed unexpectedly