У меня есть отношения между сервером и клиентом, когда клиент вытаскивает ArrayList с сервера. Если я установил сервер для отправки пустой ArrayList, то я не получу эту ошибку. Поэтому проблема заключается в том, что мои данные слишком велики для подключения и что они закрываются, прежде чем все данные могут пройти.Подключенное соединение было закрыто: соединение было неожиданно закрыто. Слишком большие данные?
Я рассмотрел этот вопрос, и я добавил функции, предлагаемые этим вопросом/ответом: https://stackoverflow.com/a/285542/3036134 Многие решения предлагают одно и то же. ..
Я считаю, что я реализовал что-то неправильно (я думаю, что это, скорее всего, служба Поведение MaxItemsInObjectGraph, как я все еще получаю ту же ошибку, я, к сожалению, не могу понять, что случилось с ним, хотя Вот мой код:
ошибка я получаю:
CommunicationException was unhandled. The underlying connection was closed: The connection was closed unexpectedly.
Мои службы WCF Код:
[ServiceContract]
public interface IModelData
{
[OperationContract]
ArrayList GetData();
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, MaxItemsInObjectGraph = 2147483647)]
public class ModelDataClient
{
ChannelFactory<IModelData> HttpFactory;
IModelData HttpProxy;
public ModelDataClient()
{
HttpFactory = new ChannelFactory<IModelData>(
new BasicHttpBinding(),
new EndpointAddress("http://localhost:8000/ModelData"));
HttpProxy = HttpFactory.CreateChannel();
}
public ArrayList GetData()
{
return HttpProxy.GetData();
}
}
[ServiceBehavior(UseSynchronizationContext = false, InstanceContextMode = InstanceContextMode.Single, MaxItemsInObjectGraph = 2147483647)]
public class ModelDataServer : IModelData
{
public delegate ArrayList GetData();
public GetData _GetData { get; set; }
public ModelDataServer()
{
}
public ArrayList GetData()
{
return _GetData();
}
}
Мой стороне клиента Код:
public partial class MainForm : Form
{
private ModelDataClient Client;
public MainForm()
{
InitializeComponent();
Client = new ModelDataClient();
}
private void Refresh()
{
ArrayList dataList = Client.GetData();
// ********** ERROR POINTS TO LINE ABOVE!!!!!!!!!!!!!!!!!!!!
// do something with datalist
}
}
My Server Side Код:
public partial class ScraperForm : Form
{
ServiceHost Host;
ModelDataServer DataServer;
ArrayList Data;
public ScraperForm()
{
InitializeComponent();
#region Start Data Server
DataServer = new ModelDataServer();
DataServer._GetData = new ModelDataServer.GetData(this.GetData);
BasicHttpBinding bhttpb = new BasicHttpBinding();
bhttpb.MaxBufferSize = 2147483647;
bhttpb.MaxReceivedMessageSize = 2147483647;
bhttpb.ReaderQuotas.MaxDepth = 32;
bhttpb.ReaderQuotas.MaxStringContentLength = 8388608;
bhttpb.ReaderQuotas.MaxArrayLength = 16384;
bhttpb.ReaderQuotas.MaxBytesPerRead = 4096;
bhttpb.ReaderQuotas.MaxNameTableCharCount = 16384;
Host = new ServiceHost(DataServer, new Uri[]
{
new Uri("http://localhost:8000")
});
Host.AddServiceEndpoint(typeof(IModelData),
bhttpb,
"ModelData");
Host.Open();
Data = new ArrayList();
}
private void CloseSever()
{
Host.Close();
}
public void UpdateData() // Run on a timer
{
ArrayList Data = new ArrayList()
// Update Data
}
public ArrayList GetData() // This is called by server which is called by client
{
return Data; // no error if I return new ArrayList();
}
}
EDIT: ли проблема быть, вызвана не имея DataContract/DataMembers?
UPDATE Я перестроил свою новую реализацию с нуля с помощью этого учебника (и связанных с них): http://blogs.msdn.com/b/brunoterkaly/archive/2013/10/28/wcf-programming-how-to-write-a-client-app-that-connects-to-a-wcf-service.aspx (Для тех, кто заинтересован).
Вместо использования ArrayList (много распаковки) и типизированного списка (выводится как массив, если используется с WCF), вместо этого я решил передать свои данные, используя строку со следующим форматом: "~" для обозначения начала нового члена списка "," чтобы обозначить конец одного из типов данных в моем обычном. Таким образом, это может выглядеть как «~ NAME, 1.29,1,4,123.1 ~ NAME, 1.23,3,1,13.2» и т. Д. Я бы предложил, чтобы люди, которые хотят использовать списки, используют это вместо этого.
У меня возникла новая проблема с моей новой реализацией, вероятно, такая же/подобная проблема. Пожалуйста, см. Мой новый вопрос: Object reference not set to an instance of an object - WCF Service and Delegates (WCF Hosted before Delegate is instantiated)
Спасибо за вашу помощь.
Я считаю, что сервер * и клиент * имеют ограничения. –
Yuck! Почему 'ArrayList'? Вам действительно нужна коллекция произвольных предметов? –
@ ta.speot.is да, я считаю, что приведенный выше код устанавливает пределы. Как вы думаете, я отправляю слишком много данных для того, что я здесь установил? Я считаю, что они установлены на максимум – janderson