C # WCF работает внутри корпоративного брандмауэра, но не снаружи - PullRequest
1 голос
/ 16 января 2010

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

Вот 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

1 Ответ

0 голосов
/ 16 января 2010

Чтобы включить ваш MEX, добавьте это внутри тега service:

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

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

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

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

...