2010-01-16 2 views
1

Я столкнулся с «интересной» ошибкой с моим веб-сервисом WCF JSONP. Это единственный, который у меня есть, и он предоставляет только один метод. Если я ударил свою службу через веб-браузер внутренне, он выдает сообщение о том, что, фактически, MEX не включен (true). Если я ударил его из-за пределов нашей сети (например, если бы вы были на машине в моей компании), он просто сидит и, наконец, истекает. URL-адрес: http://demo.rivworks.com/services/Negotiate.svc. Любые идеи относительно того, что может вызвать такое поведение?C# WCF работает внутри корпоративного брандмауэра, но не снаружи

Вот web.config:

<!-- WCF configuration --> 
    <system.serviceModel> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="JsonpServiceBehavior"> 
      <webHttp /> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 

    <services> 
     <service name="RivWorks.Web.Service.NegotiateService"> 
     <endpoint address="" 
       binding="customBinding" 
       bindingConfiguration="jsonpBinding" 
       behaviorConfiguration="JsonpServiceBehavior" 
       contract="RivWorks.Web.Service.INegotiateService" /> 
     </service> 
    </services> 

    <extensions> 
     <bindingElementExtensions> 
     <add name="jsonpMessageEncoding" type="RivWorks.Web.Service.JSONPBindingExtension, RivWorks.Web.Service, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
     </bindingElementExtensions> 
    </extensions> 

    <bindings> 
     <customBinding> 
     <binding name="jsonpBinding" > 
      <jsonpMessageEncoding /> 
      <httpTransport manualAddressing="true"/> 
     </binding> 
     </customBinding> 
    </bindings>  
    </system.serviceModel> 
</configuration> 

Вот код:

namespace RivWorks.Web.Service 
{ 
    //----------------------------------------------------------------------------------------------------------// 
    // Data class                        // 
    //----------------------------------------------------------------------------------------------------------// 
    [DataContract(Name = "NegotiateSetup", Namespace = "http://rivworks.com/DataContracts/2009/01/15")] 
    public class NegotiateSetup : INegotiationInitialize 
    { 
     #region Declarations 
     ... 
     #endregion 


     #region INegotiationInitialize Members 
     ... 
     #endregion 
    } 

    //----------------------------------------------------------------------------------------------------------// 
    // Service Implementation                     // 
    //----------------------------------------------------------------------------------------------------------// 
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
    public class NegotiateService : INegotiateService 
    { 
     public NegotiateService() { } 

     public INegotiationInitialize GetSetup(string method, string jsonInput) 
     { 
      ... 
      return resultSet; 
     } 
    } 
} 

Я после того, как несколько вещей здесь:

  1. Почему я могу НЕ ударил его из-за пределов моей локальной сети?
  2. Как я могу получить MEX работает правильно

Примечание: Я использую классы JSONP найти здесь: http://msdn.microsoft.com/en-us/library/cc716898.aspx

+0

Вы исключили правила брандмауэра? Например, если вы ставите статическую страницу на этом компьютере, вы можете связаться с ней за пределами брандмауэра? – itowlson

+0

Ответ, кажется, нет. Я ** должен ** быть в состоянии ударить http://demo.rivworks.com/login.aspx, но я не могу, и это тоже время. Это сервер RackSpace, так что в понедельник я буду вводить в них билет с билетами. –

+0

Привет Кит, он пахнет проблемой брандмауэра. Учитывая, что вы не можете попасть в конечную точку, все указывает на то, что он не имеет никакого отношения к самому WCF. Еще один простой тест - удалить простой текстовый файл HelloWorld или простой html-файл и посмотреть, можете ли вы это сделать. – bahree

ответ

0

Чтобы разрешить MEX, добавьте это в ваш service тег:

<endpoint address="mex" 
      binding="mexHttpBinding" 
      contract="IMetadataExchange" /> 

Внутри вашего behaviors тег, добавить:

<serviceBehaviors> 
    <behavior name="JsonpServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true"/> 
    </behavior> 
    </serviceBehaviors> 

О том, почему эта услуга недоступна извне, может ли это быть проблемой межсетевого экрана?

+0

Мы узнали, что наша хостинговая компания изменила IP-адрес для этого конкретного сайта «из-за конфликтов SSL» - несмотря на то, что он работал стабильно уже почти год. У нас был промежуточный сертификат, и нам пришлось переустановить наш дилерский сертификат. Один из скриптов командной строки для сопоставления заголовков хостов на порт 443 (SSL) не был запущен. Когда IIS, наконец, задействовал пул приложений, возникла ошибка. Rackspace изменил некоторые IP-адреса, но не переназначил сертификаты правильно. Таким образом, это оставляет меня с вызовом MEX, и этот ответ, похоже, справляется с этим сейчас. Благодаря! –

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

  • Нет связанных вопросов^_^