2014-04-17 3 views
0

У меня есть следующие:Мои RESTUL WCF не работает должным образом

In Competitions.svc: 

<%@ ServiceHost Language="C#" Debug="true" Service="MySite_WebSite.Pages.Client.CompetitionsSVC" CodeBehind="Competitions.svc.cs" %> 

В ICompetitions.cs:

namespace MySite_WebSite.Pages.Client 
{ 
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "ICompetitions" in both code and config file together. 
    [ServiceContract(Name="CompetitionsSVC")] 
    public interface ICompetitions 
    { 
     [OperationContract] 
     [WebInvoke(
      Method = "GET" 
      , RequestFormat = WebMessageFormat.Json 
      , ResponseFormat = WebMessageFormat.Json 
      , UriTemplate = "DoWork" 
      , BodyStyle=WebMessageBodyStyle.Wrapped 
     )] 
     Dictionary<DateTime, List<Competitions.Entry>> DoWork(); 
    } 
} 

В Competitions.svc.cs:

namespace MySite_WebSite.Pages.Client 
{ 
    [DataContract] 
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] 
    public class CompetitionsSVC : ICompetitions 
    { 
     #region ICompetitions Members 

     public Dictionary<DateTime, List<Competitions.Entry>> DoWork() 
     { 
      var c = new Competitions(); 

      return c.GetMonthlyEntries(new Competitions.ParamGetMonthlyEntries() 
      { 
       Start = DateTime.Now.Date.AddMonths(-1) 
       , End = DateTime.Now.Date.AddMonths(2) 
       , UserLang = "fr-BE" 
       , ActiveLang = "fr-BE" 
       , IsExternal = false 
      }); 
     } 

     #endregion 
    } 
} 

В Web.config:

<system.serviceModel> 
    <services> 
     <service name="MySite_WebSite.WS.WCF.SubsetMID"> 
     <endpoint address="" 
        binding="wsHttpBinding" 
        contract="MySite_WebSite.WS.WCF.ISubsetMID" /> 

     <endpoint address="mex" 
        binding="mexHttpBinding" 
        contract="IMetadataExchange" /> 
     </service> 
     <service name="MySite_WebSite.Pages.Client.CompetitionsSVC"> 
     <endpoint address="" 
        binding="webHttpBinding" 
        behaviorConfiguration="WebBehavior" 
        contract="MySite_WebSite.Pages.Client.ICompetitions" /> 

     <endpoint address="mex" 
        binding="mexHttpBinding" 
        contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <bindings> 
     <wsHttpBinding> 
     <binding> 
      <security mode="None"/> 
     </binding> 
     </wsHttpBinding> 
     <netTcpBinding> 
     <binding name="NetTcpBinding_IServiceWCallBack" sendTimeout="00:10:00" 
      maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"> 
      <readerQuotas maxStringContentLength="2147483647" /> 
      <security mode="None" /> 
     </binding> 
     <binding name="NetTcpBinding_IHandleSubset"> 
      <security mode="None" /> 
     </binding> 
     </netTcpBinding> 
    </bindings> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <serviceMetadata httpGetEnabled="true" /> 
     </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="WebBehavior"> 
      <webHttp /> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment 
     multipleSiteBindingsEnabled="true" 
     aspNetCompatibilityEnabled="true" 
    /> 
    </system.serviceModel> 

Когда я ввожу URL-адрес

localhost2/MySite_WebSite/Pages/Client/Competitions.svc/DoWork 

, он не работает. У меня есть точка останова в начале метода, и я вижу, что метод вызывается дважды, но он ничего не возвращает (я даже не думаю, что он отправляет обратные коды HTTP-кода).

Что я сделал не так?

Дополнительные примечания:

Entry на самом деле является "базовым классом".

public class EntryCompetition : Entry 
    public class EntryEvent : Entry 

В моем коде словарь фактически содержит EntryCompetition и EntryEvent экземпляров.

+0

Я добавил «Дополнительные примечания» –

ответ

0

Благодарим за отправку кода, который определенно помогает. Но я думаю, вам нужно будет показать немного больше работы и еще несколько конкретных результатов о том, как провалится ваш проект. Но чтобы не оставить вас беспомощными. Я рекомендую посмотреть на скрипача

http://www.telerik.com/fiddler

Это позволяет создавать запросы HTTP и видеть ответы внутри это консоль. полезно узнать, какой именно код ответа HTTP возвращает ваша конечная точка, и позволяет вам изменить ваш запрос через окно композитора.

Еще один полезный совет - это шаг за шагом через ваш код, поэтому вы можете указать нам, что именно происходит в строке или какие значения устанавливаются до завершения вашего метода.

Без дополнительной информации, моя лучшая догадка заключается в том, что вы бросаете код и, скорее всего, проглатываете исключение. Или ваши методы или вызовы устанавливают нулевые значения, которые не возвращают ожидаемые значения. Ответьте, как только вы настроите некоторые дополнительные тесты и обновите свой вопрос, если у вас все еще есть проблемы.

+0

Результат, как сервер не отвечает вообще. Нет 404, или что-то такое. Например, когда я делаю запрос с firefox, он заканчивает добавление www. и .com на "localhost2". –

+0

Ошибка [Fiddler] ReadResponse(): сервер не ответил на этот запрос. Сервер вернул 0 байт. (Примечание: я устанавливаю browser.fixup.alternate.enabled на false, чтобы предотвратить + www. + .com) –

+0

Возможно, я неправильно понял, но вы можете подтвердить, что получаете код в своем коде при совершении звонка.Это звучало так, будто вы могли отлаживать и ударять точки останова. – Madullah

0

Хорошо, я решил проблему. Я использую специальный код o для сериализации dictionnary в строку JSON, и я больше не использую объекты DateTime в качестве ключей.

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