Silverlight 3: Как получить большую (около 50 МБ) строку XML с веб-страницы ASP.NET? - PullRequest
1 голос
/ 25 февраля 2010

Каков предпочтительный способ получения большой (приблизительно 50 МБ) XML-строки с веб-страницы ASP.NET?

Поместить строку XML в файл и загрузить файл не вариант. (Это должно быть моим последним средством, если ничего не работает)

У меня есть следующий метод на сервере ASP.NET, который предоставляется через службу WCF для клиента Silverlight.

[OperationContract]
public string GetXmlDataByRegion(string region)
{
   //Fetch Xml string from database based on given region name     
}

К сожалению, эти строки xml имеют размер примерно от 50 до 100 МБ. Клиент Silverlight должен извлечь эти большие строки и сохранить их в файле на клиентском компьютере по пути, выбранному пользователем с помощью saveFileDialog.

Меня беспокоит то, что служба WCF не допускает такие большие сообщения. Как я могу решить эту проблему? Есть идеи?

Ответы [ 3 ]

2 голосов
/ 25 февраля 2010

Вы можете использовать универсальный обработчик ASHX для этого и сделать простой HTTP-запрос с WebClient для него. Хотя я не уверен, что это предпочтительный способ , он будет работать как решение.

2 голосов
/ 25 февраля 2010

Вы можете сделать это, вам просто нужно увеличить MaxReceivedMessageSize, maxBufferSize, maxBufferPoolSize и, возможно, другие - продолжайте увеличивать их, пока не добьетесь успеха.

Это позволит отправлять и получать большие файлы, но вам нужно открыть оба конца, чтобы этого ожидать.

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

Например:

        <binding name="ObjectServicePortBinding" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:30:00" sendTimeout="00:01:00" maxBufferSize="1048576" maxBufferPoolSize="5242880" maxReceivedMessageSize="52428800" transferMode="Buffered" useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>

Edit: Потоковая передача данных может быть более подходящим подходом:

  • Потоковый поток: входящие и исходящие сообщения передаются в потоковом режиме
  • StreamedRequest: сообщения, отправленные с клиента на сервер, передаются в потоковом режиме
  • StreamedRespone: только сообщения, возвращенные с сервера клиенту, передаются в потоковом режиме
  • Буферизация: по умолчанию буферизируются все данные и отправляются в один пакет.

http://msdn.microsoft.com/en-us/library/ms731913.aspx

  • Буферизованные передачи удерживают все сообщение в буфере памяти до завершения передачи. Буферизованное сообщение должно быть полностью доставлено, прежде чем получатель сможет его прочитать.

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

1 голос
/ 25 февраля 2010

Рассматривали ли вы вместо этого отправку сжатого байтового массива?

XML-файл объемом 50 МБ может уменьшиться до 5 МБ (при условии сжатия 90%) - значительное сокращение трафика и времени передачи (исключая время сжатия / распаковки на обоих концах)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...