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、またはの 1 つ (または複数) はMyDemoServiceと同じ名前空間にありIServiceProtoTypeますか?

あなたがやっているので、ウィンザーはそれらについて混乱しているのではないかと思います...

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

...そして、WCFクライアントプロキシとして返されるすべてを構成します。これは、そうであってはならないもののプロキシを作成しようとすることを意味し、したがってSequence Contains no Elements例外になります (IMHO の最も有用なメッセージではありませんが、押しつぶされます)。

簡単な修正は、あなたIServiceProtoTypeを独自の名前空間に入れることです(私はしばしばXXXX.Services、サービス契約のような名前空間を持っています)。

それが受け入れられない場合は、サービス契約だけを識別する別の方法を考え出す必要があります。Ifたとえば、その方法を見てくださいComponent.For

于 2012-11-16T07:46:45.230 に答える