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

Posted

技术标签:

【中文标题】如何在运行时通过 URL 使用 WCF Web 服务?【英文标题】:How to consume WCF web service through URL at run time? 【发布时间】:2010-11-14 15:42:20 【问题描述】:

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

http://localhost/MyService/MyService.svc

如何访问方法:

    如果假设我有一个 ServiceReference 如果没有服务参考怎么办。

【问题讨论】:

请澄清您的问题。我不知道你想完成什么。您希望能够调用这些方法,还是想要它们的列表? John 我想访问方法。实际上我想通过 URL 使用 Web 服务。 为什么不使用服务参考? 如何在初始化服务客户端的时候指定绑定地址和远程地址.. 很明显的问题请见谅 【参考方案1】:

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

【讨论】:

嗨,马克,感谢您的回答。我也在做同样的事情并且能够访问 .但我的要求是向客户端提供相同的界面(当我们右键单击添加服务引用时得到),他可以在其中看到 url,并且服务引用将根据选择的 url 进行相应更新。 我怎样才能在运行时实现这一点。如何在运行时使用选定的 URL 构造服务客户端。 好的,那么您想让您的客户端在运行时添加服务引用吗?他要对他们做什么?我的意思是 - 你当然可以在运行时创建一个代理 - 但是他或你将如何调用方法? 你可以做的一件事,例如测试是使用 SoapUI (www.soapui.org) 之类的工具 - 这允许您动态发现、连接和执行 SOAP 调用 - 但这实际上不再是您的应用程序 - 只是您的服务的调试/测试前端.这就是你要找的吗? 我可以初始化Serviceclient吗?我看到它有 5 个使用 endpoingBindingaddress 和 remoteaddress 的构造函数。你能告诉我它们是什么以及如何初始化..【参考方案2】:

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

Writing your first WCF client

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

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

【讨论】:

【参考方案3】:

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

我将它广泛用于开发人员可能永远不会创建所需代理方法的可重用组件。 here 可以很好地比较 POST 的方法。

【讨论】:

【参考方案4】:

你用 /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>

【讨论】:

我试过你的方法,但没有运气。如何在 wfc 服务中配置方法,以便可以直接从浏览器调用? @Örvar 查看编辑,如果这无助于发布新问题。 非常感谢您的回答,不胜感激。然而,我们在工作中放弃了使用现有 wcf 服务的想法。设置一个rest api,对我们的进一步要求更有意义【参考方案5】:

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

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

【讨论】:

以上是关于如何在运行时通过 URL 使用 WCF Web 服务?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ajax 客户端中使用作为 Windows 服务运行的 wcf 服务

WCF Web 服务错误:“服务端点绑定不使用 HTTP 协议”?

如何让 WCF 服务在 SSL 上运行?

WCF 突然停止工作

ASP.NET Web 表单 - 如何异步调用 WCF 异步方法?

如何使用故障契约和 jquery ajax 处理 wcf 错误