Ошибка WCF — соединение закрыто удаленным хостом

#wcf

#wcf

Вопрос:

У меня эта очень странная ошибка…

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

 namespace WebApi.DataContracts
{
    [DataContract]
    public class User
    {
        [DataMember]
        public int Id
        {
            get;
            set;
        }
        [DataMember]
        public string Username
        {
            set;
            get;
        }
    ...
        [DataMember]
        public DateTime Birth
        {
            get;
            set;
        }
        [DataMember]
        public bool Newsletter
        {
            get;
            set;
        }
  

и т.д…

Я создал метод API, который возвращает этот объект в виде данных

 namespace WebApi
{
    public class SoapApi : IApi
    {
        public DataContracts.User UserRegister()
        {
            DataContracts.User u = new DataContracts.User();
            return u;
    }
}
  

Когда я пытаюсь вызвать это с клиента, я получаю эту ошибку:

 [SocketException (0x2746): An existing connection was forcibly closed by the remote host]
   System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)  6132200
   System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)  134

[IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.]
   System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)  300
   System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size)  26
   System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead)  265

[WebException: The underlying connection was closed: An unexpected error occurred on a receive.]
   System.Net.HttpWebRequest.GetResponse()  6038435
   ClassLib.HandlerFactory.AjaxProxy.ProcessRequest(HttpContext context) in ClassLibHandlerFactory.cs:75
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()  100
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Booleanamp; completedSynchronously)  75
  

Мне кажется, что эта строка

 System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)  6132200
  

указывает, что пытаются отправить слишком много байтов — почему это?

ОБНОВЛЕНИЕ: Привязка в моем КЛИЕНТЕ web.config выглядит следующим образом:

 <bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_Api" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
      maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
      useDefaultWebProxy="true">
    <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>
    <binding name="ApiBinding" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
      maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
      useDefaultWebProxy="true">
    <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>
  </basicHttpBinding>
</bindings>
  

Привязки web.config СЕРВЕРА являются:

 <bindings>
  <basicHttpBinding>
    <binding name="ApiBinding" />
  </basicHttpBinding>
  <webHttpBinding>
    <binding name="ApiBinding" />
  </webHttpBinding>
</bindings>
  

/ Carsten

Комментарии:

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

2. Теперь я добавил привязку из web.config в нижней части текста вопроса. Спасибо

3. Есть идеи? Вместо этого я попытался вернуть простые типы — например, int — и это работает нормально.

4. Почему привязка содержит повторяющиеся записи?

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

Ответ №1:

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

Итак:

  • Обновите информацию с подробностями на стороне клиента

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

Комментарии:

1. На самом деле web.config, который я впервые опубликовал, был конфигурацией клиента. Теперь я также обновил привязки сервера web.config, которые содержат гораздо меньше информации. Я пока не очень разбираюсь в этом… Должны ли они быть точными совпадениями?