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

У меня есть служба 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>

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


person Matt Schubert    schedule 03.05.2011    source источник
comment
Я решил свою проблему, как я объяснил здесь: stackoverflow.com/questions/5537794/   -  person Adi    schedule 07.12.2011
comment
Похоже, ты продвинулся дальше меня. Возможно, вы подскажете, что делать дальше. stackoverflow .com / questions / 16628382 /   -  person Niels Brinch    schedule 25.05.2013
comment
Есть ли шанс, что вы примете любой из ответов, поскольку я сомневаюсь, что вы все еще ждете его? :)   -  person Noctis    schedule 19.08.2014


Ответы (22)


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

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

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

<configuration>
...
...

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

  </configuration>

Обновление: если вы не можете найти обновленный "App_tracelog.svclog" файл, найдите "<some GUID>App_tracelog.svclog", например, "a39e3026-5dd8-4d39-842a-04d486615eedApp_tracelog.svclog"

person Rikin Patel    schedule 23.01.2013
comment
На самом деле это спасло мне день. На самом деле это была проблема сериализации, и в моей трассировке отсутствовал System.Runtime.Serialization источник. - person julealgon; 29.10.2013
comment
Приятно ... не знал об этом :) - person Noctis; 19.08.2014
comment
эпично! который записывает ошибку, которая не была доступна ни в одном исключении, в файл App_tracelog.svclog - person fubo; 27.10.2014
comment
Блестяще! Спасибо - person SyntaxError; 05.01.2017
comment
Так полезно! Добавление этого значительно помогает диагностировать проблемы со связью! - person Pheonyx; 26.06.2018
comment
Замечательное решение! Спас день! - person Marlon Assef; 03.07.2018
comment
Не забудьте вставить раздел <system.diagnostics> в конец файла, чуть выше </configuration>. Если вы вставите его вверху, вы можете получить ошибку типа контента при запуске приложения. - person Tawab Wakil; 20.05.2019

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

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

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

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

    }

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

Я решил это после просмотра этой справки по msdn:

person Rajesh    schedule 11.08.2012
comment
Спасибо. Это было именно то, что я должен был сделать. - person Matthew Cole; 30.08.2012
comment
Спасибо, ты только что сэкономил мне кучу времени - person nixon; 11.12.2012
comment
Большое спасибо .. сэкономил мое время - person amesh; 06.02.2013
comment
В связи с этим - если у вас есть тип перечисления в контракте, который не является типом DataMember, вы получите эту ошибку. Я просто добавил свойство, которое было DataMember, и присвоил ему тип перечисления, отличный от DataContract. - person paz; 05.10.2013
comment
Разве перечисления не должны начинаться с индекса 0? Для меня это определенно было проблемой в прошлом. Итак, в приведенном выше примере ЯБЛОКО = 0, а не 1. - person The Senator; 29.10.2014
comment
Получена эта ошибка из-за наличия свойства IEnumerable<T>, украшенного атрибутом [DataMember]. Забавно то, что код работал локально, но не при развертывании на нашем производственном сервере. - person Cᴏʀʏ; 18.11.2014
comment
В моем случае я имел в виду составные типы внутри составного типа, но не объявил базовые типы, то есть отгрузку ›› ShipLines ›› LineType (LineType Class / Type not defined). Не знал, почему VS не жаловался. - person Anthony Horne; 20.01.2016
comment
Просто случайно это была моя та же проблема (Enum не сериализуется). Я действительно должен согласиться с тем, что Рикин Патель выше о том, как найти проблему, но я благодарен за ваш пост, поскольку он включает для меня лампочку. - person JStevens; 11.02.2020

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

person 100r    schedule 26.01.2012

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

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

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

Я добился этого, добавив в свой 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. Оттуда мне нужно было только найти исключение.

person Stuart    schedule 29.01.2015
comment
autoflush = true был ключевым - person Jeremy Smith; 11.10.2018

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

