powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / ADO Net DataService - сменить кодировку
17 сообщений из 17, страница 1 из 1
ADO Net DataService - сменить кодировку
    #36632015
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем.

Решил посмотреть обращение к WCF ADO Net DataService + EF службе через AJAX-клиента. Сделал тестовое веб-приложение. Все хорошо, только почему-то данные отдаются в windows-1251 кодировке.

WebDataService1.svc.cs
Код: plaintext
1.
2.
3.
4.
5.
6.
    public class WebDataService1 : DataService<Database1Entities>
    {
        public static void InitializeService(IDataServiceConfiguration config)
        {
            config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
        }
    }
Database1Entities - мапа базы данных, примитивная тестовая таблица SQL2008:

Table1:
Id (int)
Name (nvarchar(50)) т.е. utf-8.

Default.aspx
Код: plaintext
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.
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WCF_EF_ADODataService._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
<!-- Тут подключаются скрипты MS AJAX -->

    <script type="text/javascript">
        var url = './WebDataService1.svc';

        function buttonGetdata_onclick()
        {
            var ds = new Sys.Data.OpenDataServiceProxy(url);
            ds.query('Table1', cbSuccsess, cbFailed);
        }

        function cbSuccsess(result, context, operation) // обрабатываем ответ и заполняем список 
        {
            var r_list = document.getElementById('list');

            for (var i in result)
            {
                var el = result[i];

                var li = document.createElement('li');
                li.appendChild(document.createTextNode(el.Name));
                r_list.appendChild(li);
            }
        }
        
        function cbFailed(error, context, operation) // кричим об ошибке
        {
            alert(error);
        }
    </script>

</head>
<body>
    <form id="form1" runat="server">
    <div>
        <input id="buttonGetdata" type="button" value="Get Data" onclick="return buttonGetdata_onclick()" />
        <il id="list"></il>
        </div>
    </form>
</body>
</html>

Сама страница, как положено, отдается в utf-8, но запрос отдается в windows-1251.
Сам файл службы почти не имеет никакого содержания.

Где чё подкрутить нужно? :).

Перевернув мир - оглянись, может перевернулся ты сам?!
...
Рейтинг: 0 / 0
ADO Net DataService - сменить кодировку
    #36632060
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если запустить саму службу в студии напрямую, имеем такой ответ
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<?xml version="1.0" encoding="windows-1251" standalone="yes"?>
<service xml:base="http://localhost:51073/WebDataService1.svc/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:app="http://www.w3.org/2007/app" xmlns="http://www.w3.org/2007/app">
  <workspace>
    <atom:title>Default</atom:title>
    <collection href="Table1">
      <atom:title>Table1</atom:title>
    </collection>
    <collection href="Table2">
      <atom:title>Table2</atom:title>

    </collection>
  </workspace>
</service>

На страницу получаем JSON

Код: plaintext
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.
{ "d" : [
{
"__metadata": {
"uri": "http://localhost:51073/WebDataService1.svc/Table1(1)", "type": "Database1Model.Table1"
}, "Id":  1 , "Name": "Запись 1", "Table2": {
"__deferred": {
"uri": "http://localhost:51073/WebDataService1.svc/Table1(1)/Table2"
}
}
}, {
"__metadata": {
"uri": "http://localhost:51073/WebDataService1.svc/Table1(2)", "type": "Database1Model.Table1"
}, "Id":  2 , "Name": "Запись 2", "Table2": {
"__deferred": {
"uri": "http://localhost:51073/WebDataService1.svc/Table1(2)/Table2"
}
}
}, {
"__metadata": {
"uri": "http://localhost:51073/WebDataService1.svc/Table1(3)", "type": "Database1Model.Table1"
}, "Id":  3 , "Name": "Запись 3", "Table2": {
"__deferred": {
"uri": "http://localhost:51073/WebDataService1.svc/Table1(3)/Table2"
}
}
}
] }
Ответы в кириллице распухают неимоверно: "Name": "Запись 1" .


Заголовки:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
HTTP/ 1 . 1   200  OK
Server: ASP.NET Development Server/ 9 . 0 . 0 . 0 
Date: Mon,  17  May  2010   09 : 32 : 18  GMT
X-AspNet-Version:  2 . 0 . 50727 
DataServiceVersion:  1 . 0 ;
Cache-Control: no-cache
Content-Type: application/json;charset=windows- 1251 
Content-Length:  875 
Connection: Close
...
Рейтинг: 0 / 0
ADO Net DataService - сменить кодировку
    #36632353
Фотография tsyselsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я с этой (ADO Net DataService + EF) конструкцией дело не имел, но возможно тут есть ответ ?
...
Рейтинг: 0 / 0
ADO Net DataService - сменить кодировку
    #36632388
Фотография bured
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у СкриптМенеджера enableGlobalization = true.
По идее само поправится.
...
Рейтинг: 0 / 0
ADO Net DataService - сменить кодировку
    #36632633
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buredу СкриптМенеджера enableGlobalization = true.
По идее само поправится.
Не использую менеджер - он ругается, поскольку версия 3.5.1 FW(SP1) не имеет нужных классов в .js ресурсах. Страница отдается в utf-8.

Моя коф. рабочей машины: W7 Pro x86 + VS2008SP1 + SQL2008Express

У меня закралась мысль - что если БД хранит в 1251 и служба просто отдает "как есть"? Как проверить кодировку хранящихся записей?
Если дернуть данные на страницу из базы через Linq2Sql, то никакой переконвертации не требуется - utf-8. Если только она не происходит прозрачно.
...
Рейтинг: 0 / 0
ADO Net DataService - сменить кодировку
    #36632644
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bured,
И потом - дефолтный вызов службы (см. выше), без клиента уже отдает в 1251. Клиент ни при чем.
...
Рейтинг: 0 / 0
ADO Net DataService - сменить кодировку
    #36632651
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tsyselskyЯ с этой (ADO Net DataService + EF) конструкцией дело не имел, но возможно тут есть ответ ?
Не помогает.
...
Рейтинг: 0 / 0
ADO Net DataService - сменить кодировку
    #36632755
Фотография bured
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
<%# Page UICulture="auto"
...
Рейтинг: 0 / 0
ADO Net DataService - сменить кодировку
    #36632966
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bured<%# Page UICulture="auto"
Со страницей все нормально. Я делаю запрос к службе и ОНА возвращает данные в кодировке 1251.
Повторяю вопрос: Если данные в БД хранятся в 1251, то как это определить точно?
...
Рейтинг: 0 / 0
ADO Net DataService - сменить кодировку
    #36633978
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если заменить сгенерированный студией Database1Entities "ручным" набором классов данных, где гарантированно (?) строки в utf-8, то картина не меняется. Служба все равно отдает в кодировке 1251.

Значит БД ни при чем (?). Ведь с чего-то служба включила кодировку.

Или следует признать, что ADO Net Data Service - кривая/сырая штука?

Есть мысли?
...
Рейтинг: 0 / 0
ADO Net DataService - сменить кодировку
    #36652497
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все что нашел о кодировке - это (примерный смысл), что служба сама(!) решает, в какой кодировке отдавать данные. И плевать она хотела на классы Entity, где прописано utf-8.
И даже если запрос в заголовке исключить windows-1251
Код: plaintext
Accept-Charset utf-8;q=0.7,*;q=0.7
то служба таки отдает в utf-8, но опять-же Запись.... !

Вот грабли! Лишний трафик гонять не хочется - как раз решаю задачу минимизации объема передаваемых данных. Собственно по-этому и отказался от XML.
...
Рейтинг: 0 / 0
ADO Net DataService - сменить кодировку
    #36653066
Фотография tsyselsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.unicode.org/faq//utf_bom.html

Код: plaintext
Q: Is there a standard method to package a Unicode character so it fits an  8 -Bit ASCII stream?

