0

我有带有服务合同和实现的 wcf 库。

     [ServiceContract]
    public interface IServiceProtoType 
    {
        [OperationContract]
        Response GetMessage(Request request);

        [OperationContract]
        String SayHello();

    }
    [DataContract]
    public class Request
    {
        private string name;

        [DataMember]
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

    }
    [DataContract]
    public class Response
    {
        private string message;

        [DataMember]
        public string Message
        {
            get { return message; }
            set { message = value; }
        }

    }
 public class MyDemoService : IServiceProtoType
    {
        public Response GetMessage(Request request)
        {
            var response = new Response();
            if (null == request)
            {
                response.Message = "Error!";
            }
            else
            {
                response.Message = "Hello, " + request.Name;
            }
            return response;
        }
        public string SayHello()
        {
            return "Hello, World!";
        }
    }

我有一个引用这个库的 Windows 服务项目,其中 MyService 只是一个继承 ServiceBase 的空壳。该服务在本地系统下安装并运行。

static void Main()
        {
          ServiceBase.Run(CreateContainer().Resolve());
        }

        private static IWindsorContainer CreateContainer()
        {
            IWindsorContainer container = new WindsorContainer();
            container.Install(FromAssembly.This());
            return container;
        }

 public class  ServiceInstaller : IWindsorInstaller
    {

        #region IWindsorInstaller Members

        public void Install(IWindsorContainer container, Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store)
        {

            string myDir;

            if (string.IsNullOrEmpty(AppDomain.CurrentDomain.RelativeSearchPath))
            {
                myDir = AppDomain.CurrentDomain.BaseDirectory;
            }
            else
            {
                myDir = AppDomain.CurrentDomain.RelativeSearchPath;
            }

            var wcfLibPath  = Path.Combine(myDir , "WcfDemo.dll");
            string baseUrl = "http://localhost:8731/DemoService/{0}";
            AssemblyName myAssembly = AssemblyName.GetAssemblyName(wcfLibPath);

            container
                .Register(
                    AllTypes
                        .FromAssemblyNamed(myAssembly.Name)
                        .InSameNamespaceAs<WcfDemo.MyDemoService>()
                        .WithServiceDefaultInterfaces()
                        .Configure(c =>
                                   c.Named(c.Implementation.Name)
                                       .AsWcfService(
                                           new DefaultServiceModel()
                                               .AddEndpoints(WcfEndpoint
                                                                 .BoundTo(new WSHttpBinding())
                                                                 .At(string.Format(baseUrl,
                                                                     c.Implementation.Name)
                                                                 )))), Component.For<ServiceBase>().ImplementedBy<MyService>());
        }

        #endregion
    }

在客户端控制台应用程序中,我有以下代码,并且收到以下错误:{“序列不包含元素”}


static void Main(string[] args)
        {
            IWindsorContainer container = new WindsorContainer();
            string baseUrl = "http://localhost:8731/DemoService/{0}";
            container.AddFacility<WcfFacility>(f => f.CloseTimeout = TimeSpan.Zero);

            container
                .Register(
                    Types
                        .FromAssemblyContaining<IServiceProtoType>()
                        .InSameNamespaceAs<IServiceProtoType>()
                        .Configure(
                            c => c.Named(c.Implementation.Name)
                                     .AsWcfClient(new DefaultClientModel
                                     {
                                         Endpoint = WcfEndpoint
                                             .BoundTo(new WSHttpBinding())
                                             .At(string.Format(baseUrl,
                                                 c.Name.Substring(1)))
                                     })));


            var service1 = container.Resolve<IServiceProtoType>();

            Console.WriteLine(service1.SayHello());

            Console.ReadLine();

        }
4

1 回答 1

1

我知道这可能是什么,但如果以下问题的答案是否定的,您现在可以停止阅读(我为提前浪费您的时间而道歉):

一个(或多个)RequestResponse或是否与 ?MyDemoService在同一命名空间中IServiceProtoType

我怀疑温莎对这些感到困惑,因为你正在做......

Types
    .FromAssemblyContaining<IServiceProtoType>()
    .InSameNamespaceAs<IServiceProtoType>()

...然后配置作为 WCF 客户端代理返回的所有内容。这意味着它将尝试为不应该的事物创建代理,因此是一个Sequence Contains no Elements例外(恕我直言,这不是最有用的消息,但很受追捧)。

简单的解决方法就是将您IServiceProtoType放入自己的命名空间(我经常有一个命名空间,就像XXXX.Services我的服务合同一样)。

如果这对您来说是不可接受的,那么您需要找出另一种方法来识别服务合同 -If例如看一下该方法,或者只是一个好的 ol' Component.For

于 2012-11-16T07:46:45.230 回答