Добавление веб-ссылки на клиента при использовании Net.TCP - PullRequest
1 голос
/ 30 июня 2009

Я пытаюсь использовать Net.TCP в моей службе WCF, которая размещается самостоятельно, когда я пытаюсь добавить эту ссылку службы через веб-ссылку на мой клиент, я не могу получить доступ к классам и методам этой службы у любого есть идея достичь этого ... Как я могу добавить веб-ссылки в этом случае. У моей службы есть один метод (GetNumber), который возвращает int.

WebService:

public class WebService : IWebService
{
    public int GetNumber(int num)
    {
        return num + 1;
    }
}

Код договора на обслуживание:

[ServiceContract]
public interface IWebService
{
    [OperationContract]
    int GetNumber(int num);
}

WCF Сервисный код:

        ServiceHost host = new ServiceHost(typeof(WebService));
        host.AddServiceEndpoint(typeof(IWebService), new NetTcpBinding(), new Uri("net.tcp://" + Dns.GetHostName() + ":1255/WebService"));
        NetTcpBinding binding = new NetTcpBinding();
        binding.TransferMode = TransferMode.Streamed;
        binding.ReceiveTimeout = TimeSpan.MaxValue;
        binding.MaxReceivedMessageSize = long.MaxValue;
        Console.WriteLine("{0}", Dns.GetHostName().ToString());
        Console.WriteLine("Opening Web Service...");
        host.Open();
        Console.WriteLine("Web Service is running on port {0}",1255);
        Console.WriteLine("Press <ENTER> to EXIT");
        Console.ReadLine();

Это отлично работает. Единственная проблема заключается в том, как добавить ссылки на этот сервис в моем клиентском приложении. Я просто хочу отправить номер и получить ответ. Кто-нибудь может мне помочь?

Ответы [ 4 ]

1 голос
/ 31 мая 2012

Проблема в том, что метаданные службы (описание вашей службы) не экспортируются, поэтому Visual Studio не может создавать прокси-классы.

Эта ссылка объясняет, как экспортировать метаданные службы, изменив файл конфигурации xml или непосредственно в коде.

Все еще существует проблема с кодированной версией решения, представленной в ссылке, которую я объясню ниже.

При выполнении представленного кода вы получаете исключение, говорящее

The contract name 'IMetadataExchange' could not be found in the list of
contracts implemented by the service M6.Servico.GetCurve.GetCrvService.
Add a ServiceMetadataBehavior to the configuration file or to the ServiceHost
directly to enable support for this contract.

Чтобы это исправить, я просто изменил порядок, в котором все сделано. Сначала вы создаете поведение, устанавливаете его свойства и добавляете его к поведению хоста. После этого вы добавляете свои конечные точки, включая mexBinding

ServiceHost host = new ServiceHost(
    typeof(MyService),
    new Uri("http://localhost:8080/MyService"),
    new Uri("net.tcp://localhost:9000/MyService"));

ServiceMetadataBehavior metadataBehavior =
    new ServiceMetadataBehavior();
metadataBehavior.HttpGetEnabled = true;
host.Description.Behaviors.Add(metadataBehavior);

host.AddServiceEndpoint(
    typeof(IMyService),
    new WSHttpBinding(),
    "");
host.AddServiceEndpoint(
        typeof(IMyService),
    new NetTcpBinding(),
    "");
Binding mexBinding = MetadataExchangeBindings.CreateMexTcpBinding();
host.AddServiceEndpoint(
    typeof(IMetadataExchange),
    mexBinding,
    "net.tcp://localhost:9000/MyService/mex");
0 голосов
/ 30 июня 2009

1) Служба и клиент работают на одном компьютере, если брандмауэр не блокирует связь?

2) Вы пытались использовать svcutil для генерации класса клиента (на который вы затем можете ссылаться в своем клиентском приложении?

0 голосов
/ 28 марта 2010

просто введите в области добавления справочной службы Visual Studio базовый адрес настроенного сервера net.tcp (Visual Studio не обнаруживает серверы на основе протокола tcp автоматически, поэтому вы можете указать адрес вручную)

0 голосов
/ 30 июня 2009

Ваш клиент должен иметь прокси вашего веб-сервиса в качестве класса, чтобы он мог создавать его экземпляр и использовать его для вызова методов вашего веб-сервиса.

Читать здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...