У меня на моем локальном компьютере работает служба 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>
Будет ли это настройка на сервере, поскольку она работает на моем локальном компьютере?
источник
Ответы:
Я думаю, что есть проблема с сериализацией, вы можете найти точную ошибку, просто добавив код ниже в конфигурацию службы в
<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>
источник
System.Runtime.Serialization
в трассировке мне не хватало источника.<system.diagnostics>
раздел в конец файла, чуть выше</configuration>
. Если вы вставите его вверху, вы можете получить ошибку типа контента при запуске приложения.У меня была эта проблема: «Это могло быть из-за привязки конечной точки службы, не использующей протокол HTTP», и служба WCF закрывалась (на машине разработки)
Я понял: в моем случае проблема была из-за Enums,
Я решил использовать это
[DataContract] [Flags] public enum Fruits { [EnumMember] APPLE = 1, [EnumMember] BALL = 2, [EnumMember] ORANGE = 3 }
Мне пришлось украсить свои перечисления DataContract, Flags и всех членов перечисления атрибутами EnumMember.
Я решил это, посмотрев на эту ссылку msdn :
источник
У меня была такая же ошибка, и проблема заключалась в сериализации. Мне удалось найти настоящую проблему с помощью Service Trace Viewer http://msdn.microsoft.com/en-us/library/ms732023.aspx и легко решил. Может это кому-то поможет.
источник
В моем случае ошибка возникла из-за того, что один из моих сложных типов имел свойство без установленного метода.
Из-за этого сериализатор выдал исключение. Добавлены внутренние методы набора, и все работает нормально.
Лучший способ выяснить, почему это происходит (на мой взгляд), - включить ведение журнала трассировки.
Я добился этого, добавив следующий раздел в свой
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. Оттуда мне нужно было только найти исключение.
источник
Решение с DataContract, Flags for Enums выглядит немного некрасиво. В моем случае проблема была решена добавлением в enum чего-то вроде NotSet = 0:
public enum Fruits { UNKNOWN = 0, APPLE = 1, BALL = 2, ORANGE = 3 }
источник
Я столкнулся с той же проблемой и решил с помощью кода ниже. (если есть проблема с подключением TLS)
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
Пожалуйста, вставьте эту строку перед открытием клиентского канала.
источник
Я разобрался в проблеме. В итоге путь к моему файлу конфигурации был неправильным. Ошибки WCF иногда бывают такими полезными.
источник
Чтобы исправить это, нам пришлось изменить AppPool Identity на учетную запись администратора .
источник
Я видел эту ошибку, вызванную циклической ссылкой в графе объекта. Включение указателя на родительский объект из дочернего объекта вызовет цикл сериализатора и в конечном итоге превысит максимальный размер сообщения.
источник
Эта ошибка может быть из-за несоответствия контракта. Рассмотрим трехуровневое приложение ниже ...
Слой пользовательского интерфейса
|
Уровень процесса
|
Уровень доступа к данным
-> Контракт между процессом и уровнем пользовательского интерфейса имеет такое же перечисление с отсутствующим (Onhold = 3). Enum: Start = 1, Stop = 2. -> Контракт между уровнем доступа к данным и процессом имеет перечисление Enum: Start = 1, Stop = 2, Onhold = 3.
В этом случае мы получим ту же ошибку в ответе уровня процесса.
Та же ошибка возникает при несоответствии другого контракта в многоуровневом приложении.
источник
У меня возникла эта проблема, потому что я настроил свою службу WCF для возврата System.Data.DataTable.
Он отлично работал на моей тестовой HTML-странице, но взорвался, когда я поместил это в свое приложение Windows Form.
Мне пришлось зайти и изменить подпись рабочего контракта службы с DataTable на DataSet и вернуть данные соответственно.
Если у вас возникла эта проблема, вы можете добавить к своей Службе дополнительный Операционный контракт, чтобы не беспокоиться о взломе кода, который полагается на существующие Службы.
источник
Это могло произойти по многим причинам; ниже приведены некоторые из них:
Если ваши объекты контракта данных используют наследование, убедитесь, что все базовые классы имеют атрибуты DataContract и DataMember. Кроме того, вам необходимо, чтобы базовые классы указывали производные классы с помощью атрибута [KnownType (typeof (BaseClassType))] ( дополнительную информацию можно найти здесь ).
Убедитесь, что у всех ваших свойств объекта контракта данных есть свойства get и set.
источник
Моя проблема заключалась в том, что между клиентом и сервером передавалось слишком много элементов. Мне пришлось изменить эти настройки в поведении с обеих сторон.
<dataContractSerializer maxItemsInObjectGraph="2147483646"/>
источник
Это может не иметь отношения к вашей конкретной проблеме, но упомянутое вами сообщение об ошибке имеет много причин, одна из которых использует тип возвращаемого значения для [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. И посмотрите, в чем проблема на самом деле.
источник
Для получения дополнительной информации об этой проблеме см. Также: Существующее соединение было принудительно закрыто удаленным узлом - WCF
Моя проблема заключалась в том, что мои объекты передачи данных были слишком сложными. Начните с простых свойств, таких как
public long Id { get; set; }
и, как только вы это получите, начинайте добавлять дополнительные вещи по мере необходимости.источник
Я боролся с этим в течение нескольких дней и пробовал каждый ответ из этого сообщения и многих других и поделился своим решением, потому что симптомы были такими же, но проблема была другой.
Проблема заключалась в том, что пул приложений был настроен с ограничением памяти, и он просто перерабатывался через переменный период времени.
Надеюсь, это поможет кому-то другому!
Приветствия,
источник
Моя проблема заключалась в том, что возвращаемый тип моей службы был строкой. Но я вернул строку типа xml:
<reponse><state>1</state><message>Operation was successfull</message</response>
поэтому возникла ошибка.
источник
в моем случае
моя служба имеет функцию
download Files
и эта ошибка появляется только при попытке загрузить
Big Files
поэтому я нашел этот ответ на увеличение
maxRequestLength
до необходимого значения вweb.config
Я знаю, что это странно, но проблема решена
если вы не выполняете никаких операций по загрузке или загрузке, возможно, этот ответ вам не поможет
источник
Для меня очень странны решения этой ошибки. Это была проблема адреса порта EndpointAddress . В Visual Studio адрес порта вашего файла (например, Service1.svc) и адрес порта вашего проекта wcf должны совпадать с тем, что вы указываете в EndpointAddress . Позвольте мне подробно описать вам это решение.
Есть два шага для проверки адресов портов.
В своем проекте WCF щелкните правой кнопкой мыши файл службы (например, Service1.svc) ->, затем выберите Просмотреть в браузере сейчас в своем браузере у вас есть URL-адрес, например http: // localhost: 61122 / Service1.svc, поэтому теперь запишите адрес вашего порта как 61122
Щелкните правой кнопкой мыши свой проект wcf -> затем выберите « Свойства» -> перейдите на вкладку «Интернет» -> «Теперь в разделе« Серверы » -> выберите« Использовать сервер разработки Visual Studio » -> выберите« Определенный порт » и укажите адрес порта, который мы ранее нашли в нашей службе 1. svc сервис. То есть (61122) .
Раньше у меня другой адрес порта. После правильного указания адреса порта, который я указал в EndpointAddress , моя проблема была решена.
Я надеюсь, что это может решить вашу проблему.
источник
Также была эта проблема, и это было связано с тем, что я забыл украсить мою модель атрибутами DataContract и DataMember
источник
Если у вас есть база данных (работает в визуальной студии), убедитесь, что в таблицах нет внешних ключей, у меня были внешние ключи, и это дало мне эту ошибку, и когда я их удалил, все прошло гладко
источник