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


87

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

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


Я решил свою проблему, как объяснял здесь: stackoverflow.com/questions/5537794/…
Ади,

Похоже, ты продвинулся дальше меня. Возможно, вы дадите мне указание, что делать дальше. stackoverflow.com/questions/16628382/…
Нильс Бринч

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

Ответы:


100

Я думаю, что есть проблема с сериализацией, вы можете найти точную ошибку, просто добавив код ниже в конфигурацию службы в <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>

4
На самом деле это спасло мне день. Это действительно была проблема сериализации, и System.Runtime.Serializationв трассировке мне не хватало источника.
julealgon

Приятно ... не знал об этом :)
Ноктис

эпично! который записывает ошибку, которая не была доступна ни в одном исключении, в файл
App_tracelog.svclog

Гениально! Спасибо
SyntaxError

1
Обязательно вставьте <system.diagnostics>раздел в конец файла, чуть выше </configuration>. Если вы вставите его вверху, вы можете получить ошибку типа контента при запуске приложения.
Таваб Вакил

75

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

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

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

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

    }

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

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


1
Спасибо. Это было именно то, что я должен был сделать.
Мэтью Коул,

1
Спасибо, вы только что сэкономили мне кучу времени
nixon

4
Большое спасибо .. сэкономил мне много времени
amesh

В связи с этим - если у вас есть тип перечисления в контракте, который не является типом DataMember, вы получите эту ошибку. Я просто добавил свойство, которое было DataMember, и присвоил ему тип перечисления, отличный от DataContract.
paz

Разве перечисления не должны начинаться с индекса 0? Для меня это определенно было проблемой в прошлом. Итак, в приведенном выше примере ЯБЛОКО = 0, а не 1.
Сенатор

17

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


14

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

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

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

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


autoflush = true был ключевым
Джереми Смит

9

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

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

Ах да, извините, только что прокомментировал дальнейший ответ. Я тоже видел такое поведение.
Сенатор

объяснение: у меня была такая же проблема. Ответ @Rikin привел меня к следующему: «Сообщение InnerException было« Значение Enum '0' недопустимо для типа ... »из [ social.msdn.microsoft.com/Forums/vstudio/en-US/… Я получил jem: «Проблема здесь в том, что вы не инициализируете ..Response, и он принимает значение по умолчанию (и недействительное), равное '0' ... поэтому он не может быть сериализован».
AJ AJ

3

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

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

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


1

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


1

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


Мне это пригодилось. Я не сделал в точности то, что предлагал Сарджан, а просто дал права чтения / записи в папке приложения (в wwwroot ...) удостоверению пула приложений, которое я использовал.
Франческо Б.

1

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


1

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

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

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

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


Ваш ответ, похоже, не имеет ничего общего с вопросом. Также обратите внимание, что ОП уже решил свою проблему - путь к файлу конфигурации был неправильным .
Саймон MᶜKenzie

1

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

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

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

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


1

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

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

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


1

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

<dataContractSerializer maxItemsInObjectGraph="2147483646"/>

Я использовал то же решение. Но мне пришлось использовать Service Trace Viewer, как было предложено @ 100r, чтобы убедиться, что это ошибка.
Björn

1

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

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

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


1

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

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


1

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

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


1

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

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

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


1

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

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

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


1

в моем случае

моя служба имеет функцию download Files

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

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

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

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


1

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

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

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

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

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

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


0

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


0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.