Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# channeldispatcher无法打开其ichannellistener_C#_Wcf_Delegates_Servicehost - Fatal编程技术网

C# channeldispatcher无法打开其ichannellistener

C# channeldispatcher无法打开其ichannellistener,c#,wcf,delegates,servicehost,C#,Wcf,Delegates,Servicehost,我从WCF开始。我已经创建了两个控制台应用程序(服务器和客户端),它们工作时没有任何问题,但自从将它们移动到表单之后,我遇到了各种各样的问题。我在网上看了这里和其他地方,似乎找不到任何能帮助我解决问题的东西。老实说,我不理解这个问题,但我认为这可能与我的数据类型有关(它们在不同的名称空间下) 这是我的服务器代码: public partial class Form1 : Form { ModelDataServer Server; public ScraperForm()

我从WCF开始。我已经创建了两个控制台应用程序(服务器和客户端),它们工作时没有任何问题,但自从将它们移动到表单之后,我遇到了各种各样的问题。我在网上看了这里和其他地方,似乎找不到任何能帮助我解决问题的东西。老实说,我不理解这个问题,但我认为这可能与我的数据类型有关(它们在不同的名称空间下)

这是我的服务器代码:

public partial class Form1 : Form
{
    ModelDataServer Server;
    public ScraperForm()
    {
        InitializeComponent();

        Server = new ModelDataServer(); // Opened Here
        Server.Scraper = this;
    }
}

[ServiceContract]
public interface IModelData
{
    [OperationContract]
    ArrayList GetData();
}

[ServiceBehavior(UseSynchronizationContext=false)]
public class ModelDataServer : IModelData
{
    ServiceHost Host;
    public DataModel Model { private get; set; }

    public ModelDataServer()
    {
        Host = new ServiceHost(typeof (ModelDataServer), 
            new Uri[]
            {
                new Uri("http://localhost:8000")
            });

        Host.AddServiceEndpoint(typeof(IModelData),
            new BasicHttpBinding(),
            "ModelData");

        Host.Open();    // Error Points Here!!!
    }

    public ArrayList GetData()
    {
        return Model.GetData();
    }

    public void CloseServer()
    {
        Host.Close();
    }
}
这是我的客户代码:

[ServiceContract]
public interface IModelData
{
    [OperationContract]
    ArrayList GetData();
}

[ServiceBehavior(UseSynchronizationContext = false)]
public class ModelDataClient
{
    ChannelFactory<IModelData> HttpFactory;
    IModelData HttpProxy;

    public ModelDataClient()
    {
        HttpFactory = new ChannelFactory<IModelData>(
            new BasicHttpBinding(),
            new EndpointAddress("http://localhost:8000/ModelData"));

        HttpProxy = HttpFactory.CreateChannel();
    }

    public ArrayList GetData()
    {
        return HttpProxy.GetData();
    }
}

另外,我一直在努力让学员在我在教程中所做的工作之外工作。如果有人能建议一种更好的方法来使用委托,而不是将我的表单类传递到另一个类中,那就太好了。

是的,这很可能与命名空间问题有关。为了说明问题,让我们假设您的服务器项目的命名空间是
ServerApp
,而您的客户机的命名空间是
ClientApp
。您在两个应用程序中都定义了
IModelData
,这意味着您拥有
ServerApp.IModelData
ClientApp.IModelData
。尽管代码相同,但这是两个独立的接口(因为名称空间)

因此,您正试图将
ClientApp.IModelData
传递给该服务,它期望
ServerApp.IModelData

您可以通过将接口
IModelData
移动到其自己的程序集,并让服务器应用程序和客户端应用程序都引用第三个程序集来解决此问题。这就是我们在工作中所做的——我们所有的服务合同都在一个单独的程序集中(实际上是两个,但情况不同)

还有几件事需要注意:

除非您的客户端也在托管服务,否则您可以从类中删除
[ServiceContract]
属性。客户不需要这样

在您的服务器应用程序中,什么是
server.Scraper=this用于?它似乎将表单分配给服务中的属性
Scraper
,但我在代码中没有看到该属性。此外,服务并不真正使用属性(我想我看到了一些地方,你可以这样做,但这不是直观的)。我认为您不希望将整个表单分配给服务,因为服务本身通常没有UI—它们提供数据并从服务接收数据

The ChannelDispatcher at 'http://localhost:8000/ModelData' with contract(s) '"IModelData"' is unable to open its IChannelListener.