public enum Fruits
{
  UNKNOWN = 0,
  APPLE = 1,
  BALL = 2,
  ORANGE = 3 
}
person b1n0m    schedule 25.02.2013
comment
Ах да, извините, только что прокомментировал дальнейший ответ. Я тоже видел такое поведение. - person The Senator; 29.10.2014
comment
объяснение: у меня была такая же проблема. Ответ @Rikin привел меня к следующему: сообщение InnerException было "Значение перечисления" 0 "недопустимо для типа ... from [social.msdn.microsoft.com/Forums/vstudio/en -US / У меня есть проблема: проблема в том, что вы не инициализируете ..Response, и он принимает значение по умолчанию (и недействительное), равное '0' ... поэтому его нельзя сериализовать. - person AJ AJ; 30.05.2018

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

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

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

person Abdul Azeez    schedule 17.10.2018

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

person Mark Challen    schedule 12.03.2013

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

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

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

person Gonza Oviedo    schedule 10.09.2015

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

person Matt Schubert    schedule 16.05.2011

Чтобы исправить это, нам пришлось изменить идентификатор AppPool на учетную запись администратора..

person SarjanWebDev    schedule 17.01.2013
comment
Мне это пригодилось. Я не сделал в точности то, что предлагал Сарджан, а просто дал права чтения / записи в папке приложения (в wwwroot ...) удостоверению пула приложений, которое я использовал. - person Francesco B.; 28.05.2020

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

Уровень пользовательского интерфейса
|
Уровень процесса
|
Уровень доступа к данным
-> Контракт между процессом и уровнем пользовательского интерфейса имеет такое же перечисление с отсутствующим (Onhold = 3). Enum: Start = 1, Stop = 2. -> Контракт между уровнем доступа к данным и процессом имеет перечисление Enum: Start = 1, Stop = 2, Onhold = 3.

В этом случае мы получим ту же ошибку в ответе уровня процесса.

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

person Abhijit Kumar    schedule 09.05.2013
comment
Ваш ответ не имеет ничего общего с вопросом. Также обратите внимание, что OP уже решил свою проблему - путь к файлу конфигурации был неправильным. - person Simon MᶜKenzie; 09.05.2013

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

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

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

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

person jp2code    schedule 30.09.2013

Это могло произойти по многим причинам; ниже приведены некоторые из них:

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

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

person Sujeewa    schedule 02.10.2013

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

<dataContractSerializer maxItemsInObjectGraph="2147483646"/>
person Rob Sedgwick    schedule 09.12.2014
comment
Я использовал то же решение. Но мне пришлось использовать Service Trace Viewer, как было предложено @ 100r, чтобы убедиться, что это ошибка. - person Björn; 05.07.2017

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

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

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

person modeeb    schedule 08.03.2015

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

 <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. И посмотрите, в чем проблема на самом деле.

person Lomithrani    schedule 06.07.2015

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

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

person Serj Sagan    schedule 10.09.2015

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

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

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

person joettriscik    schedule 19.04.2013

в моем случае

у моей службы есть функция download Files

и эта ошибка появляется только при попытке загрузить Big Files

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

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

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

person Basheer AL-MOMANI    schedule 23.06.2016

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

Есть два шага для проверки адресов портов.

  1. В своем проекте WCF щелкните правой кнопкой мыши файл службы (например, Service1.svc) ->, затем выберите Просмотреть в браузере. Теперь в вашем браузере URL-адрес выглядит как http://localhost:61122/Service1.svc, поэтому запишите адрес вашего порта как 61122.

  2. Щелкните правой кнопкой мыши свой проект wcf -> затем выберите Свойства -> перейдите на вкладку Интернет -> Теперь в разделе Серверы -> выберите Используйте Visual Studio Development Server -> выберите Определенный порт и укажите адрес порта, который мы ранее нашли в нашей службе Service1.svc. Это (61122).

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

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

person Dilip0165    schedule 10.10.2016

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

person Ian Rathbone    schedule 14.09.2016

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

person Laaiqah Seedat    schedule 22.09.2020