错误:无法获取元数据;使用WCF测试客户端,C#,并尝试实现webhttpbinding和json

时间:2013-06-12 16:29:46

标签: c# json wcf metadata webhttpbinding

我收到了传说中的Error: Cannot obtain Metadata from...消息,特别是http://localhost:1640/Service1.svc我已经搜索了stackoverflow和谷歌,到目前为止,它都没有帮助。我创造了一个新产品,使其愚蠢,它仍然无法正常工作。所以我在这里寻求帮助。

我正在尝试设置一个使用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;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

看看这个link

它陈述如下:

  

WebHttpBinding是一个基于REST的绑定 - REST不会公开   WSDL / XSD之类的元数据与SOAP相反。

答案 1 :(得分:0)

除了布鲁诺博洛尼亚的答案和链接外,WCF REST Service not visible in WCFTestClient的链接还提供了一些非常有用的信息。基本上,它不起作用的原因是WCFTestClient不是为web设计的(想想JSON)。它通过SOAP挂钩。如果我有一个依赖于JSON的服务,我无法通过WCFTestClient测试它。

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