大家好我只想要一个简单的WinForm应用程序,只需一个按钮。当我按下按钮 我想启动自主WCF服务。我希望能够通过添加服务引用来连接到此服务,例如另一个客户端应用程序(winforms)。
然而,我创建的解决方案无效。我无法与此服务添加服务引用。我实际上不知道要调用哪个地址,除了我在app.config文件中定义的地址。任何帮助都会很棒。
这是app.config文件。
<configuration>
<system.serviceModel>
<services>
<service name="WindowsFormsApplication11.WmsStatService">
<endpoint address="http://192.168.0.197:87" binding="basicHttpBinding"
bindingConfiguration="" contract="WindowsFormsApplication11.IWmsStat"/>
</service>
</services>
</system.serviceModel>
</configuration>
表格代码:
namespace WindowsFormsApplication11
{
public partial class Form1 : Form
{
public ServiceHost _host = null;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
_host = new ServiceHost(typeof(WmsStatService));
_host.Open();
}
}
// Define a service contract.
[ServiceContract(Namespace = "http://WindowsFormsApplication11")]
public interface IWmsStat
{
[OperationContract]
string sayHello(string name);
}
public class WmsStatService : IWmsStat
{
public string sayHello(string name)
{
return "hello there " + name + " nice to meet you!";
}
}
}
答案 0 :(得分:1)
我更改了app.config文件。问题已经解决了。还要感谢您的提示和答案。配置更改为。
<configuration>
<system.serviceModel>
<services>
<service name="WindowsFormsApplication11.WmsStatService" behaviorConfiguration="mex">
<host>
<baseAddresses>
<add baseAddress="http://192.168.0.197:87/" />
</baseAddresses>
</host>
<endpoint address="http://192.168.0.197:87/Test" binding="basicHttpBinding" bindingConfiguration="" contract="WindowsFormsApplication11.IWmsStat" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="mex">
<serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
答案 1 :(得分:0)
主机应该在配置文件中的http://192.168.0.197:81上打开。
因此,一旦主机启动并运行,请尝试使用服务引用broswe。
我假设地址是您的机器,并且您在该端口地址上没有任何其他内容。要检查的其他事情是阻止该端口的防火墙。
答案 2 :(得分:0)
我不会将实现服务契约(接口)的服务类作为表单 - 使其成为一个单独的接口,一个单独的类。这背后的原因是服务主机必须为它需要处理的每个请求创建(实例化)服务类的一个实例 - &gt;让这些课程尽可能小,不要因为他们的工作不需要行李(如Winform)而臃肿!
然后在Winform中实例化一个ServiceHost - 但要使其成为表单的全局成员变量!否则,一旦ButtonClick事件结束,ServiceHost就会消失!
// Define a service contract.
[ServiceContract(Namespace = "http://WindowsFormsApplication11")]
public interface IWmsStat
{
[OperationContract]
string sayHello(string name);
}
public class YourServiceClass : IWmsStat
{
public string sayHello(string name)
{
return "hello there " + name + " nice to meet you!";
}
}
public partial class Form1 : Form
{
private ServiceHost _host = null;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// Create a ServiceHost for the CalculatorService type and
// provide the base address.
_host = new ServiceHost(typeof(YourServiceClass));
// Open the ServiceHostBase to create listeners and start
// listening for messages.
_host.Open();
}
不要将包含ServiceHost的类与ServiceClass(需要由主机实例化以满足传入请求)混合 - 服务实现应该是独立的,尽可能精益!
此外,遵循单一责任原则是一种好习惯 - 一个班级应该只有一份工作而只有一份工作 - 不要将整个应用程序逻辑打包成一个庞大的班级 - 将不同的工作分成不同的班级并将它们组合在一起。
马克