Невозможно добавить net.tcp в качестве ссылки на службу

1

Я создал службу WCF net.tcp, например:

const string tcpUri = "net.tcp://localhost:9038";
var netTcpHost = new WebServiceHost(typeof(DashboardService), new Uri(tcpUri));
netTcpHost.AddServiceEndpoint(typeof(IDashboardService), new NetTcpBinding(), 
                                                             "/dashboard");

netTcpHost.Open();

Console.WriteLine("Hosted at {0}. Hit any key to shut down", tcpUri);
Console.ReadKey();

netTcpHost.Close();

Вот мои определения IDashboardService и DashboardSerivce:

[ServiceContract]
public interface IDashboardService
{
    [OperationContract]
    PositionDashboard Loader();
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class DashboardService : IDashboardService
{
    public PositionDashboard Loader()
    {
        ...
    }
}

Однако, когда я пытаюсь подключиться к службе с тестовым клиентом WCF, я получаю следующую ошибку:

Error: Cannot obtain Metadata from net.tcp://localhost:9038/dashboard
The socket connection was aborted. This could be caused by an error processing your 
message or a receive timeout being exceeded by the remote host, or an underlying 
network resource issue. Local socket timeout was '00:04:59.9890000'.    An existing 
connection was forcibly closed by the remote host
Теги:
metadata
wcf
tcp
nettcpbinding

1 ответ

1
Лучший ответ

В этой ошибке явно упоминается "Не удается получить метаданные...", поэтому стоит проверить, что у вас есть конечная точка TCP Mex. Он должен выглядеть примерно так:

<endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />

В качестве альтернативы, если вы хотите это сделать, вам нужно обратиться к System.ServiceModel.Discovery, а затем ваш код должен выглядеть так:

const string tcpUri = "net.tcp://localhost:9038";
using (var netTcpHost = new WebServiceHost(
    typeof(DashboardService),
    new Uri(tcpUri)))
{
    netTcpHost.Description.Behaviors.Add(new ServiceMetadataBehavior());
    netTcpHost.AddServiceEndpoint(
        typeof(IMetadataExchange),
        MetadataExchangeBindings.CreateMexTcpBinding(),
        "mex");
    netTcpHost.AddServiceEndpoint(
        typeof(IDashboardService),
        new NetTcpBinding(),
        "dashboard");

    netTcpHost.Description.Behaviors.Add(new ServiceDiscoveryBehavior());
    netTcpHost.AddServiceEndpoint(new UdpDiscoveryEndpoint());

    netTcpHost.Open();
    Console.WriteLine("Hosted at {0}. Hit any key to shut down", tcpUri);
    Console.ReadLine();

    netTcpHost.Close();
}
  • 0
    Я создаю все это программно (то есть без app / web.config). Как бы я сделал это программно?
  • 0
    @BiffBaffBoff - я добавил пример кода.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню