自托管WCF无法访问

时间:2009-08-15 03:19:11

标签: winforms wcf

大家好我只想要一个简单的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!";
        }
    }
}

3 个答案:

答案 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(需要由主机实例化以满足传入请求)混合 - 服务实现应该是独立的,尽可能精益!

此外,遵循单一责任原则是一种好习惯 - 一个班级应该只有一份工作而只有一份工作 - 不要将整个应用程序逻辑打包成一个庞大的班级 - 将不同的工作分成不同的班级并将它们组合在一起。

马克