如何在VS2019中同时为WCF接口和类设置属性?

问题描述 投票:0回答:1

我正在尝试将现有的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并从类型继承ServiceContractConsoleApp25.ISOAAdd。合同继承只能在接口类型。如果某个类标记有ServiceContractAttribute,它必须是层次结构中唯一的ServiceContractAttribute。考虑移动ServiceContractAttribute在类型ConsoleApp25.ISOAAdd上键入一个单独的接口ConsoleApp25.ISOAAdd实现。

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

c# wcf soa
1个回答
0
投票

正如Selvin在注释部分中指出的,您需要将参数服务接口(typeof(ISOAAdd))而不是服务对象(typeof(SOAAddImpl))发送到ServiceHost.AddServiceEndpoint方法。

Host.AddServiceEndpoint(typeof(ISOAAdd), new BasicHttpBinding(), "SOAAddImpl");
© www.soinside.com 2019 - 2024. All rights reserved.