Служба WCF работает в режиме отладки, но не как служба Windows

У меня есть служба WCF, которая является собственной службой Windows. При отладке с помощью тестового клиента WCF служба работает отлично. Я использую Javascript с простыми запросами ajax, которые возвращают JSON. Хотя, когда я запускаю службу как службу Windows, запрос получает ошибку 400. Я предполагаю, что это может иметь какое-то отношение к моей конфигурации.

Любая помощь приветствуется.

Конфигурация тестового клиента WCF

<system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="MetadataExchangeHttpBinding_ISkyMobileService">
                <security mode="None" />
            </binding>
        </wsHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost:8523/HLT/Sky/SkyMobileService/mex"
            binding="wsHttpBinding" bindingConfiguration="MetadataExchangeHttpBinding_ISkyMobileService"
            contract="ISkyMobileService" name="MetadataExchangeHttpBinding_ISkyMobileService" />
    </client>
</system.serviceModel>

Служба Windows App.Config

  <system.serviceModel>
    <services>
      <service name="HLT.Sky.MobileDeviceServices.SkyMobileService" behaviorConfiguration="HeliosMobileServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8523/HLT/Sky/SkyMobileService" />
          </baseAddresses>
        </host>
        <endpoint address="" binding="webHttpBinding" contract="HLT.Sky.MobileDeviceServices.ISkyMobileService" bindingNamespace="http://HLT.Sky.MobileDeviceServices" />
        <endpoint address="mex" binding="mexHttpBinding" contract="HLT.Sky.MobileDeviceServices.ISkyMobileService" bindingNamespace="http://HLT.Sky.MobileDeviceServices" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="SkyMobileServiceBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

Реализация службы Windows

using System.ServiceProcess;
using System.ServiceModel;


namespace HLT.Sky.WindowsService1
{
    public partial class Service1 : ServiceBase
    {
        internal static ServiceHost myServiceHost = null;

        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            if (myServiceHost != null)
            {
                myServiceHost.Close();
            }
            myServiceHost = new ServiceHost(typeof(MobileDeviceServices.SkyMobileService));
            myServiceHost.Open();
        }

        protected override void OnStop()
        {
            if (myServiceHost != null)
            {
                myServiceHost.Close();
                myServiceHost = null;
            }
        }
    }
}

Интерфейс WCF

    #region GET
    // Return JSON Store for specified chartType
    [OperationContract]
    [WebGet(UriTemplate = "GetChartData?chartType={chartType}&serialNumber={serialNumber}&_dc={dc}&limit={limit}&callback={callback}", ResponseFormat = WebMessageFormat.Json)]
    string GetChartData(string dc, string limit, string callback, int chartType, string serialNumber);

    [OperationContract]
    [WebGet(ResponseFormat = WebMessageFormat.Json)]
    string GetHomePageData();
    #endregion

    #region POST
    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "VerifyPINData?pinData={pinData}", ResponseFormat = WebMessageFormat.Json)]
    bool VerifyPINData(string pinData);

    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "SubmitCNPData?cnpData={cnpData}&serialNumber={serialNumber}", ResponseFormat = WebMessageFormat.Json)]
    bool SubmitCNPData(int cnpData, string serialNumber);

    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "SendEmail?mailTo={mailTo}&subject={subject}&message={message}",ResponseFormat = WebMessageFormat.Json)]
    bool SendEmail(string mailTo, string subject, string message);

    #endregion

Program.cs

static void Main()
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] 
        { 
            new Service1() 
        };
        ServiceBase.Run(ServicesToRun);
    }

person fortune    schedule 07.12.2012    source источник
comment
Можете ли вы описать, как вы заставили свой wcf работать в службах Windows. вам нужно реализовать метод start в классе обслуживания Windows и включить там собственный wcf   -  person Dmitry    schedule 07.12.2012
comment
Попробуйте устранить неполадки с помощью Fidler.   -  person abatishchev    schedule 07.12.2012
comment
Также попробуйте разместить в IIS вместо собственной службы Windows.   -  person abatishchev    schedule 07.12.2012
comment
@abatishchev В связи с ситуацией мне нужно, чтобы WCF размещался самостоятельно как служба Windows.   -  person fortune    schedule 07.12.2012
comment
Таким образом, вы можете убедиться, что все в порядке с самим сервисом и проблемой, вызванной самостоятельным хостингом.   -  person abatishchev    schedule 07.12.2012
comment
Пожалуйста, разместите больше кода. Подписи классов и содержимое Program.cs.   -  person abatishchev    schedule 07.12.2012
comment
Включите, пожалуйста, полную реализацию класса обслуживания Windows, включая подпись (пространство имен, базовый класс и т. д.)   -  person abatishchev    schedule 07.12.2012
comment
@abatishchev последние правки в значительной степени завершают сервис. Единственная дополнительная вещь - это установщик проекта.   -  person fortune    schedule 07.12.2012
comment
Кстати, includeExceptionDetailInFaults="true" чрезвычайно полезен для устранения неполадок, особенно на первом этапе.   -  person abatishchev    schedule 07.12.2012
comment
И все же попробуйте Fidler для отладки вывода JSON. Также попробуйте разместить ту же конфигурацию на локальном/удаленном IIS, просто для проверки.   -  person abatishchev    schedule 07.12.2012
comment
@abatishchev Попробую настроить на IIS. Запрос GET к веб-службе не возвращает JSON для отладки.   -  person fortune    schedule 07.12.2012
comment
Вы уверены, что служба запускается успешно? Я подозреваю, что myServiceHost.Open() выбрасывает... например, если учетная запись службы не имеет разрешений на открытие порта. Стандартный пользователь не будет иметь это предоставлено по умолчанию.   -  person ErnieL    schedule 07.12.2012


Ответы (1)


Добавление поведения конечной точки и удаление конечной точки «mex» решили проблему. См. рабочий файл конфигурации ниже:

  <system.serviceModel>
    <client>
      <endpoint binding="webHttpBinding" bindingConfiguration="" contract="HLT.Sky.MobileDeviceServices.ISkyMobileService" />
    </client>
    <services>
      <service name="HLT.Sky.MobileDeviceServices.SkyMobileService" behaviorConfiguration="SkyMobileServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8523/HLT/Sky/SkyMobileService" />
          </baseAddresses>
        </host>
        <endpoint address="" binding="webHttpBinding" contract="HLT.Sky.MobileDeviceServices.ISkyMobileService" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="SkyMobileServiceBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
            <endpointBehaviors>
        <behavior>
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>
person fortune    schedule 07.12.2012
comment
Хорошо, что вы решили эту проблему, но вы говорите: Хотя, когда я запускаю службу как службу Windows, запрос получает ошибку 400. Я предполагаю. Вы не должны гадать, вы должны найти ошибку и исправить ее. Без конечной точки mex вам придется вернуться к WSDL, а это не всегда идеальный вариант. - person CodeCaster; 07.12.2012
comment
@CodeCaster Хороший вопрос. Я знаю, что это связано с моей конфигурацией сейчас. Я просто знаю, что когда я добавляю конечную точку mex, я получаю HTTP-статус 200, но данные не возвращаются. Когда я удаляю его, я получаю данные. Я не совсем уверен, почему это так. - person fortune; 07.12.2012