Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# под Web, ASP.NET

Войти
Регистрация
Восстановить пароль
 
CMaker
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 4
#1

В header'ах Content-Length из обработчика 1c всегда приходит -1 - C# ASP.NET

26.06.2012, 07:27. Просмотров 733. Ответов 3
Метки нет (Все метки)

Предыстория.
Есть веб-сервис на 1с, есть программа, связывающаяся с этим веб-сервисом через IIS. На IIS стоит собственно хендлер на *.1cws. Проблема в том, что в header'ах Content-Length из обработчика 1c всегда прилетает -1. Начал копать в сторону обработчиков и модулей. Казалось бы вот она, рыба. Быстренько наваял модуль для IIS при создании ответа в Context.Responce.Filter подсунул свой стрим который считает количество записанных байт. Всё отлично работало на обычном контенте. Но как только дело касается *.1csw ссылок то Content-Length = 0 постоянно. Не понимаю почему контент обработчика не прохидит через модуль =((( Может быть кто сталкивался с этим или знает как получить конечный вариант http страницы.
Код модуля.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
using System;
using System.CodeDom.Compiler;
using System.IO;
using System.IO.Compression;
using System.Web;
public class MyModule: IHttpModule
{
    public MyModule()
    {
 
    }
    public String ModuleName
    {
        get { return "MyModule"; }
    }
 
    public void Init(HttpApplication application)
    {
        application.BeginRequest +=
            (new EventHandler(this.OnBeginRequest));
 
        application.EndRequest +=
            (new EventHandler(OnEndRequest));
 
        application.PreSendRequestHeaders += PreSendReqHeaders;
    }
 
    private void PreSendReqHeaders(object source, EventArgs e)
    {
        HttpApplication application = (HttpApplication)source;
        HttpContext context = application.Context;
        ContentLengthFilter filter = (ContentLengthFilter)context.Response.Filter;
        context.Response.Headers.Add("Cotent-Size1c", filter.BytesWritten.ToString());
  
    }
 
    void OnBeginRequest(object source, EventArgs e)
    {
        HttpApplication application = (HttpApplication)source;
        HttpContext context = application.Context;
        application.Response.Filter = new ContentLengthFilter(application.Response.Filter);
 
    }
 
    void OnEndRequest(object sender, EventArgs e)
    {
        HttpApplication application = (HttpApplication)sender;
        HttpContext context = application.Context;
        ContentLengthFilter filter = (ContentLengthFilter)application.Response.Filter;
    }
 
 
 
    public void Dispose()
    {
    }
 
 
    public class ContentLengthFilter : Stream
    {
        private readonly Stream _responseFilter;
 
        private int _bytesWritten;
 
        public int BytesWritten
        {
            get { return _bytesWritten; }
            set { _bytesWritten = value; }
        }
 
        public ContentLengthFilter(Stream responseFilter)
        {
            _responseFilter = responseFilter;
        }
 
        public override void Flush()
        {
            _responseFilter.Flush();
        }
 
        public override long Seek(long offset, SeekOrigin origin)
        {
            return _responseFilter.Seek(offset, origin);
        }
 
        public override void SetLength(long value)
        {
            _responseFilter.SetLength(value);
        }
 
        public override int Read(byte[] buffer, int offset, int count)
        {
            return _responseFilter.Read(buffer, offset, count);
        }
 
        public override void Write(byte[] buffer, int offset, int count)
        {
            BytesWritten += count;
            _responseFilter.Write(buffer, offset, count);
        }
 
        public override bool CanRead
        {
            get { return _responseFilter.CanRead; }
        }
 
        public override bool CanSeek
        {
            get { return _responseFilter.CanSeek; }
        }
 
        public override bool CanWrite
        {
            get { return _responseFilter.CanWrite; }
        }
 
        public override long Length
        {
            get { return _responseFilter.Length; }
        }
 
        public override long Position
        {
            get { return _responseFilter.Position; }
            set { _responseFilter.Position = value; }
        }
    }
}
PS не обращайте внимание на название хидера Cotent-Size1c. Оно роли не играет. Пускай хоть Абракадабра называется, лишь бы длину считало
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2012, 07:27
Я подобрал для вас темы с готовыми решениями и ответами на вопрос В header'ах Content-Length из обработчика 1c всегда приходит -1 (C# ASP.NET):

