3

我收到了传说中的Error: Cannot obtain Metadata from...消息,特别是http://localhost:1640/Service1.svc 我搜索了 stackoverflow 和 Google,到目前为止,这些都没有帮助。我创建了一个新产品来降低它的性能,但它仍然无法正常工作。所以我在这里寻求帮助。

我正在尝试设置一个使用 JSON 的 WCF 服务,这意味着我需要在 C# 中使用 webhttpbinding。当我使用 WCF 测试客户端时,出现上述元数据错误。我正在使用 Visual Studio Express 2010 和目标框架。我已经在这两天了,不明白为什么或什么问题。

我将不胜感激任何帮助。谢谢你。

这是我的 web.config 文件:

<?xml version="1.0"?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>

    <services>
      <service name="WcfService4.Service1"
        behaviorConfiguration="jsonRestDefault">

        <endpoint 
              name="jsonRestEndpoint"
              behaviorConfiguration="RESTFriendly"
              binding="webHttpBinding"
              contract="IService1"
              address="http://localhost:1640/Service1.svc"/>
      </service>
    </services>

    <behaviors>
      <serviceBehaviors>
        <behavior name="jsonRestDefault">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="RESTFriendly">
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>

    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>

这是 IService1.cs 文件:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;

namespace WcfService4
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        [WebInvoke(
            Method = "GET", 
            UriTemplate = "players",
            RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json,
            BodyStyle = WebMessageBodyStyle.Bare)]
        List<Person> GetPlayers();
    }

    // Use a data contract as illustrated in the sample below to add composite types to service operations.
    [DataContract]
    public class Person
    {
        [DataMember]
        public string FirstName { get; set; }

        [DataMember]
        public string LastName { get; set; }

        [DataMember]
        public int Age { get; set; }

        public Person(string firstName, string lastName, int age)
        {
            this.FirstName = firstName;
            this.LastName = lastName;
            this.Age = age;
        }
    }
}

这是 Service1.svc.cs 文件:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using System.Net;

namespace WcfService4
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.
    public class Service1 : IService1
    {
        public List<Person> GetPlayers()
        {
            List<Person> players = new List<Person>();
            players.Add(new Person ( "Peyton", "Manning", 35 ) );
            players.Add(new Person ( "Drew", "Brees", 31 ) );
            players.Add(new Person ( "Brett", "Favre", 38 ) );

            return players;
        }
    }
}
4

2 回答 2

1

看看这个链接

它声明如下:

WebHttpBinding 是基于 REST 的绑定 - 与 SOAP 不同,REST 不会像 WSDL/XSD 那样公开元数据。

于 2013-06-12T16:41:54.210 回答
0

除了 bruno bologna 的回答和链接之外,WCF REST Service not visible in WCFTestClient 中的链接也提供了一些非常有用的信息。基本上,它不起作用的原因是 WCFTestClient 不是为 Web 设计的(想想 JSON)。它通过 SOAP 连接。如果我有一个依赖于 JSON 的服务,我无法通过 WCFTestClient 对其进行测试。

我看到可以修改 WCFTestClient 中的客户端配置文件以启用 Web 绑定,但这可能是因为 WADL 面向未来或有人编写了 WADL 服务扩展。不过,这只是我的猜测。否则,似乎无法使用 WCFTestClient 工具使用 JSON 测试 WCF 服务。

于 2013-06-12T19:17:11.033 回答