Как использовать веб-сервис WCF через URL во время выполнения?

Я хочу получить доступ ко всем методам, предоставляемым в службе, через URL. если предположим, что URL будет:

http://localhost/MyService/MyService.svc

Как я могу получить доступ к методам:

  1. если предположить, что у меня есть ServiceReference
  2. и что мне делать, если у меня нет ссылки на сервис.

5 ответов

Решение

Чтобы использовать службу WCF, вам необходимо создать прокси клиента WCF.

В Visual Studio вы должны щелкнуть правой кнопкой мыши по проекту и выбрать "Добавить ссылку на службу" в контекстном меню. Введите URL-адрес, к которому вы хотите подключиться, и если эта служба работает, вы должны получить сгенерированный для вас файл прокси клиента.

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

Если вы не хотите добавлять ссылку на службу в Visual Studio, вы можете достичь того же результата, выполнив svcutil.exe инструмент командной строки - он также сгенерирует все необходимые файлы для вашего класса прокси клиента.

Марк

ОБНОВИТЬ:
если вы хотите инициализировать клиентский прокси во время выполнения, вы определенно можете это сделать - вам нужно решить, какую привязку использовать (транспортный протокол) и какой адрес для подключения, а затем вы можете сделать:

BasicHttpBinding binding = new BasicHttpBinding();
EndpointAddress address = new EndpointAddress("http://localhost:8888/MyService");

MyServiceClient serviceClient = new MyServiceClient(binding, address);

Но даже в этом случае вам необходимо сначала импортировать и создать прокси-клиент с помощью инструментов "Добавить ссылку на службу" или svcutil.exe.

Чтобы ответить, как это сделать, не имея справочной службы. Посмотрите здесь (вариант #a):

Написание вашего первого клиента WCF

Вам все еще нужна некоторая ссылка (а именно ссылка на сборку, содержащую контракт / интерфейс), но вы не делаете ссылку на сервис.

РЕДАКТИРОВАТЬ: Хотя вышесказанное возможно, я бы не рекомендовал это. Производительность не совсем велика, когда вы должны генерировать прокси, как это. Я обычно использую svcutil.exe и создаю сборку, содержащую моих клиентов, и создаю ссылку на эту сборку. Таким образом, у вас будет больше возможностей для контроля того, как выглядят прокси.

Вы также можете использовать класс WebClient для вызова службы WCF без необходимости использования прокси службы. Эффективно вы можете отправлять и получать строки и двоичные данные, а также имитировать POST.

Я широко использую его для компонентов многократного использования, где разработчик может никогда не создать необходимые прокси-методы. Хорошее сравнение способов сделать POST доступно здесь.

Вы вызываете его с / functionname, например:

http://localhost/MyService/MyService.svc/ GetVersionNumber

введите описание изображения здесь

Редактировать:

Как вы настраиваете свой метод в сервисе WCF, чтобы вы могли вызывать его прямо из браузера?

У меня есть интерфейс:

[ServiceContract]
public interface IWebServiceImpl
{
    [OperationContract]
    [WebInvoke(Method = "GET",
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Bare,
        UriTemplate = "GetVersionNumber")]
    string GetVersionNumber();

И класс для реализации GetVersionNumber Метод в интерфейсе:

public class WebServiceImpl
{
    public string GetVersionNumber()
    {
            return "1.0.0.0"; //In real life this isn't hard-coded
    }
}

Наконец, вот конфигурация Web.config:

<system.serviceModel>        
    <diagnostics>
      <messageLogging logEntireMessage="true" logMalformedMessages="false" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="false" maxMessagesToLog="3000" maxSizeOfMessageToLog="2000"/>
    </diagnostics>        
    <bindings>
      <webHttpBinding>
        <binding name="webBinding">
          <security mode="Transport"/>
        </binding>
      </webHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="ServiceBehaviour" name="YOURWebServiceNameSpace.WebServiceImpl">            
        <endpoint address="" behaviorConfiguration="web" binding="webHttpBinding" contract="YOURWebServiceNameSpace.IWebServiceImpl"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehaviour">
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="web">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

Вы можете просто предоставить wsdl своего сервиса: http://localhost/MyService/MyService.svc?wsdl.

Из wsdl вы можете создавать прокси-классы и использовать их на клиенте.

Другие вопросы по тегам