6

我是新的 WCF 编程,我确实从以下链接遵循了一系列入门教程

http://msdn.microsoft.com/en-us/library/ms734712.aspx

我在控制台应用程序中托管了服务,但是当我尝试创建客户端并尝试添加服务引用时,出现以下异常。

下载“http: localhost:8000/GettingStarted/mex/_vti_bin/ListData.svc/$metadata”时出错。请求失败,HTTP 状态为 405:方法不允许。元数据包含无法解析的引用:'http: localhost:8000/GettingStarted/mex'。在 http: localhost:8000/GettingStarted/mex 上没有可以接受消息的端点监听。这通常是由不正确的地址或 SOAP 操作引起的。有关更多详细信息,请参阅 InnerException(如果存在)。远程服务器返回错误:(404) Not Found。如果在当前解决方案中定义了服务,请尝试构建解决方案并再次添加服务引用。

托管应用程序代码

class Program
{
    static void Main(string[] args)
    {
        // Step 1 Create a URI to serve as the base address.
        Uri baseAddress = 
            new Uri("http://localhost:8000/GettingStarted/");

        // Step 2 Create a ServiceHost instance
        ServiceHost selfHost = 
            new ServiceHost(typeof(CalculatorService), baseAddress);

        try
        {
            // Step 3 Add a service endpoint.
            selfHost.AddServiceEndpoint(typeof(ICalculator), 
                new WSHttpBinding(), 
                "CalculatorService");

            // Step 4 Enable metadata exchange.
            var smb = new ServiceMetadataBehavior();
            smb.HttpGetEnabled = true;
            selfHost.Description.Behaviors.Add(smb);

            // Step 5 Start the service.
            selfHost.Open();
            Console.WriteLine("The service is ready.");
            Console.WriteLine("Press <ENTER> to terminate.");
            Console.WriteLine();
            Console.ReadLine();

            // Close the ServiceHostBase to shutdown.
            selfHost.Close();
        }
        catch (CommunicationException ce)
        {
            Console.WriteLine("exception: {0}", ce.Message);
            selfHost.Abort();
        }
    }
}

现在我无法弄清楚问题是什么。我正在使用 Visual Studio 2012 和 .net 平台 4.5。

4

8 回答 8

8

我也有类似的问题,搞砸了。是的,您似乎正确地遵循了本教程,但是如果您想连接到它并作为服务使用(如在制作服务引用中),您还必须添加 MEX 服务端点。在您的 selfhost.Description.Behaviors.Add(smb) 之后添加这一行:

selfhost.AddServiceEndpoint(
            typeof(IMetadataExchange),
            MetadataExchangeBindings.CreateMexHttpBinding(),
            "http://localhost:8000/GettingStarted/mex");

这应该使您能够通过“添加服务参考”进行连接。另外,我发现根据您的系统,您可能需要以管理员身份运行 VS 以允许连接到网络(以防您过去不小心告诉它不)。

于 2012-10-26T19:41:35.200 回答
0

从错误信息来看,指定端口似乎没有服务监听。当您尝试向其添加服务引用时,您需要运行托管服务的控制台应用程序。

于 2012-10-26T19:01:02.183 回答
0

显然,服务没有运行,这意味着在您用来创建服务引用的 URL 上没有端点监听。

您可以在 IIS 中托管服务,或者让控制台应用程序像上面提到的 Damir 一样运行。

于 2012-10-26T19:07:30.153 回答
0

当您尝试访问它时,请确保您的服务器正在运行。还要检查服务器上的配置并确保您的客户端的端点与服务器的端点匹配。确保在使用时也使用相同的绑定。确保服务器正在侦听并且服务器的防火墙没有阻止您。如果您对 WCF 服务进行了更改,请不要忘记为您的客户端应用程序重新生成服务引用。

于 2012-10-26T19:12:00.830 回答
0

您确定您已定义 MEX 端点吗?这是提供有关您的服务的元数据信息的内容,以便工作室可以生成客户端代理。

在您链接到的教程中,它是这一点

// Step 4 Enable metadata exchange.
ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
selfHost.Description.Behaviors.Add(smb);
于 2012-10-26T19:27:42.217 回答
0

如果您在 IIS 中托管 Web 服务,请检查 web.config(在行为部分下)

httpsGetEnabled 设置为 True

于 2013-05-28T20:36:13.223 回答
0

我今天遇到了类似的问题。但是,正如@iMortalitySX 已经说过的那样,对我来说,我不需要显式添加端点。

我失败的原因不同:我绑定到http://0.0.0.0,认为监听 IP 无关紧要。事实上,通过 SoapUI,我能够连接并使用该服务。但是当试图在另一个 Visual Studio 项目中发现服务时,发现会失败,因为 VS 会得到初始响应,但随后会跟踪包含http://0.0.0.0的链接,然后失败。

因此,将http://0.0.0.0更改为我机器的正确 IP 解决了我的问题。

于 2016-07-28T16:13:31.310 回答
-1

尝试将 uri 地址放在您的浏览器中。在我的情况下,我能够看到一个 ExceptionDetail。

于 2017-03-22T07:57:58.873 回答