簡體   English   中英

WCF服務元數據發布錯誤

[英]WCF Service metadata publishing error

我是WCF的新手並試圖讓它運行起來。 我甚至無法得到一個沒有任何錯誤的空白版本。

web.config中:

 <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;
    }    
}

雖然它在web.config的records.wcf服務部分中被注釋掉,但是您正在公開(或將要公開)的端點看起來像是一個webHttpBinding端點,它是一個REST綁定。 WCF元數據交換端點僅用於SOAP端點(例如basicHttpBinding或wsHttpBinding)。 沒有辦法從這樣的WCF REST服務中獲取元數據。

如果您需要元數據,您有兩種選擇:

  1. 將您的服務重構為SOAP服務
  2. 而不是WCF,使用ASP.Net Web API。 這是專為REST而構建的,它為您提供了一個自動生成的幫助頁面,該頁面在概念上與WCF中的元數據端點相同

從你的問題來看,元數據並不是真正的目標,它只是一種檢查你的服務是否正常的方法。 如果是這種情況,您需要

  1. 從recordWCF服務行為中刪除serviceMetadata元素
  2. 刪除IMetadatExchange端點
  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)上定義並在類中實現(例如公共類服務:IService)。

此外,除非有特殊原因使用WCF(例如,您想要執行SOAP服務),我強烈建議使用ASP.Net Web API進行REST服務。 我知道了很多關於WCF比ASP.Net一般和我還是覺得它容易做 REST與ASP.Net的Web API。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM