2013-03-03 6 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> 

Что касается моего ФОС кода, там не так много, чтобы делать ... пока. Я просто пытаюсь узнать, как настроить web.config без каких-либо ошибок. А вот мое определение ФОС:

[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

Если вы перейдете к сервису, какая у вас ошибка? –

+0

Публикация метаданных для этой службы в настоящее время отключена. –

+0

На обоих концах? Кроме того, вы, кажется, пропустили конец вашего класса wcf ... –

ответ

2

Хотя закомментировано в сервисном разделе records.wcf вашего web.config, это выглядит как конечная точка вы обнажая (или собираетесь выставить) является WebHttpBinding конечная точка, которая является привязкой REST. Конечная точка обмена метаданными WCF предназначена только для конечных точек SOAP (например, basicHttpBinding или wsHttpBinding). Невозможно получить метаданные из служб REST WCF, подобных этому.

Если вам нужны метаданные, у вас есть два варианта:

  1. реорганизовать сервис как услугу SOAP
  2. Вместо WCF, использующий Web API ASP.Net. Это специально построенный для отдыха и дает вам автоматически сгенерированной страницу справки, которая концептуально совпадает с конечной точкой метаданных в WCF

Судя по вашему вопросу, метаданные на самом деле не цель, это просто способ проверить, идет ли ваша служба OK. Если это так, то вам нужно

  1. Удалить элемент serviceMetadata от вашего поведения службы recordWCF
  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) и реализуется в классе (например, public class Service: IService).

Кроме того, если только нет особых причин для использования WCF (например, вы хотите использовать SOAP-сервис), я настоятельно рекомендую ASP.Net Web API для служб REST. Я знаю намного больше о WCF, чем ASP.Net вообще и еще Я нахожу это много проще сделать ОТДЫХ с ASP.Net Web API.

Смежные вопросы