【问题标题】:WCF Service (dll) host applicationWCF 服务 (dll) 主机应用程序
【发布时间】:2026-02-13 17:10:01
【问题描述】:

我有一个 WFC(4.0) 服务 dll,我必须为其创建一个主机应用程序。该dll非常简单,具有以下接口:

    [ServiceContract(CallbackContract=typeof(IChatServiceCallback))]
    public interface IService {
        [OperationContract]
        Guid Subscribe();
    }

    public interface IServiceCallback {
         void NotifyClient(strign message);
    }

当我尝试创建服务时,我的问题就出现了。当我创建从客户端到主机的通道时,出现以下异常:“提供给 ChannelFactory 的 InstanceContext 包含一个未实现 CallbackContractType 'Client.MyServiceReference.IServiceCallback' 的 UserObjecct。”

我发现在ServiceReference对象浏览器中ClientObject不包含IServiceCallback接口。这是我对应的主机代码:

    ServiceHost host = new ServiceHost(typeof(ChatService));

    try
    {
        host.BeginOpen(new AsyncCallback(OnOpen), host);
        mre.WaitOne();
        if (host.State == CommunicationState.Opened)
        {
            Console.WriteLine("Server is running!\nServer listens on the following endpoints:");
            foreach (var endp in host.Description.Endpoints)
            {
                Console.WriteLine("\t{0}", endp.Address);
            }

            Console.WriteLine("Press <Enter> to stop the server...");
            Console.ReadLine();
            host.Close();
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("Error: {0}", ex.Message);
    }

如何为包含在客户端实现的回调接口的服务 dll 创建主机应用程序?

客户端: 尝试 { clientID = client.Subscribe();

【问题讨论】:

    标签: wcf c#-4.0 .net-4.0


    【解决方案1】:

    您可以直接在客户端上使用服务合同程序集吗?如果是这样,您可以使用 DuplexChannelFactory 并完全避免客户端服务参考代码。

    例如here

    我知道这不能回答您的问题,但它可以帮助您解决它。

    【讨论】:

    • 谢谢,但是主机实现了服务功能。我有一个现成的服务,其中也包含实现。这意味着我在 dll 中也有接口和类,所以我不想在主机应用程序中重写它们。
    • 那你为什么在服务主机中使用ChannelFactory呢? ChannelFactory 用于客户端连接到服务。
    • 什么 ChannelFactory?在哪里?我认为您没有详细了解我的问题。我有一个完整的服务,我在 .dll 库中获得。我必须创建一个托管服务并接收客户端连接的主机应用程序。我不知道你刚才从哪里得到那个ChannelFactory。我只是说你给我的链接不适合我的问题。我有现成的服务,我只需要用回调接口正确地托管它。在您最近给我的链接上,该服务是在主机中实现的。我不能使用它,因为我的服务是在我想使用的 DLL 中实现的。
    • 好的,请帮助我澄清一些事情: 1. 当您启动主机进程时,您的服务是否运行? 2. 您的客户端应用程序是否通过生成的服务引用来引用您的服务? 3. 当您的客户端应用程序调用您的服务时,您是否收到异常?
    • 1.) 是的,当我启动主机进程时,我的服务正在运行。 2.) 是的,客户通过生成的代码引用。 3.)当客户端尝试调用订阅方法时,我得到了异常。