无法连接到自托管WCF服务

本文关键字:WCF 服务 连接 | 更新日期: 2023-09-27 18:08:48

我正在尝试构建一个相当基本的WCF SOAP web服务作为Windows服务自托管。Windows服务本身在我的机器上已经启动并运行了——我只是无法通过Visual Studio或web浏览器在本地访问它。

下面是相关的c#代码。假设MyDummyService实现契约IDummyService:
public class Program : ServiceBase
{
    private ServiceHost host = null;
    private readonly Uri baseAddress = new Uri("http://localhost:8000/DummyAPI");
    public static readonly ILog log = LogManager.GetLogger(typeof(Program));
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    public static void Main(string[] args)
    {
        ServiceBase.Run(new Program());
    }
    public Program()
    {
        this.ServiceName = "DummyService";
    }
    protected override void OnStart(string[] args)
    {
        log.Info("Starting service");
        try
        {
            base.OnStart(args);
            host = new ServiceHost(typeof(MyDummyService), baseAddress);
            host.Open();
        }
        catch (Exception ex)
        {
            log.Error(ex.ToString());
        }
        finally
        {
            if (host != null)
                ((IDisposable)host).Dispose();
        }
    }
    protected override void OnStop()
    {
        log.Info("Stopping service");
        base.OnStop();
        host.Close();
    }
}

相关app.config:

<system.serviceModel>
    <services>
        <service name="DummyAPI.MyDummyService" 
                 behaviorConfiguration="MyDummyBehavior">
           <endpoint 
               address="" 
               binding="basicHttpBinding" 
               contract="DummyAPI.IDummyService" />
           <endpoint address="mex" binding="mexHttpBinding" 
                     contract="IMetadataExchange" />
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="MyDummyBehavior">
                <serviceMetadata httpGetEnabled="True" policyVersion="Policy15"/>
                <serviceDebug includeExceptionDetailInFaults="True"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

访问

http://localhost:8000/DummyAPI

http://localhost:8000/DummyAPI/MyDummyService

(或后面跟着?wsdl的任何一个)在web浏览器中,我得到一个404。第一个显而易见的问题是:我在上面搞砸了什么?

web.config名称空间(或看起来像名称空间)让我有点困惑。我可以安全地在现场弥补什么,什么需要反映c#类名称空间?

无法连接到自托管WCF服务

看起来你是在Start方法中处置你的ServiceHost,这有效地使你没有运行ServiceHost。

finally
{
    if (host != null)
        ((IDisposable)host).Dispose();
}

使用配置文件配置服务是一个很好的入门。

service元素上的name属性必须是实现该服务的类型的完全限定名。

端点元素上的contract属性必须是服务实现的接口的完全限定名。

如果满足这两个条件,那么ServiceHost应该找到并应用应用配置中指定的配置。

如果您是WCF的新手,一种简单的入门方法是使用WCF服务配置编辑器,它可以从Visual Studio的工具菜单中获得。