1

私は、Windows サービスを使用して二重 wcf サービスをホストしています。

コンソール アプリケーションにサービス参照を追加する場合、ホスティングに問題はないと思います。二重サービスに問題なくアクセスできます。

解決中にクライアント側で城のウィンザーを使用すると問題が発生します。以下は、構成ファイルに基づくコードを使用して wcf サービスを追加するために使用しているコードです。

public static IWindsorContainer RegisterWcfClients(IocBuildSettings iocBuildSettings,
        IWindsorContainer container)
    {

        //Register callback methods for duplex service first.

        container.Register(Component.For<INotificationCallback>()
            .ImplementedBy<NotificationCallbackCastle>()
            .LifestyleTransient());



        // get dictionary with key = service class, value = service interface
        var servicesWithWcfInterfaces = Assembly.GetAssembly(typeof (IApplicationService))
            .GetTypes()
            .Where(x => (x.IsInterface || x.IsClass) && HasServiceContract(x))
            .ToList();
        var registrations = new List<IRegistration>();

        //get the client section in System.ServiceModel from web.config file
        var clientSection = ConfigurationManager.GetSection("system.serviceModel/client") as ClientSection;
        //get the endpointsCollection from childSection
        var endpointCollection =
            clientSection.ElementInformation.Properties[string.Empty].Value as ChannelEndpointElementCollection;



        foreach (var serviceInterface in servicesWithWcfInterfaces)
        {
            //get the childEndpoint name from web.config file
            var endpointName = GetClientEndpointName(endpointCollection, serviceInterface);

            //register services which are declared in web.config file only.
            if (string.IsNullOrEmpty(endpointName)) continue;

            // attribute is either on the service class or the interface
            var attribute =
                (ServiceContractAttribute)
                    (Attribute.GetCustomAttribute(serviceInterface, typeof (ServiceContractAttribute)));
            if (attribute != null)
            {
                WcfClientModelBase model = null;
                // handle duplex differently
                if (attribute.CallbackContract != null)
                {
                    model = new DuplexClientModel
                    {
                        Endpoint =
                            WcfEndpoint.ForContract(serviceInterface).FromConfiguration(endpointName)
                    }.Callback(container.Resolve(attribute.CallbackContract));
                    registrations.Add(WcfClient.ForChannels(model).Configure(c => c.LifestyleSingleton()));
                }
                else
                {
                    //regular attributes
                    model = new DefaultClientModel
                    {
                        Endpoint = WcfEndpoint.ForContract(serviceInterface).FromConfiguration(endpointName)
                    };
                    registrations.Add(WcfClient.ForChannels(model).Configure(c => c.LifestyleTransient()));
                }
            }
        } 
        return container.Register(registrations.ToArray());

    }

デュプレックス サービスを 1 つだけホストしています。以下はサービス コントラクトです。

 [ServiceContract(CallbackContract = typeof(INotificationCallback))]
public interface INotificationService
{
    [OperationContract(IsOneWay = false)]
    void Subscribe(Guid subscriptionId, string userName, string[] eventNames);
    [OperationContract(IsOneWay = true)]
    void EndSubscribe(Guid subscriptionId);
}

[ServiceContract]
public interface INotificationCallback
{
    [OperationContract(IsOneWay = true)]
    void ReceiveNotification(NotificationResultDto notificationResult);
}

[DataContract]
public class NotificationResultDto
{
    [DataMember]
    public string UserName { get; set; }
    [DataMember]
    public string NotificationMessage { get; set; }
}

以下のステートメントを使用して二重サービスを解決しようとすると。var temp = _container.Resolve();

エラーが発生します-

WcfClientActivator: 内部例外でコンポーネント c2a216c2-af61-4cb2-83ba-e4d9a5cc4e68 をプロキシできませんでした - ChannelFactory.Endpoint の Address プロパティが null でした。ChannelFactory のエンドポイントには、有効なアドレスが指定されている必要があります。

クライアントセクションの下のweb.configファイルで-

<endpoint address="net.tcp://localhost:9877/NotificationService" binding="netTcpBinding"
    bindingConfiguration="netTcpBindingConfiguration" contract="ServiceContracts.INotificationService"
    name="INotificationService_Endpoint" />
4

1 に答える 1