Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Web, ASP.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
CMaker
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 4
#1

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

26.06.2012, 07:27. Просмотров 743. Ответов 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
Ответы с готовыми решениями:

Библиотека xnet.dll добавить Content-Length
В общем не совсем понятно как добавить этот параметр. Пробую добавить в хидер -...

Уточните насчет заголовка Content-Length в запросе
Прочитал что в заголовке Content-Length указано число октетов(байтов)...

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

Библиотека xNet - как установить заголовок Content-Length = 0?
Кто пользовался библиотекой xNet - как установить Content-Length = 0? В...

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

3
sau
1888 / 1552 / 248
Регистрация: 22.07.2011
Сообщений: 5,853
Завершенные тесты: 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

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

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

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


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

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

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