Уточните насчет заголовка Content-Length в запросе - C#
Прочитал что в заголовке Content-Length указано число октетов(байтов) запроса(request). Имеется ввиду весь запрос от метода отправки и...

Библиотека xnet.dll добавить Content-Length - C#
В общем не совсем понятно как добавить этот параметр. Пробую добавить в хидер - выдается ошибка Значение заголовка 'Content-Length' можно...

Как посчитать Content-length? - Delphi
Доброго здоровья! Дано:POST запрос. Сервер требует точного Content-length. Для сообщения (utf-8)...

Библиотека xNet - как установить заголовок Content-Length = 0? - C#
Кто пользовался библиотекой xNet - как установить Content-Length = 0? В библиотеке этот заголовок надо добавлять специальным методом, где...

POST запрос через JS имеет Content-Length: 0, по клику работает нормально. Chrome + FireFox - JavaScript
И в Хроме и в Лисе если отправляю форму через JS по form.submit() то она отправляется пустой с Content-Length: 0 код формы ...

Warning: POST Content-Length of 13305751 bytes exceeds the limit of 8388608 bytes in Unknown on line 0 - PHP
Вот такая ошибка красуется на странице, но при этом в php.ini upload_max_filesize = 20M, file_uploads = On и post_max_size = 20M, а в форме...

3
sau
1677 / 1480 / 147
Регистрация: 22.07.2011
Сообщений: 5,609
Завершенные тесты: 1
26.06.2012, 10:15 #2
а каким образом ваш обработчик связан с обработчиком 1cws ?
0
CMaker
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 4
26.06.2012, 10:33  [ТС] #3
Цитата Сообщение от sau Посмотреть сообщение
а каким образом ваш обработчик связан с обработчиком 1cws ?
Я в web.config добавил модуль. Как я понял там идёт конвеерная архитектура. Первый собрал, второй добавил, третий добавил, отправилось всё. По идее должно получаться так обработчик передал управление dll, длл подконектилась к 1с, 1ска сконструировала ответ, отдала его. Потом всё передаётся модулю. - Ну это только мои мысли. На самом же деле всё происходит несколько иначе. Ответ конструируется, но он болтается неизвестно где и неизвестно как его измерить.

XML
1
2
3
4
5
6
7
<configuration>
  <system.webServer>
    <modules>
        <add name="MyModule" type="MyModule" />
    </modules>
  </system.webServer>
</configuration>
PS Прогоны показали, что реально если сделать Responce.Write("123") в BeginRequest, то перед обработкой 1сws появится "123", если EndRequest, то после обработки "123". Но я удивляюсь, как обработчик умудряется обойти Filter. Туда не записывается ни бита.
0
CMaker
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 4
27.06.2012, 11:41  [ТС] #4
Никто не знает решения? У меня появились идеи. Может после этого вы сможите кое что подсказать
У меня WebService работает через handler получается. Но каким-то образом Application.Context передаётся туда другой => не идёт запись в Context.Filter. Если бы можно было бы достучаться до хендлера, то всё было бы замечательно.
События PreRequestHandlerExecute, PostRequestHandlerExecute у HttpApplication
похоже висят просто для красоты. Никаких ссылок на хендлер. Ничего. Абсолютно =(
Уже не знаю с какой стороны атаковать этот бастион.
Возможно уто-нибудь из обитателей форума подскажет куда капнуть то хоть =( Спасибо за ваше внимание.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2012, 11:41
Привет! Вот еще темы с ответами:

После установки VirtueMart слетела кодировка и возникла ошибка "POST Content-Length of 11910997 bytes" - Joomla
Подскажите в чем может быть проблема, после установки на Joomla 2.5 плагина VirtueMart2.6.0a_Joomla_2.5.20-Stable-Full_Package на странице...

AJAX вместо результата обработчика возвращает, исходный код обработчика - JavaScript
Здравствуйте, начал изучать AJAX и столкнулся с проблемой, при GET запросе в котором я стучу в файл php и требую что бы он вернул текст с...

Include 'content.php' вместо $content$ - PHP
Здравствуйте уважаемые форумчане! Нужна ваша помощь. И так, например, в файле index.php имеется строковая переменная: $var = 'Здесь...

Несмотря того что я поставил <META content='text/html; charset=UTF-8' http-equiv=Content-Type>, в броузере она всеровно меняется. - PHP
Несмотря того что я поставил &lt;META content='text/html; charset=UTF-8' http-equiv=Content-Type&gt;, в броузере она всеровно меняется.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru