测试客户端不支持WCF服务契约

本文关键字:服务 契约 WCF 不支持 客户端 测试 | 更新日期: 2023-09-27 18:14:44

我是wcf的新手,正在学习如何使用回调构建wcf。我从下面的链接中得到了一个例子:

http://architects.dzone.com/articles/logging-messages-windows-0

我试着实现wcf,但是当我按f5运行这个测试时,测试客户端说:

wcf客户端不支持服务契约

服务:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant, InstanceContextMode = InstanceContextMode.PerCall)]
public class RatsService : IRatsService
{
    public static List<IRatsServiceCallback> callBackList = new List<IRatsServiceCallback>();
    public RatsService()
    {
    }
    public void Login()
    {
        IRatsServiceCallback callback = OperationContext.Current.GetCallbackChannel<IRatsServiceCallback>();
        if (!callBackList.Contains(callback)) 
        {
            callBackList.Add(callback);
        }
    }

    public void Logout()
    {
        IRatsServiceCallback callback = OperationContext.Current.GetCallbackChannel<IRatsServiceCallback>();
        if (callBackList.Contains(callback)) 
        {
            callBackList.Remove(callback);
        }
        callback.NotifyClient("You are Logged out");
    }
    public void LogMessages(string Message)
    {
        foreach (IRatsServiceCallback callback in callBackList)
            callback.NotifyClient(Message);
    }
<<p> 服务接口/strong>
[ServiceContract(Name = "IRatsService", SessionMode = SessionMode.Allowed, CallbackContract = typeof(IRatsServiceCallback))]
public interface IRatsService
{
    [OperationContract]
    void Login();
    [OperationContract]
    void Logout();

    [OperationContract]
    void LogMessages(string message);

    // TODO: Add your service operations here
}
public interface IRatsServiceCallback
{
    [OperationContract]
    void NotifyClient(String Message);
}

App.config:

<system.serviceModel>
<services>
  <service name="RatsWcf.RatsService">
    <endpoint address="" binding="wsDualHttpBinding" contract="RatsWcf.IRatsService">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8733/Design_Time_Addresses/RatsWcf/Service1/" />
      </baseAddresses>
    </host>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <!-- To avoid disclosing metadata information, 
      set the values below to false before deployment -->
      <serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
      <!-- To receive exception details in faults for debugging purposes, 
      set the value below to true.  Set to false before deployment 
      to avoid disclosing exception information -->
      <serviceDebug includeExceptionDetailInFaults="False" />
    </behavior>
  </serviceBehaviors>
</behaviors>

不知道哪里出了问题

测试客户端不支持WCF服务契约

没什么问题。WCF测试客户端是一个工具,可以用来测试许多类型的WCF服务,但不是全部——双工契约是不支持的一类服务。您需要创建某种客户端应用程序来测试它。在你的客户端应用中,你需要编写一个实现回调接口的类,这样它就可以接收由服务发起的消息。

例如,这是一个使用WCF双工的非常简单的双工客户端/服务:

public class DuplexTemplate
{
    [ServiceContract(CallbackContract = typeof(ICallback))]
    public interface ITest
    {
        [OperationContract]
        string Hello(string text);
    }
    [ServiceContract(Name = "IReallyWantCallback")]
    public interface ICallback
    {
        [OperationContract(IsOneWay = true)]
        void OnHello(string text);
    }
    public class Service : ITest
    {
        public string Hello(string text)
        {
            ICallback callback = OperationContext.Current.GetCallbackChannel<ICallback>();
            ThreadPool.QueueUserWorkItem(delegate
            {
                callback.OnHello(text);
            });
            return text;
        }
    }
    class MyCallback : ICallback
    {
        AutoResetEvent evt;
        public MyCallback(AutoResetEvent evt)
        {
            this.evt = evt;
        }
        public void OnHello(string text)
        {
            Console.WriteLine("[callback] OnHello({0})", text);
            evt.Set();
        }
    }
    public static void Test()
    {
        string baseAddress = "net.tcp://" + Environment.MachineName + ":8000/Service";
        ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
        host.AddServiceEndpoint(typeof(ITest), new NetTcpBinding(SecurityMode.None), "");
        host.Open();
        Console.WriteLine("Host opened");
        AutoResetEvent evt = new AutoResetEvent(false);
        MyCallback callback = new MyCallback(evt);
        DuplexChannelFactory<ITest> factory = new DuplexChannelFactory<ITest>(
            new InstanceContext(callback),
            new NetTcpBinding(SecurityMode.None),
            new EndpointAddress(baseAddress));
        ITest proxy = factory.CreateChannel();
        Console.WriteLine(proxy.Hello("foo bar"));
        evt.WaitOne();
        ((IClientChannel)proxy).Close();
        factory.Close();
        Console.Write("Press ENTER to close the host");
        Console.ReadLine();
        host.Close();
    }
}