15

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

http://localhost/MyService/MyService.svc

如何访问方法:

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

5 回答 5

21

为了使用 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 工具导入并创建代理客户端。

于 2009-07-28T10:02:49.917 回答
8

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

编写您的第一个 WCF 客户端

您仍然需要一些参考(即对包含合同/接口的程序集的参考),但您不需要进行服务参考。

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

于 2009-07-28T13:45:03.347 回答
2

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

我将它广泛用于开发人员可能永远不会创建所需代理方法的可重用组件。此处提供了对 POST 方法的一个很好的比较。

于 2009-07-28T15:34:04.987 回答
1

你用/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>
于 2018-05-03T04:28:45.050 回答
0

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

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

于 2011-02-12T18:04:33.670 回答