0

現在、WCF サービスを作成し、コマンドライン アプリケーションからホストしようとしています。サービスのホスティング中に、MyProxy というオブジェクトのインスタンスでサービスを初期化しようとしています。サービスへのすべての呼び出しは、MyProxy に委任する必要があります。

サービスを作成し、呼び出しを行いました。しかし、サービスで MyProxy インスタンスを初期化できません。常にヌルです。そのため、サービスへの呼び出しが行われると、それをプロキシに委任できません。

私はこの 2 日間からこの仕事をしようとしてきました。何が起こっているのかわかりません。親切に助けてください。

public class MasOperationsService : IMasOperations
{
    //This MyProxy instance should be used to delegate all calls to service.
    public MyProxy myProxyInstance;

    public MasOperationsService()
    {
        myProxyInstance = null;
    }
    public MasOperationsService(MyProxy proxy)
    {
        myProxyInstance = proxy;
    }

    public CoAuthorSearchResult ExtractCoAuthorsFromAuthor(long authorCellId, uint levelsToExtract)
    {
        //The service will delegate the call to MyProxy.
        //myProxyInstance is always null

        return myProxyInstance.GetProxyData(...);
    }
}

public class MyInstanceProvider : IInstanceProvider
{
    public object GetInstance(InstanceContext instanceContext, Message message)
    {
        MyProxy name = message.Headers.GetHeader<MyProxy>("Name", "http://my.namespace");
        if (name != null)
        {
            return new MasOperationsService(name);
        }
        return null;
    }
    public object GetInstance(InstanceContext instanceContext)
    {
        return new MasOperationsService(null);
    }
    public void ReleaseInstance(InstanceContext instanceContext, object instance)
    {
    }
}

public class MyServiceBehavior : IServiceBehavior
{
    MyInstanceProvider myProvider = new MyInstanceProvider();
    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) { }
    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers)
        {
            foreach (EndpointDispatcher ed in cd.Endpoints)
            {
                ed.DispatchRuntime.InstanceProvider = this.myProvider;
            }
        }
    }
    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { }
}  

サービスは、

class MyServiceLauncher
{
    ServiceHost host;
    IMasOperations proxy;
    ChannelFactory<IMasOperations> factory;

    public void StartService(MyProxy proxyInstance)
    {
        string baseAddress = "http://localhost:8730/Design_Time_Addresses/MASService/Service1";
        host = new ServiceHost(typeof(MasOperationsService), new Uri(baseAddress));
        host.AddServiceEndpoint(typeof(IMasOperations), GetBinding(), "");
        host.Description.Behaviors.Add(new MyServiceBehavior());
        host.Open();
        Console.WriteLine("Host opened");

        factory = new ChannelFactory<IMasOperations>(GetBinding(), new EndpointAddress(baseAddress));
        proxy = factory.CreateChannel();

        using (OperationContextScope scope = new OperationContextScope((IContextChannel)proxy))
        {
            OperationContext.Current.OutgoingMessageHeaders.Add(MessageHeader.CreateHeader("Name", "http://my.namespace", proxyInstance));
        }
    }

    public void ShutDownService()
    {
        ((IClientChannel)proxy).Close();
        factory.Close();
        host.Close();
    }

    static Binding GetBinding()
    {
        BasicHttpBinding result = new BasicHttpBinding();
        return result;
    }
}

また、Debugger.Launch() をほぼすべての場所に配置して、初期化されていることを確認しました (Service のコンストラクターと IInstanceProvider の両方)。それは解雇されません。

4

1 に答える 1

0

不足しているタイプは次のとおりです。また、このサービスには、return myProxyInstance.GetProxyData(...);という呼び出しがあります。ドットを削除すると、アプリケーションがコンパイルされます。

[ServiceContract]
public interface IMasOperations
{
    [OperationContract]
    CoAuthorSearchResult ExtractCoAuthorsFromAuthor(long AuthorCellId, uint LevelsToExtract);
}

public class CoAuthorSearchResult
{ }

public class MyProxy
{ 
    public CoAuthorSearchResult GetProxyData()
    {
        return new CoAuthorSearchResult();
    }
}

@kobacは、GetInstanceが呼び出されている場所を示すコードを要求しました。これを行う必要がある方法と理由がわかりません。

現在、サービスクラスのオブジェクト(クライアントでMasOperationsClient)を作成し、メソッドExtractCoAuthorsFromAuthor()を呼び出しています。

于 2012-08-24T18:27:58.660 に答える