Как легко сжать данные, которые я публикую в форму, используя C # и IIS? - PullRequest
2 голосов
/ 09 декабря 2008

Мне приходится взаимодействовать со слегка архаичной системой, которая не использует веб-сервисы. Чтобы отправить данные в эту систему, мне нужно опубликовать XML-документ в форме на веб-сайте другой системы. Этот документ XML может стать очень большим, поэтому я хотел бы сжать его. Другая система находится на IIS, и я использую C # мой конец. Конечно, я мог бы реализовать что-то, что сжимает данные перед публикацией, но для этого требуется изменить другую систему, чтобы она могла распаковать данные. Я хотел бы избежать изменения другой системы, поскольку я не являюсь ее владельцем.

Я слышал неясные вещи о включении сжатия / http 1.1 в IIS и браузере, но я не знаю, как перевести это в мою программу. По сути, есть ли какое-либо свойство, которое я могу установить в своей программе, которое заставит мою программу автоматически сжимать данные, которые она отправляет в IIS, и чтобы IIS легко ее распаковывал, чтобы принимающее приложение даже не знало разницы?

Вот пример кода, который примерно показывает, что я делаю;

private static void demo()
    {

        Stream myRequestStream = null;
        Stream myResponseStream = null;

        HttpWebRequest myWebRequest = (HttpWebRequest)System.Net
                              .WebRequest.Create("http://example.com");
        byte[] bytMessage = null;
        bytMessage = Encoding.ASCII.GetBytes("data=xyz");
        myWebRequest.ContentLength = bytMessage.Length;
        myWebRequest.Method = "POST";

        // Set the content type as form so that the data
        // will be posted as form              
        myWebRequest.ContentType = "application/x-www-form-urlencoded";

        //Get Stream object 
        myRequestStream = myWebRequest.GetRequestStream();

        //Writes a sequence of bytes to the current stream    
        myRequestStream.Write(bytMessage, 0, bytMessage.Length);

        //Close stream
        myRequestStream.Close();

        WebResponse myWebResponse = myWebRequest.GetResponse();
        myResponseStream = myWebResponse.GetResponseStream();
}

«data = xyz» фактически будет «data = [документ XML объемом несколько МБ]».

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

Ответы [ 2 ]

2 голосов
/ 09 декабря 2008

Я не вижу способа сжимать данные на одной стороне и получать их несжатыми на другой стороне без активного распаковывания данных ..

0 голосов
/ 09 декабря 2008

Не знаю, сработает ли это, поскольку все примеры, которые я смог найти, были для загрузки, но вы можете попробовать использовать gzip для сжатия данных, а затем установить заголовок Content-Encoding в исходящем сообщении на gzip. Я полагаю, что длина должна быть длиной сжатого сообщения, хотя вы можете поиграть, сделав его длиной некодированного сообщения, если это не сработает.

Удачи.

РЕДАКТИРОВАТЬ Я думаю, что проблема в том, запускается ли когда-либо / всегда / настраиваемый фильтр ISAPI, который поддерживает сжатие, при загрузке. Я не мог найти ответ на этот вопрос, поэтому я подозреваю, что ответ никогда не будет, но вы не узнаете, пока не попробуете (или не найдете ответ, который ускользнул от меня).

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