Це може бути пов'язано з прив'язкою кінцевої точки служби, яка не використовує протокол 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/…
Нільс Брінч

Будь-який шанс, що ви приймете будь-яку з відповідей, оскільки я сумніваюся, що ви все ще чекаєте на її отримання? :)
Noctis

Відповіді:


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 вимкнеться (на машині розробки)

Я зрозумів: у моєму випадку проблема полягала в тому, що Енумс,

Я вирішив, використовуючи це

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

    }

Мені довелося прикрасити мої Enums DataContract, Flags та всіх членів enum атрибутами EnumMember.

Я вирішив це, переглянувши це посилання msdn :


1
Дякую. Це було саме те, що мені теж довелося зробити.
Метью Коул,

1
Дякую, ти щойно заощадив мені купу часу
nixon,

4
Велике спасибі .. значно заощадив мій час
amesh

Пов’язане з цим - якщо у вас є тип переліку в контракті, який не є типом DataMember, ви отримаєте цю помилку. Я просто додав властивість, яка була DataMember, і надав їй тип переліку, що не є DataContract.
paz,

Хіба це також не так, що перелічення потрібно починати з індексу 0? Для мене це, звичайно, було проблемою в минулому. Отже, у наведеному вище прикладі APPLE = 0, а не 1.
Сенатор

17

У мене була та сама помилка, і проблема полягала в серіалізації. Мені вдалося знайти справжню проблему за допомогою засобу перегляду трасування служби 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 виглядає трохи потворно. У моєму випадку проблему вирішили, додавши щось на зразок "NotSet = 0" до переліку:

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

Ах так, вибачте, просто прокоментував подальшу відповідь. Я теж бачив таку поведінку.
Сенатор,

пояснення: у мене була та сама проблема. Відповідь @ Rikin призвела мене до: "Повідомлення InnerException було" Значення переліку "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

Це мені було корисно. Я зробив не зовсім те, що запропонував Сарджан, а просто надав права на читання / запис у папці програми (під wwwroot ...) ідентифікатору пулу програм, яким я користувався.
Франческо Б.

1

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


1

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

Шар інтерфейсу
|
Шар обробки
|
Шар доступу до даних
-> Контракт між процесом та шаром інтерфейсу користувача має однаковий перелік із відсутнім (Onhold = 3). Enum: Start = 1, Stop = 2. -> Контракт між доступом до даних та процесом має перелік Enum: Start = 1, Stop = 2, Onhold = 3.

У цьому випадку ми отримаємо ту саму помилку у відповіді рівня процесу.

Така сама помилка виникає в інших невідповідностях контрактів у багатошаровому додатку.


Схоже, ваша відповідь не має нічого спільного із запитанням. Також зауважте, що OP вже вирішив його проблему - шлях до конфігураційного файлу був неправильним .
Simon 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"/>

Я використовував те саме рішення. Але мені довелося скористатися засобом перегляду службових слідів, як запропонував @ 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, тому тепер запишіть адресу вашого порту як a 61122

  2. Клацніть правою кнопкою миші ваш проект wcf -> а потім виберіть Властивості -> перейдіть на вкладку Веб -> Тепер у розділі Сервери -> виберіть Використовувати сервер розробки Visual Studio -> виберіть Конкретний порт і вкажіть адресу порту, яку ми раніше знаходили в нашій Службі1. сервіс svc. Тобто (61122) .

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

Сподіваюся, це може вирішити вашу проблему.


0

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


0

Якщо у вас є база даних (працює в Visual Studio), переконайтеся, що в таблицях немає зовнішніх ключів, у мене були зовнішні ключі, і це дало мені цю помилку, і коли я їх видалив, вона працювала безперебійно

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.