我想通过 URL 访问服务中公开的所有方法。如果假设 URL 将是:
http://localhost/MyService/MyService.svc
如何访问方法:
- 如果假设我有一个 ServiceReference
- 如果没有服务参考,我该怎么办。
我想通过 URL 访问服务中公开的所有方法。如果假设 URL 将是:
http://localhost/MyService/MyService.svc
如何访问方法:
为了使用 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 工具导入并创建代理客户端。
在没有服务参考的情况下回答如何做到这一点。看看这里(选项#a):
您仍然需要一些参考(即对包含合同/接口的程序集的参考),但您不需要进行服务参考。
编辑: 虽然以上是可能的,但我不推荐它。当您必须生成这样的代理时,性能并不是很好。我通常使用 svcutil.exe 并创建一个包含我的客户端的程序集并创建对该程序集的引用。这样,您就有更多选项来控制代理的外观。
你用/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 生成代理类并在客户端上使用它们。