none
如何在一个WCF服务中调用另一个WCF服务? RRS feed

  • 问题

  • 首先,我有一个服务ServiceA ,里面有一个double Add(double r1,doubler2)方法,实现简单的加法运算。然后我有另一个服务ServiceB,里面有一个double Invoke(double r1,double r2)方法,它的作用是调用ServiceA中的Add方法。 该如何实现?

     还是把自己遇到的例子附上吧,其中出现了一个不知道如何解决的错误,望各位高人帮忙解决。

    1.首先我写了一个服务A,服务名字是CalculateService,其中包含一个实现加法的函数,代码如下:

    namespace WCFService1
    {
      [ServiceContract (Name="CalculateService",Namespace ="http://cs.com")]
      public interface ICalculator
      {
        [OperationContract]
        double Add(double r1, double r2);
      }
    }
    
    namespace WCFService1
    {
      [ServiceBehavior (IncludeExceptionDetailInFaults = true )]
      public class Calculator:ICalculator 
      {
        public double Add(double r1, double r2)
        {
          //throw new NotImplementedException();
          return r1 + r2;
        }
      }
    }
    
    服务能成功地寄宿在一个Console应用程序上,具体代码略。

    2.我写了另一个服务B,名字是InvokeService,作用是调用服务A的Add函数,并返回结果,在B中添加了一个对A的引用ServiceReference1,代码如下:

    namespace WCFService2
    {
      [ServiceContract (Name="InvokeService")]
      public interface IInvokeFromWCFService1
      {
        [OperationContract ]
        double Invoke(double r1,double r2);
      }
    }
    
    namespace WCFService2
    {
      [ServiceBehavior (IncludeExceptionDetailInFaults =true )]
      public class InvokeFromWCFService1:IInvokeFromWCFService1 
      {
        public double Invoke(double r1, double r2)
        {
          //throw new NotImplementedException();
          ServiceReference1.CalculateServiceClient proxy = new ServiceReference1.CalculateServiceClient();
          return proxy.Add(r1, r2);
        }
      }
    }

    服务能成功地寄宿在一个Console应用程序上,并能够通过VS的服务调试,能返回值。

    可是问题来了,当我新建一个Console应用程序作为客户端(客户端添加了对服务B的引用),调用服务B中的Invoke函数时,出现了如下错误

    在 ServiceModel 客户端配置部分中,找不到引用协定“ServiceReference1.CalculateService”的默认终结点元素。这可能是因为未找到应用程序的配置文件,或者是因为客户端元素中找不到与此协定匹配的终结点元素。

     我搞不明白,我客户端调用服务B,服务B调用服务A,那我客户端不是只需要知道服务B中的终极点就行了吗,为什么他提示以上信息? 十分迷惑,有谁可以帮帮忙,十分感谢了!!!

    2010年6月12日 4:40

答案

  • 刚刚补充了问题。

    我客户端代码是也是这样调用,可是出现了

     

    在 ServiceModel 客户端配置部分中,找不到引用协定“ServiceReference1.CalculateService”的默认终结点元素。这可能是因为未找到应用程序的配置文件,或者是因为客户端元素中找不到与此协定匹配的终结点元素。

     

    这个问题,搞不清原因...

    如果你服务A要调用服务B,那么A就是客户端,A的配置文件里就需要加上你客户端的一些配置信息。如果使用了配置文件的话。

    这个和你单独建立一个客户端生成配置文件一样,把配置信息拷贝到服务A里即可


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    老徐的博客】:http://www.cnblogs.com/frank_xl/

    【WCF中文技术论坛】:微软WCF中文技术论坛
    【WCF英文技术论坛】:微软WCF英文技术论坛

    2010年6月13日 8:08
    版主

全部回复

  • public double Invoke(double r1,doubl r2)

    {

      ServiceAClient client = new ServiceAClient();

     return client.Add(r1,r2);

    }

    2010年6月13日 7:01
  • 刚刚补充了问题。

    我客户端代码是也是这样调用,可是出现了

     

    在 ServiceModel 客户端配置部分中,找不到引用协定“ServiceReference1.CalculateService”的默认终结点元素。这可能是因为未找到应用程序的配置文件,或者是因为客户端元素中找不到与此协定匹配的终结点元素。

     

    这个问题,搞不清原因...

    2010年6月13日 7:23
  • 刚刚补充了问题。

    我客户端代码是也是这样调用,可是出现了

     

    在 ServiceModel 客户端配置部分中,找不到引用协定“ServiceReference1.CalculateService”的默认终结点元素。这可能是因为未找到应用程序的配置文件,或者是因为客户端元素中找不到与此协定匹配的终结点元素。

     

    这个问题,搞不清原因...

    如果你服务A要调用服务B,那么A就是客户端,A的配置文件里就需要加上你客户端的一些配置信息。如果使用了配置文件的话。

    这个和你单独建立一个客户端生成配置文件一样,把配置信息拷贝到服务A里即可


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    老徐的博客】:http://www.cnblogs.com/frank_xl/

    【WCF中文技术论坛】:微软WCF中文技术论坛
    【WCF英文技术论坛】:微软WCF英文技术论坛

    2010年6月13日 8:08
    版主
  • 首先应该是 B 调用 A,其次我在B中是通过“服务引用”引用A,已经自动生成了一个配置文件web.config

    2010年6月13日 8:44
  • 首先应该是 B 调用 A,其次我在B中是通过“服务引用”引用A,已经自动生成了一个配置文件web.config


    那应该可以调用吧,不会出现找不到配置文件的问题。

     


    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    老徐的博客】:http://www.cnblogs.com/frank_xl/

    【WCF中文技术论坛】:微软WCF中文技术论坛
    【WCF英文技术论坛】:微软WCF英文技术论坛

    2010年6月13日 9:14
    版主
  • GoodAfternoon你好, 

    问题出在ServiceB的配置中,可否共享一下ServiceB的web.config文件?


    Mog Liang
    2010年6月14日 8:59
  • 问题解决了,果然是配置文件问题。

    2010年6月18日 6:04
  • 问题解决了,果然是配置文件问题。


    你好,我也出现了这样的问题,请问一下是配置文件里面的什么问题导致的?我也是一个服务引用了另一个服务。^_^
    2010年11月20日 10:23
  • 我也遇到这个问题,原因是配置文件的协定和服务引用里的不一致,是这样解决的:

    打开ServiceReference1/Reference.svcmap 下的Reference.cs文件,这个文件是自动生成的元数据,打开后,将[System.ServiceMode.ServiceCOntractAttribute....]里面属性ConfigurationName的值拷贝下来,然后打开配置

    文件,将终结点里面contract的值改成刚才复制的值。

    我理解这块的逻辑是这样:在示例化服务对象时,它会根据ConfigurationName的值到配置文件里面的终结点的contract属性

    去找,如果能找到就示例化成功,否则就会报配置找不到的错误。

    希望对你的问题能有所帮助!

    2011年6月26日 4:48
  • public double Invoke(double r1,doubl r2)

    {

      ServiceAClient client = new ServiceAClient();

     return client.Add(r1,r2);

    }

    我遇到类似的问题,但在调用。client.Add(r1,r2);后抛出Internal Server Error的异常信息

    但是我测试在asp代码中掉用是正常的,不知能否帮助我?

    2013年12月24日 8:55