【问题标题】:How to properly set attributes to both WCF interface and class in VS2019?如何在 VS2019 中正确设置 WCF 接口和类的属性?
【发布时间】:2020-01-01 19:24:29
【问题描述】:

我正在尝试将现有的 WCF 服务从 VS2015 升级到 VS2019,但 VS2019 中的接口/类服务属性似乎存在问题。

我创建了以下简短的代码示例来演示这里的问题:

using System;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace ConsoleApp25
{
    [ServiceContract]
    public interface ISOAAdd
    {
        [OperationContract]
        double Add(double a, double b);
    }

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
    public class SOAAddImpl: ISOAAdd
    {
        public double Add(double a, double b)
        {
            return a + b;
        }
    }

    class Program
    {
        private static ServiceHost Host;
        private const ushort Port = 23456;

        static void Main(string[] args)
        {
            Type ServiceType = typeof(SOAAddImpl);            
            Host = new ServiceHost(ServiceType, new Uri[] { new Uri(string.Format("http://localhost:{0}/", Port)) });
            Host.AddServiceEndpoint(ServiceType, new BasicHttpBinding(), "SOAAddImpl");
            ServiceMetadataBehavior Behavior = new ServiceMetadataBehavior();
            Behavior.HttpGetEnabled = true;
            Host.Description.Behaviors.Add(Behavior);
            Host.Open();
            Console.ReadKey();
        }
    }
}

运行此代码时,出现以下异常:

ConsoleApp25.SOAAddImpl 合约类型不属于ServiceContractAttribute。为了定义一个有效的合约,指定的类型(合约接口或服务类)必须使用 ServiceContractAttribute 进行属性化。

如果我将属性添加到类中,我会得到以下异常:

ConsoleApp25.SOAAddImpl 类型的服务类都定义了一个 ServiceContract 并从类型继承 ServiceContract ConsoleApp25.ISOA添加。契约继承只能在 接口类型。如果一个类用 ServiceContractAttribute 标记, 它必须是层次结构中的唯一类型 服务合同属性。考虑移动 ServiceContractAttribute 在 ConsoleApp25.ISOA 类型上添加一个单独的接口,该类型 ConsoleApp25.ISOAAdd 实现。

我。 e.由于某种原因,应用程序看不到接口已经用 ServiceContract 装饰,但是当我装饰类和接口时,它可以看到装饰(两者),这导致了上面的错误。我该如何解决?

【问题讨论】:

  • 显然应该是new ServiceHost(ServiceType, ...host.AddServiceEndpoint(typeof(ISOAAdd), ...
  • 非常感谢!你拯救了我的一天。

标签: c# wcf soa


【解决方案1】:

正如Selvin在评论部分指出的那样,您需要将参数服务接口(@98​​7654322@)而不是服务对象(typeof(SOAAddImpl))发送到ServiceHost.AddServiceEndpoint方法。

Host.AddServiceEndpoint(typeof(ISOAAdd), new BasicHttpBinding(), "SOAAddImpl");

【讨论】:

    猜你喜欢
    • 2014-10-31
    • 2011-09-04
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多