日期:2014-05-17  浏览次数:20930 次

C#动态调用WCF时出错的问题
一.WCF应用程序:
1.接口:
namespace HSRHINIntf.Service
{
  [ServiceContract]
  public interface IRHINIntf
  {
  [OperationContract]
  string HSTest(string s);
  }
}
2.实现:
namespace HSRHINIntf.Service
{
  public class RHINIntf : IRHINIntf
  {
  public string HSTest(string s)
  {
  return s + "张三";
  }
  }
}

二.exe宿主
1.App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
  <services>
  <!--添加服务-->
  <service name="HSRHINIntf.Service.RHINIntf" behaviorConfiguration="CalculatorServiceBehavior">
  <!--name 必须与代码中的host实例初始化的服务一样  
  behaviorConfiguration 行为配置 -->
  <host>
  <baseAddresses>
  <!--添加调用服务地址-->
  <add baseAddress="http://localhost:8000/webservice/RHINIntf"/>
  </baseAddresses>

  </host>
  <!--添加契约接口 contract="WcfDemo.IService1" WcfDemo.IService1为契约接口 binding="wsHttpBinding" wsHttpBinding为通过Http调用-->
  <endpoint address="" binding="wsHttpBinding" contract="HSRHINIntf.Service.IRHINIntf"></endpoint>
  </service>

  </services>
  <!--定义CalculatorServiceBehavior的行为-->
  <behaviors>
  <serviceBehaviors>
  <behavior name="CalculatorServiceBehavior">
  <serviceMetadata httpGetEnabled="true"/>
  <serviceDebug includeExceptionDetailInFaults="false"/>
  </behavior>

  </serviceBehaviors>

  </behaviors>
  </system.serviceModel>
</configuration>
2.启用服务的代码:
  ServiceHost host = null;//定义 ServiceHost
  private void btnStart_Click(object sender, EventArgs e)
  {
  //WcfDemo.Service1 为引用的dll中的服务
  host = new ServiceHost(typeof(HSRHINIntf.Service.RHINIntf));
  host.Open();//启动服务
  this.lbStatus.Text = "WCF服务已启动...";
  }

三.客户端调用

private void button1_Click(object sender, EventArgs e)
  {
  //定义参数
  string[] args = new string[1];
  args[0] = "";

  //调用接口
  object o = InvokeWebService("http://localhost:8000/webservice/RHINIntf?wsdl", "RHINIntf", "HSTest", args);

  MessageBox.Show(o.ToString());
  }

//调用函数,返回函数执行结果
  public static object InvokeWebService(string url, string classname, string methodname, object[] args)
  {
  string @namespace = "HSRHINIntf.Service";
  //获取Web Service描述  
  WebClient wc = new WebClient();
  Stream stream = wc.OpenRead(url); //这里指定你自己的web service url,一定要以?WSDL结尾  
  ServiceDescription sd = ServiceDescription.Read(stream);

  ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
  sdi.ProtocolName = "soap";