"未找到默认端点"启动WCF客户端时

时间:2015-05-07 10:57:37

标签: c# wpf wcf windows-services

我有一个代表WCF-Host的Windows服务和一个代表WCF-Client的WPF-Client-Application。 通信应该是双工的,所以我选择了WSDualHttpBinding。 首先,我安装并启动我的服务,打开WCF连接后,我启动我的WPF应用程序,我得到以下错误(我翻译它): 没有找到合同的默认端点 \" WCFCloudManagerFolderWatcherService.Interfaces.IFilesDuplex \"在服务模型客户端配置部分中 指。这可能是由于:没有找到配置文件的目的 或者在客户端元素中没有找到与此合同相对应的端点元素。

合同: IFilesDuplex-合同:

import logging
logging.basicConfig()

logger = logging.getLogger("mylogger")
logger.info("test")
logger.debug("test")

IFilesDuplexCallback:

[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples", SessionMode = SessionMode.Required,
            CallbackContract = typeof(IFilesDuplexCallback))]
public interface IFilesDuplex
{
    [OperationContract(IsOneWay = true)]
    void Update();
}

客户机侧 的CallbackHandler:

interface IFilesDuplexCallback
{
    [OperationContract(IsOneWay = true)]
    void Equals(string[] result);
}

客户本身:

class CallbackHandler : IFilesDuplexCallback
{
    public event Action<string[]> ReceivedList = delegate { };

    public void Equals(string[] result)
    {
        this.ReceivedList(result);
    }
}

来自主窗口的代码,引发错误:

class FilesDuplexClient : DuplexClientBase<IFilesDuplex>, IFilesDuplex
{
    public FilesDuplexClient(InstanceContext callbackCntx)
        : base(callbackCntx)
    {            
    }

    public void Update()
    {
        base.Channel.Update();
    }
}

Serverside(Windows服务) FileProtocoll-Class(服务器代码)

CallbackHandler ch = new CallbackHandler();
        ch.ReceivedList += ch_ReceivedList;

        // Construct InstanceContext to handle messages on callback interface
        InstanceContext instanceContext = new InstanceContext(ch);

        // Create a client
        FilesDuplexClient client = new FilesDuplexClient(instanceContext);
        client.Update();

OnStart-Method(在线程中)中的代码:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class FileProtocoll : IFilesDuplex
{
    IFilesDuplexCallback Callback
    { get { return OperationContext.Current.GetCallbackChannel<IFilesDuplexCallback>(); } }

    void IFilesDuplex.Update()
    {
        //....
        Callback.Equals(null);// just a dummy
        //...
    }

}

OnStop-Method中的代码(在线程中):

// Step 1 Create a URI to serve as the base address.
        Uri baseAddress = new Uri("http://localhost:8899/CloudManager/CommunicationChannel1");

        // Step 2 Create a ServiceHost instance
        if (selfHost != null)
        {
            selfHost.Close();
        }

        selfHost = new ServiceHost(typeof(FileProtocoll), baseAddress);

        try
        {
            // Step 5 Start the service.
            selfHost.Open();



        }
        catch (CommunicationException ce)
        {
             selfHost.Abort();
        }

App.config中:

if (selfHost != null)
        {
            if (selfHost.State != CommunicationState.Closed)
            { 
                selfHost.Close();
            }

            selfHost = null;
        }

1 个答案:

答案 0 :(得分:0)

我终于明白了。 不得不对我的客户端app.config进行一些更改,并且必须关闭安全性。

<强>的app.config(客户端):

<!-- WCF Client information-->
<system.serviceModel>
<bindings>
  <wsDualHttpBinding>
    <binding name="WSDualHttpBinding_IFilesDuplex">
      <security mode="None"/>
    </binding>
  </wsDualHttpBinding>
</bindings>
<client>
  <endpoint
    address="http://localhost:8899/CloudManager/CommunicationChannel1"
    binding="wsDualHttpBinding"
    bindingConfiguration="WSDualHttpBinding_IFilesDuplex"
        contract="WCFCloudManagerFolderWatcherService.Interfaces.IFilesDuplex"
    name="WSDualHttpBinding_IFilesDuplex">
    <identity>
      <userPrincipalName value="localhost"/>
    </identity>
  </endpoint>
</client>

并且在服务器端的app.config中我也可以设置

<security mode="None"/>

现在连接正常。