A: There are three or four options for making Unicode fit into an 8-bit format.

a) Use UTF-8. This preserves ASCII, but not Latin-1, because the characters >127 are different from Latin-1. UTF-8 uses the bytes in the ASCII only for ASCII characters. Therefore, it works well in any environment where ASCII characters have a significance as syntax characters, e.g. file name syntaxes, markup languages, etc., but where the all other characters may use arbitrary bytes.
Example: “Latin Small Letter s with Acute” (015B) would be encoded as two bytes: C5 9B.

b) Use Java or C style escapes, of the form \uXXXXX or \xXXXXX. This format is not standard for text files, but well defined in the framework of the languages in question, primarily for source files.
Example: The Polish word “wyjście” with character “Latin Small Letter s with Acute” (015B) in the middle (ś is one character) would look like: “wyj\u015Bcie".


c) Use the XXXX; or DDDDD; numeric character escapes as in HTML or XML. Again, these are not standard for plain text files, but well defined within the framework of these markup languages.
Example: “wyjście” would look like “wyjście"

d) Use SCSU. This format compresses Unicode into 8-bit format, preserving most of ASCII, but using some of the control codes as commands for the decoder. However, while ASCII text will look like ASCII text after being encoded in SCSU, other characters may occasionally be encoded with the same byte values, making SCSU unsuitable for 8-bit channels that blindly interpret any of the bytes as ASCII characters.
Example: “<SC2> wyjÛcie” where <SC2> indicates the byte 0x12 and “Û” corresponds to byte 0xDB. [AF] & [KW]
...
Рейтинг: 0 / 0
ADO Net DataService - сменить кодировку
    #36653475
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tsyselsky...
b) Use Java or C style escapes, of the form \uXXXXX or \xXXXXX. This format is not standard for text files, but well defined in the framework of the languages in question, primarily for source files.
Example: The Polish word “wyjście” with character “Latin Small Letter s with Acute” (015B) in the middle (ś is one character) would look like: “wyj\u015Bcie".

...
- И что?
...
Рейтинг: 0 / 0
ADO Net DataService - сменить кодировку
    #36653916
Фотография tsyselsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iConst
- И что?

Вам, я так понял, нужен ответ содержащий набор кирилических символов в кодировке unicode (utf-8)

это
Запись 1
как мне кажется и есть набор кирилических символов ( Запись 1 ) в кодировке unicode.

iConstГде чё подкрутить нужно? :).

Ну дык, похоже, все нормально работает, нет?
И крутить ничего не надо. :]

PS Cyrillic Unicode block
...
Рейтинг: 0 / 0
ADO Net DataService - сменить кодировку
    #36654520
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tsyselsky,
Ежу понятно, что это кириллица - вопрос в другом: служба конвертит данные UTF-8 -> Win-1251 и вместо одной буквы я имею "и".

Во сколько раз увеличится объем данных? Мне нужно передавать БОЛЬШОЙ объем этих самых данных.
...
Рейтинг: 0 / 0
ADO Net DataService - сменить кодировку
    #36655471
Фотография tsyselsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я, если откровенно, запутался малость ...
Возможно мои предположения и вопросы покажутся дилетанскими,
но рискну их озвучить.

СУБД
Есть некая сущность, хранящая набор кирилических символов
в восьмибитной кодировке cp1251

ADO (EF)
ADO.NET достает данные и EF создает двухбайтовые UNICOD объекты в памяти веб сервера

WCF
Служба сериализует эти объекты в однобайтовые текстовые символы в кодировке cp1251
форматирует их в JSON и отправляет клиенту.

и это
iConst "Запись 1".
набор символов в кодировке windows 1251, так ?
...
Рейтинг: 0 / 0
ADO Net DataService - сменить кодировку
    #36656468
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет. Изначально хранится в UTF-8. Об чем и речь...
И не понятно, за каким ... служба конвертит это через ср1251....
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / ADO Net DataService - сменить кодировку
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]