2014-01-12 3 views
0

Я новичок в использовании служб WCF, и я надеюсь, что вы сможете помочь мне в решении некоторых проблем, связанных с внешним веб-сервисом REST. Я создал два приложения, чтобы попробовать и проверить мой сервис.Как настроить службы WCF

  1. Console приложение, чтобы проверить мой класс Lib
  2. An Umbraco приложение, которое хозяйничает свои услуги

И локальный.

Вот код моей службы:

namespace HorecaWebservices.Webservices 
{ 
    [ServiceContract] 
    public interface IWS_Test 
    { 
     [OperationContract] 
     [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json,  ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)] 
     Agenda GetAgenda(String mobileAppKey); 
    } 
} 

namespace HorecaWebservices.Webservices 
{ 

    public class WS_Test : IWS_Test 
    { 
     public Agenda GetAgenda(String mobileAppKey) 
     { 
      return BL_Agenda.GetAgenda(mobileAppKey); 
     } 
    } 
} 

Web конфигурация моей службы:

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="MyServiceTypeBehaviors"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <standardEndpoints> 
     <webHttpEndpoint> 
     <standardEndpoint name="" helpEnabled="true" 
      automaticFormatSelectionEnabled="true" 
      defaultOutgoingResponseFormat="Json"> 
     </standardEndpoint> 
     </webHttpEndpoint> 
    </standardEndpoints> 
    <services> 
     <service name="HorecaWebservices.Webservices.WS_Test" 
       behaviorConfiguration="MyServiceTypeBehaviors"> 
     <endpoint address="" binding="wsHttpBinding" 
       contract="HorecaWebservices.Webservices.IWS_Test"/> 
     <endpoint contract="IMetadataExchange" 
      binding="mexHttpBinding" address="mex"/> 
     </service> 
    </services> 
    </system.serviceModel> 

Вот код из моего консольного приложения, который вызывает метод службы:

public static class BL_Agenda 
    { 
     public static Agenda GetAgenda() 
     { 
      Agenda agenda = new Agenda(); 

      WebRequest request = WebRequest.Create("http://localhost:63462/Webservices/WS_Test.svc/GetAgenda"); 

      request.Method = "POST"; 
      request.ContentType = "application/json; charset=utf-8"; 

      string postData = "{\"mobileAppKey\":\"HEMDZ\"}"; //encode your data 



      using (Stream s = request.GetRequestStream()) 
      { 
       using (StreamWriter sw = new StreamWriter(s)) 
        sw.Write(postData); 

       s.Close(); 
      } 


      try 
      { 
       using (Stream s = request.GetResponse().GetResponseStream()) 
       { 
        using (StreamReader sr = new StreamReader(s)) 
        { 
         var jsonData = sr.ReadToEnd(); 

         agenda = JsonConvert.DeserializeObject<Agenda>(jsonData); 
        } 

        s.Close(); 
       } 
      } 

      catch (WebException e) 
      { 
       agenda = null; 
       WebExceptionStatus status = e.Status; 
       Console.WriteLine(status.ToString()); 
      } 

      return agenda; 
     } 

Теперь, когда я запускаю этот код, request.GetResponse() выдает System.Net.WebException "(415) C annot обрабатывает сообщение, потому что тип контента «application/json; charset = utf-8 'не был ожидаемым типом' application/soap + xml; кодировка = UTF-8»

Через пару часов, пытаясь выяснить, что проблема в том, я до сих пор не могу понять его .. Может кто-то помочь мне в этом?

+1

Вы указали свою ** услугу ** в 'web.config' для использования' WsHttpBinding', которая является привязкой ** SOAP ** на основе XML, а не связью ** REST ** на основе JSON вы, кажется, ожидаете на стороне клиента. Для REST используйте 'webHttpBinding' на стороне сервера вместо –

ответ

1

На первый взгляд ваша конечная точка использует неправильную привязку (wsHttpBinding):

<endpoint address="" binding="wsHttpBinding" contract="HorecaWebservices.Webservices.IWS_Test"/> 

в то время как она должна быть webHttpBinding:

<endpoint address="" binding="webHttpBinding" contract="HorecaWebservices.Webservices.IWS_Test"/> 

Для полного webHttp-образца связывания принять ло ok в этой статье: http://weblogs.asp.net/kiyoshi/archive/2008/10/08/wcf-using-webhttpbinding-for-rest-services.aspx

При изменении привязки могут возникнуть другие проблемы. Одно дело, что вам, вероятно, не понадобится <standardEndpoints> -node. Поэтому я предлагаю оставаться рядом с связанным образцом.

Кроме того, это всегда хорошо активировать tracing. После активизации отслеживания вы получите более подробную информацию о вашей ошибке 500 (и, возможно, и других).

+0

Привет, JME, сначала спасибо за ваш быстрый ответ! Поэтому я изменил web.config на webHttpBinding, и теперь он вызывает ошибку внутреннего сервера (500) .. :(.Я попробую проверить связь, которую вы мне дали. Thnx –

+1

см. Мой отредактированный ответ – khlr

+0

Привет, JME, я удалил узел в моем webconfig. Thnx для подсказки на трассировке, как только я понял, как активировать это, я надеюсь получить больше информации о моей ошибке 400 ошибок. Thnx! –

1

Этот пример не совсем то же самое, но, возможно, предложенный атрибут Factory даст вам некоторые подсказки.

HTTP/1.1 415 Cannot process the message because the content type 'application/json; charset=utf-8' was not the expected type 'text/xml; charset=utf-8'

+0

Hi william, thnx для вашего ответа! Я добавил фабрику в свой файл svc, но по-прежнему не помогаю ... после установки привязки к webHttpBinding, теперь я получаю ошибку 400 Bad request. –

1

Я получил его! Я, наконец, разобрал ошибку с плохим запросом. Мне пришлось заменить параметр BodyStyle = WebMessageBodyStyle.Bare на BodyStyle = WebMessageBodyStyle.WrappedRequest.

Thnx для всех парней помощи!

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