如何在运行时通过URL使用WCF Web服务?

时间:2009-07-28 09:59:39

标签: wcf wcf-binding wcf-client

我想通过URL访问服务中公开的所有方法。 如果假设URL为:

http://localhost/MyService/MyService.svc

如何访问方法:

  1. 如果我有一个ServiceReference
  2. 如果没有服务参考,我该怎么办。

5 个答案:

答案 0 :(得分:20)

要使用WCF服务,您需要创建WCF客户端代理。

在Visual Studio中,您可以右键单击项目,然后从上下文菜单中选择“添加服务引用”。键入要连接的URL,如果该服务正在运行,您应该为您生成一个客户端代理文件。

此文件通常包含一个名为MyService Client 的类 - 您可以实例化该类,您应该可以看到该客户端类上的所有可用方法。

如果您不想在Visual Studio中添加服务引用,则可以通过执行svcutil.exe命令行工具来实现相同的结果 - 这也将为您的客户端代理类生成所有必需的文件你。

马克

<强>更新
如果你想在运行时初始化客户端代理,你肯定可以这样做 - 你需要决定使用哪个绑定(传输协议),以及连接到哪个地址,然后你可以这样做:

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

MyServiceClient serviceClient = new MyServiceClient(binding, address);

但即使在这种情况下,您也需要先使用“添加服务引用”或svcutil.exe工具导入并创建代理客户端。

答案 1 :(得分:8)

在没有服务参考的情况下回答如何操作。看看这里(选项#a):

Writing your first WCF client

您仍然需要一些引用(即对包含合同/接口的程序集的引用),但您不提供服务引用。

修改 虽然以上是可能的,但我不推荐它。当您必须生成这样的代理时,性能并不是很好。我通常使用svcutil.exe并创建一个包含我的客户端的程序集,并创建对该程序集的引用。这样,您可以有更多选项来控制代理的外观。

答案 2 :(得分:2)

您还可以使用WebClient类来调用WCF服务,而无需服务代理。实际上,您可以发送和接收字符串和二进制数据,还可以模拟POST。

我将它广泛用于可重用组件,开发人员可能无法创建所需的代理方法。可以使用here进行有效的POST比较。

答案 3 :(得分:1)

您可以使用 / functionname 来调用它,例如:

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

enter image description here

编辑:

  

如何在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>

答案 4 :(得分:0)

您只需提供服务的wsdl:http://localhost/MyService/MyService.svc?wsdl

从wsdl,您可以生成代理类并在客户端上使用它们。