我从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();
}
}下面是我正在接收的错误(指向打开ServiceHost的位置):
The ChannelDispatcher at 'http://localhost:8000/ModelData' with contract(s) '"IModelData"' is unable to open its IChannelListener. 我一直在努力让代表们在我在教程中做的事情之外工作。如果有人可以建议一种更好的方法来使用委托,而不是将我的表单类传递给另一个类,那就太好了。
发布于 2013-12-15 18:55:08
是的,这很可能与命名空间问题有关。为了说明问题,让我们假设服务器项目的命名空间是ServerApp,而客户端的命名空间是ClientApp。在这两个应用程序中都定义了IModelData,这意味着您有ServerApp.IModelData和ClientApp.IModelData。尽管代码是相同的,但它们是两个独立的接口(因为名称空间)。
因此,您正在尝试将ClientApp.IModelData传递给服务,而它正在等待ServerApp.IModelData。
您可以通过将接口IModelData移动到自己的程序集,并让服务器应用程序和客户端应用程序都引用第三个程序集来解决这个问题。这就是我们在工作中所做的--我们所有的服务合同都在一个单独的集合中(实际上是两个,但这是另一个故事)。
还有几件事要注意:
除非客户端也承载服务,否则可以从类中删除[ServiceContract]属性。客户不需要这个。
在您的服务器应用程序中,Server.Scraper = this;是干什么的?它似乎在将表单分配给服务中的属性Scraper,但我在代码中没有看到该属性。此外,服务并不真正使用属性(我想我在某个地方看到了可以这样做的地方,但这不是直观的)。我不认为您希望将整个表单分配给服务,因为服务本身通常没有UIs -它们提供数据并从服务接收数据。
https://stackoverflow.com/questions/20593957
复制相似问题