Это может быть связано с привязкой конечной точки службы, не использующей протокол HTTP

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

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

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

<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>

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

20 ответов


Я думаю, что есть проблема сериализации, вы можете найти точную ошибку, просто нужно добавить ниже код в Service config в .

после обновления конфигурации "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>

У меня была эта проблема "это может быть связано с привязкой конечной точки службы, не использующей протокол HTTP", и служба WCF завершит работу (на машине разработки)

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

Я решил с помощью этого

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

    }

Мне пришлось украсить свои перечисления DataContract, флагами и всеми атрибутами enum члена EnumMember.

Я решил это, посмотрев на это в MSDN Ссылка:


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


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

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

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

Я достиг этого, добавив следующий раздел в свою сеть.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>

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


решение с DataContract, флаги для перечислений выглядит немного уродливо. В моем случае проблема была решена путем добавления чего-то вроде "NotSet = 0" в перечисление:

public enum Fruits
{
  UNKNOWN = 0,
  APPLE = 1,
  BALL = 2,
  ORANGE = 3 
}

Я понял, проблема. Это закончилось тем, что путь к моему файлу конфигурации был неправильным. Ошибки для WCF настолько полезны иногда.


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


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

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

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

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


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

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

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


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

<dataContractSerializer maxItemsInObjectGraph="2147483646"/>

подробнее об этой проблеме см. Также в разделе: существующее соединение было принудительно закрыто удаленным хостом-WCF

моя проблема заключалась в том, что мои объекты передачи данных были слишком сложными. Начать свойства спростая как public long Id { get; set; } и как только вы получите эту работу, чем начать добавлять дополнительные вещи по мере необходимости.


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

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

таким образом была выдана ошибка.


эта ошибка может быть из-за несоответствия договору. Рассмотрим три слоя приложения ниже...

UI Layer
|
Слой Процесса
|
Уровень Доступа К Данным
- >Контракт между Process и UI layer имеет то же перечисление с missing (Onhold = 3). Перечисление: Start = 1, Stop = 2. - >Контракт между доступом к данным и уровнем процесса имеет перечисление Enum: Start = 1,Stop = 2, Onhold = 3.

в этом случае мы получим ту же ошибку в process layer ответ.

та же ошибка возникает в другом несоответствии контракта в многослойном приложении.


Это может не иметь отношения к вашей конкретной проблеме, но сообщение об ошибке, которое вы упомянули, имеет много причин, одна из которых использует тип возврата для [OperationContract], который является абстрактным, интерфейсом или не известен клиентскому коду WCF.

Проверьте сообщение (и решение) ниже

https://stackoverflow.com/a/5310951/74138


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

 <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true">
        <listeners>
          <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="c:\logs\TracesServ_ce.svclog" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

затем вы идете c:\logs\TracesServ_ce.svclog откройте его с помощью microsoft средство просмотра трассировки службы. И посмотрите, в чем проблема на самом деле.


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

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

надеюсь, это поможет кому-то еще!
Привет,


в моем случае

мой сервис имеет функцию download Files

и эта ошибка отображается только при попытке скачать Big Files

Я нашел ответ увеличить maxRequestLength до необходимого значения в web.config

Я знаю, что это странно, но проблема решена

если вы не делаете никаких операций загрузки или загрузки, возможно, этот ответ не поможет вам


также была эта проблема, и это было связано с забыванием украсить мою модель атрибутами DataContract и DataMember


для меня решения этой ошибки очень странные. Это был вопрос адреса порта EndpointAddress. В Visual studio адрес порта вашего файла (например, Service1.svc) и адрес порта вашего проекта wcf должен быть таким же, который вы даете в EndpointAddress. Позвольте мне подробно описать вам это решение.

есть два шага, чтобы проверить адреса портов.

  1. в вашем проекте WCF щелкните правой кнопкой мыши файл службы (например, файл service1.svc) - > чем выбрать просмотр в браузере теперь в вашем браузере у вас есть url, как http://localhost:61122/Service1.svc теперь запишите свой адрес порта как 61122

  2. Righ нажмите ваш проект wcf - > чем выбрать свойства -> перейти к Интернет -> теперь раздел сервера -> выберите Используйте Сервер Разработки Visual Studio -> выбрать Определенный Порт и дайте адрес порта, который мы ранее нашли в нашем Сервисе1.служба svc. Это (61122).

раньше у меня был другой адрес порта. После правильного указания адреса порта, который я дал в EndpointAddress моя проблема.

Я надеюсь, что это может быть решена ваша проблема.