Это может быть связано с тем, что привязка конечной точки службы не использует протокол HTTP. - PullRequest
80 голосов
/ 03 мая 2011

У меня нормально работает служба WCF на моей локальной машине.Я поместил его на серверы и получил следующую ошибку:

Произошла ошибка при получении ответа HTTP на http://xx.xx.x.xx:8200/Services/WCFClient.svc. Это может быть связано с тем, что привязка конечной точки службы не используетсяпротокол HTTP.Это также может быть связано с тем, что сервер прерывает контекст HTTP-запроса (возможно, из-за закрытия службы).Более подробную информацию смотрите в журналах сервера.]

Я зашел на службу в URL-адресе, и она работает правильно.Все, что я делаю для функции - это возвращаю строку имени изображения, поэтому передаваемых данных не так уж много.Я проследил журнал, и он дает мне ту же информацию.Вот моя конфигурация клиента:

<binding name="basicHttpBinding_IWCFClient" closeTimeout="00:01:00"
         openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
         bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
         maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
         messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
         allowCookies="false">
    <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
                  maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
                  maxNameTableCharCount="2147483647" />
    <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
    </security>
</binding>
<endpoint name="basicHttpBinding_IWCFClient" 
    address="http://localhost:4295/Services/WCFClient.svc"
    binding="basicHttpBinding" 
    bindingConfiguration="basicHttpBinding_IWCFClient" 
    behaviorConfiguration="WCFGraphicManagementTool.Services.ClientBehavior"
    contract="WCFClient.IWCFClient" />

Вот моя конфигурация сервера:

<service behaviorConfiguration="WCFGraphicManagementTool.Services.WCFClientBehavior"
    name="WCFGraphicManagementTool.Services.WCFClient">
   <endpoint name="basicHttpBinding_IWCFClient"
       address="" 
       binding="basicHttpBinding" 
       contract="WCFGraphicManagementTool.Contracts.IWCFClient" />
   <endpoint 
       address="mex" 
       binding="mexHttpBinding" 
       contract="IMetadataExchange" />
</service>
<behavior name="WCFGraphicManagementTool.Services.WCFClientBehavior">
   <dataContractSerializer maxItemsInObjectGraph="2147483647" />
   <serviceThrottling maxConcurrentCalls="120" maxConcurrentSessions="120"
                      maxConcurrentInstances="120" />
   <serviceMetadata httpGetEnabled="true" />
   <serviceDebug includeExceptionDetailInFaults="true" />
</behavior>

Это будет настройка на сервере, так как он работает на моей локальной машине?

Ответы [ 21 ]

88 голосов
/ 23 января 2013

Я думаю, что есть проблема с сериализацией, вы можете найти точную ошибку, просто добавьте следующий код в конфигурацию службы в разделе <configuration>.

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

Я надеюсь, что это поможет найти вашу ошибку.

<system.diagnostics>
    <sources>
      <source name="System.ServiceModel.MessageLogging" switchValue="Warning, ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
      <source name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
      <source name="System.Runtime.Serialization" switchValue="Verbose,ActivityTracing">
        <listeners>
          <add name="ServiceModelTraceListener" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add initializeData="App_tracelog.svclog" type="System.Diagnostics.XmlWriterTraceListener, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="ServiceModelTraceListener" traceOutputOptions="Timestamp" />
    </sharedListeners>
  </system.diagnostics>
73 голосов
/ 11 августа 2012

У меня была такая проблема: «Это может быть связано с тем, что привязка конечной точки службы не использует протокол HTTP», и служба WCF отключалась (на компьютере разработчика)

Я понял: в моем случаепроблема была из-за Enums,

Я решил использовать это

    [DataContract]
    [Flags]
    public enum Fruits
    {
        [EnumMember]
        APPLE = 1,
        [EnumMember]
        BALL = 2,
        [EnumMember]
        ORANGE = 3 

    }

Я должен был украсить свои Enums с помощью DataContract, Flags и всех членов enum с атрибутами EnumMember.

Я решил это, посмотрев на msdn Reference :

17 голосов
/ 26 января 2012

У меня была такая же ошибка, и проблема была в сериализации. Мне удалось найти настоящую проблему с помощью Service Trace Viewer http://msdn.microsoft.com/en-us/library/ms732023.aspx и решить ее легко. Может быть, это кому-нибудь поможет.

13 голосов
/ 29 января 2015

В моем случае ошибка была сгенерирована, потому что у одного из моих сложных типов было свойство без метода set.

Сериализатор вызвал исключение из-за этого факта.Добавлены методы внутреннего набора, и все работало нормально.

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

Я достиг этого, добавив следующий разделна мой web.config:

<system.diagnostics>
  <sources>
    <source name="System.ServiceModel.MessageLogging" switchValue="Warning,ActivityTracing">
      <listeners>
        <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\log\Traces.svclog" />
        <add type="System.Diagnostics.DefaultTraceListener" name="Default" />
      </listeners>
    </source>
    <source propagateActivity="true" name="System.ServiceModel" switchValue="Verbose,ActivityTracing">
      <listeners>
        <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\log\Traces.svclog" />
        <add type="System.Diagnostics.DefaultTraceListener" name="Default" />
      </listeners>
    </source>
  </sources>
  <trace autoflush="true" />
</system.diagnostics>

После установки я запустил свой клиент, получил исключение и проверил файл 'Traces.svclog'.Оттуда мне нужно было только найти исключение.

8 голосов
/ 25 февраля 2013

Решение с DataContract, Flags for Enums выглядит немного некрасиво. В моем случае проблема была решена путем добавления что-то вроде "NotSet = 0" в enum:

public enum Fruits
{
  UNKNOWN = 0,
  APPLE = 1,
  BALL = 2,
  ORANGE = 3 
}
2 голосов
/ 18 октября 2018

Я столкнулся с той же проблемой и решил с помощью приведенного ниже кода.(если возникнет проблема с подключением TLS)

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

Вставьте эту строку перед открытием клиентского канала.

1 голос
/ 19 апреля 2013

Моя проблема заключалась в том, что типом возврата моего сервиса была строка.Но я вернул строку типа xml:

<reponse><state>1</state><message>Operation was successfull</message</response>

, поэтому возникла ошибка.

1 голос
/ 12 марта 2013

Я видел эту ошибку, вызванную круговой ссылкой в ​​графе объектов. Включение указателя на родительский объект дочернего объекта вызовет сериализацию в цикле и в конечном итоге превысит максимальный размер сообщения.

1 голос
/ 01 октября 2013

У меня была эта проблема, потому что я настроил мою службу WCF для возврата System.Data.DataTable.

На моей тестовой HTML-странице все работало нормально, но взорвалось, когда я поместил это в свое приложение Windows Form.

Мне пришлось зайти и изменить подпись Операционного контракта Сервиса с DataTable на DataSet и вернуть данные соответствующим образом.

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

1 голос
/ 02 октября 2013

Это может быть связано со многими причинами; ниже приведены некоторые из них:

  1. Если вы используете сложные объекты контракта данных (это означает, что пользовательский объект имеет больше дочерних пользовательских объектов), убедитесь, что все пользовательские объекты украшены атрибутами DataContract и DataMember
  2. Если ваши объекты контракта данных используют наследование, убедитесь, что все базовые классы имеют атрибуты DataContract и DataMember. Также необходимо, чтобы базовые классы указывали производные классы с помощью Атрибут [KnownType (typeof (BaseClassType))]] ( ознакомьтесь с дополнительной информацией по этому ).

  3. Убедитесь, что все свойства объекта контракта с данными имеют свойства get и set.

...