0

我是 WCF 的新手,正在尝试启动并运行它。我什至不能得到一个没有任何错误的空白版本。

网络配置:

 <system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="ServiceAspNetAjaxBehavior">
          <enableWebScript />
        </behavior>

        <!--wcf-->     
        <behavior name="recordsWCF">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="recordsSWCF" >
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    <!--end wcf-->      

    </behaviors> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />   
    <services>


      <!--wcf-->
      <service name="records.wcf" behaviorConfiguration="recordsSWCF" >
        <!--<endpoint address="" binding="webHttpBinding" contract="IService" behaviorConfiguration="recordsWCF"/>-->
        <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
      </service>
      <!--end wcf-->         

      <service name="Service">
        <endpoint address="" behaviorConfiguration="ServiceAspNetAjaxBehavior" binding="webHttpBinding" contract="Service" />
      </service>
    </services>
  </system.serviceModel>

就我的 wcf 代码而言,目前还没有什么可做的。我只是想学习如何设置 web.config 而不会出现任何错误。这是我的 wcf 定义:

[ServiceContract(Namespace = "records")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class wcf
{

 public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }      
    [OperationContract]
    [WebGet]
    public string GetData()
    {
        Person p = new Person();
        List<Person> test = new List<Person>();
        p.Name = "Tom";
        p.Age = 28;   
        test.Add(p);   
        p = new Person();
        p.Name = "Dan";
        p.Age = 22;
        test.Add(p);
        JavaScriptSerializer js = new JavaScriptSerializer();   
        string jsonString = js.Serialize(test);    

        return jsonString;
    }    
}
4

1 回答 1

2

尽管它在 web.config 的 records.wcf 服务部分中被注释掉,但看起来您要公开(或将要公开)的端点是一个 webHttpBinding 端点,它是一个 REST 绑定。WCF 元数据交换端点仅用于 SOAP 端点(例如 basicHttpBinding 或 wsHttpBinding)。没有办法像这样从 WCF REST 服务中获取元数据。

如果您需要元数据,您有两种选择:

  1. 将您的服务重构为 SOAP 服务
  2. 使用 ASP.Net Web API 而不是 WCF。这是为 REST 专门构建的,并为您提供了一个自动生成的帮助页面,该页面在概念上与 WCF 中的元数据端点相同

从您的问题来看,元数据并不是真正的目标,它只是检查您的服务是否正常的一种方式。如果是这种情况,您需要

  1. 从您的 recordWCF 服务行为中删除 serviceMetadata 元素
  2. 删除 IMetadataExchange 端点
  3. 添加服务端点

您的 web.config 应如下所示:

  <system.serviceModel>
    <behaviors>
      <endpointBehaviors>

        <!--wcf-->
        <behavior name="recordsWCF">
          <webHttp/>
          <enableWebScript />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="recordsSWCF" >
          <!--<serviceMetadata httpGetEnabled="true" />-->
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
      <!--end wcf-->

    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <services>


      <!--wcf-->
      <service name="records.Service" behaviorConfiguration="recordsSWCF" >
        <endpoint address="" binding="webHttpBinding" contract="records.Service" behaviorConfiguration="recordsWCF"/>
        <!--<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />-->
      </service>
      <!--end wcf-->
    </services>
  </system.serviceModel>

实现服务的类应该是这样的

using System.Collections.Generic;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
using System.Web.Script.Serialization;

namespace records
{
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    [ServiceContract]
    public class Service
    {
        public class Person
        {
            public string Name { get; set; }
            public int Age { get; set; }
        }

        [WebGet]
        public string GetData()
        {
            Person p = new Person();
            List<Person> test = new List<Person>();
            p.Name = "Tom";
            p.Age = 28;
            test.Add(p);
            p = new Person();
            p.Name = "Dan";
            p.Age = 22;
            test.Add(p);
            JavaScriptSerializer js = new JavaScriptSerializer();
            string jsonString = js.Serialize(test);

            return jsonString;
        }
    }
}

.svc 的标记应该类似于

<%@ ServiceHost Language="C#" Debug="true" Service="records.Service" CodeBehind="Service.svc.cs" %>

使用该配置,当我浏览到http://localhost:56157/Service.svc/GetData我得到

[{"Name":"Tom","Age":28},{"Name":"Dan","Age":22}]

您必须在 Chrome 中执行此操作,而不是在 IE 中。如果您在 IE 中尝试它,它会尝试将 JSON 作为文件打开。

请注意,在实现服务的同一个类上定义服务合同有点不寻常。更常见的是,服务契约定义在一个接口(例如 IService)上并在一个类中实现(例如公共类 Service : IService)。

此外,除非有使用 WCF 的特殊原因(例如,您想做一个 SOAP 服务),否则我强烈推荐 ASP.Net Web API 用于 REST 服务。我通常比 ASP.Net 了解更多关于 WCF 的知识,但我仍然发现使用 ASP.Net Web API 执行 REST容易。

于 2013-03-03T20:14:23.190 回答