2013-03-03 129 views
0

我是WCF的新手,並試圖啓動並運行它。我甚至無法獲得一個空白的版本沒有任何錯誤。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; 
    }  
} 
+0

如果您瀏覽到該服務,您會得到什麼錯誤? – 2013-03-03 19:04:56

+0

此服務的元數據發佈當前已禁用。 – 2013-03-03 19:07:36

+0

在兩個端點上?此外,你似乎錯過了你的wcf課程的結束... – 2013-03-03 19:09:14

回答

2

雖然在你的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)上定義並且在類中實現(例如,公共類Service:IService)。另外,除非使用WCF的特殊原因(例如,您想要執行SOAP服務),否則我會強烈建議使用ASP.Net Web API進行REST服務。我對WCF的瞭解比ASP更多。網一般和仍然我覺得它更容易做與ASP.Net Web API的REST。