Как использовать веб-сервис WCF через URL во время выполнения?
Я хочу получить доступ ко всем методам, предоставляемым в службе, через URL. если предположим, что URL будет:
http://localhost/MyService/MyService.svc
Как я могу получить доступ к методам:
- если предположить, что у меня есть ServiceReference
- и что мне делать, если у меня нет ссылки на сервис.
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 вы можете создавать прокси-классы и использовать их на клиенте.