1

我有一个在 winforms 应用程序中自托管的 WCF 服务。我使用了以下链接:

当我使用 WCF 测试客户端并尝试添加服务时,我收到以下错误:添加服务失败。服务元数据可能无法访问。确保您的服务正在运行并公开元数据。

错误详情:

错误:无法从http://localhost:8001/HelloWorld获取元数据如果这是您有权访问的 Windows (R) Communication Foundation 服务,请检查您是否已在指定地址启用元数据发布。

有关启用元数据发布的帮助,请参阅位于http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata Exchange Error URI: http://localhost:8001/HelloWorld的 MSDN 文档

元数据包含无法解析的引用:“http://localhost:8001/HelloWorld”。

http://localhost:8001/HelloWorld上没有可以接受消息的端点侦听。这通常是由不正确的地址或 SOAP 操作引起的。有关更多详细信息,请参阅 InnerException(如果存在)。

无法连接到远程服务器 由于目标机器主动拒绝,无法建立连接 127.0.0.1:8001HTTP GET 错误 URI: http://localhost:8001/HelloWorld

下载“http://localhost:8001/HelloWorld”时出错。

无法连接到远程服务器

无法建立连接,因为目标机器主动拒绝它 127.0.0.1:8001

这是我的代码:

public Server()
{
    InitializeComponent();

    using (host = new ServiceHost(typeof(HelloWorldService), new Uri("http://localhost:8001/HelloWorld")))
    {
        // Check to see if the service host already has a ServiceMetadataBehavior
        ServiceMetadataBehavior smb = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
        // If not, add one
        if (smb == null)
            smb = new ServiceMetadataBehavior();
        smb.HttpGetEnabled = true;
        smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
        host.Description.Behaviors.Add(smb);

        //You need to add a metadata exchange (mex) endpoint to your service to get metadata.
        host.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, MetadataExchangeBindings.CreateMexHttpBinding(), "mex");

        //http
        host.AddServiceEndpoint(typeof(IHelloWorldService), new WSHttpBinding(), "");

        host.Open();
    }
}

[ServiceContract]
public interface IHelloWorldService
{
    [OperationContract]
    string SayHello(string name);
}

public class HelloWorldService : IHelloWorldService
{
    public string SayHello(string name)
    {
        return string.Format("Hello, {0}", name);
    }
}
4

3 回答 3

1

我不知道为什么,但是将 using(){} 切换到 try{}..catch{} 可以让这段代码正常运行。WCF 测试客户端可以成功添加服务,我可以通过以下方式浏览到正在运行的服务:http://localhost:8001/HelloWorld

于 2012-05-07T20:26:09.710 回答
0

似乎根本原因在底部:

无法连接到远程服务器 由于目标机器主动拒绝,无法建立连接 127.0.0.1:8001

我会检查您的事件日志以查看 host.Open() 调用是否失败(可能是由于防火墙或其他原因),或者使用调试器遍历它,然后使用 telnet 来查看它是否真的在监听 8001。

于 2012-05-05T01:25:15.943 回答
0

这是它的解决方案试试这个它会工作

Uri baseAddress = new Uri("http://localhost:8001/HelloWorld");

    // Create the ServiceHost.
    using (serviceHost = new ServiceHost(typeof(HelloWorldService), baseAddress))
    {
        // Enable metadata publishing.
        ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
        smb.HttpGetEnabled = true;
        smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
        serviceHost.Description.Behaviors.Add(smb);

        // Open the ServiceHost to start listening for messages. Since
        // no endpoints are explicitly configured, the runtime will create
        // one endpoint per base address for each service contract implemented
        // by the service.
        serviceHost.AddServiceEndpoint(typeof(IHelloWorldService), new WSHttpBinding(), "");
        serviceHost.Open();

    }
于 2012-05-17T11:51:12.657 回答