如何从另一个服务方法调用 WCF 服务?

Posted

技术标签:

【中文标题】如何从另一个服务方法调用 WCF 服务?【英文标题】:How to call WCF service from another service method? 【发布时间】:2021-07-02 02:12:52 【问题描述】:

我的应用中有代码:

[ServiceContract(Namespace = "")]
public class Service1

    [OperationContract]
    public object SomeMethod1()


[ServiceContract(Namespace = "")]
public class Service2

    [OperationContract]
    public object SomeMethod2()
    
        var result = new Service1().SomeMethod1();
    

我必须使用一些代理来调用 service1 方法还是正确的方法?

【问题讨论】:

如果是同一个应用直接调用。 【参考方案1】:

我们不能这样做。在WCF中,每个ServiceContract对应一个endpoint,调用不同的endpoint需要不同的代理,因为这些endpoint的地址信息不一样。

这是一个演示:

 [ServiceContract]
    public interface ICalculator
    
        [OperationContract]
        double Add(double n1, double n2);
    
    [ServiceContract]
    public interface ICalculator2
    
        [OperationContract]
        double Subtract(double n1, double n2);
    
    public class CalculatorService : ICalculator,ICalculator2
    
        public double Add(double n1, double n2)
        
            double result = n1 + n2;
            Console.WriteLine("Received Add(0,1)", n1, n2);
            Console.WriteLine("Return: 0", result);
            return result;
        

        public double Subtract(double n1, double n2)
        
            double result = n1 - n2;
            Console.WriteLine("Received Subtract(0,1)", n1, n2);
            Console.WriteLine("Return: 0", result);
            return result;
        
    
    class Program
    
        static void Main(string[] args)
        
            // Step 1: Create a URI to serve as the base address.
            Uri baseAddress = new Uri("http://localhost:8000/GettingStarted/");

            // Step 2: Create a ServiceHost instance.
            ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);

            try
            
                // Step 3: Add a service endpoint.
                selfHost.AddServiceEndpoint(typeof(ICalculator), new BasicHttpBinding(), "CalculatorService");
                selfHost.AddServiceEndpoint(typeof(ICalculator2), new BasicHttpBinding(), "CalculatorService2");
                // Step 4: Enable metadata exchange.
                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                smb.HttpGetEnabled = true;
                selfHost.Description.Behaviors.Add(smb);

                // Step 5: Start the service.
                selfHost.Open();
                Console.WriteLine("The service is ready.");

                // Close the ServiceHost to stop the service.
                Console.WriteLine("Press <Enter> to terminate the service.");
                Console.WriteLine();
                Console.ReadLine();
                selfHost.Close();
            
            catch (CommunicationException ce)
            
                Console.WriteLine("An exception occurred: 0", ce.Message);
                selfHost.Abort();
            
        
    

上述服务中有两个ServiceContract,一个是ICalculator,一个是ICalculator2。它们的端点地址不相同。

当我们添加服务引用时,会生成两个代理类,两个代理类的端点地址不同:

所以我们不能使用同一个代理类来调用不同的ServiceContracts。

【讨论】:

以上是关于如何从另一个服务方法调用 WCF 服务?的主要内容,如果未能解决你的问题,请参考以下文章

怎样用js调用wcf服务

如何从 POSTMAN 调用 WCF 服务方法

通过C#代码调用WCF服务中的一个方法。不依赖配置文件等。求完整代码!!

如何从同一 WPF 应用程序托管的 WCF 服务调用 WPF 应用程序中的方法?

从 WCF 服务如何以当前用户而不是 IIS\DefaultApppool 的身份调用第三方 dll 中的方法

如何理解一个服务调用是“Restful 服务调用”还是“标准 wcf 调用”?