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

Решил посмотреть обращение к 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
17.05.2010, 13:53
    #36632060
iConst
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Net DataService - сменить кодировку
Если запустить саму службу в студии напрямую, имеем такой ответ
Код: 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
17.05.2010, 15:35
    #36632353
tsyselsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Net DataService - сменить кодировку
Я с этой (ADO Net DataService + EF) конструкцией дело не имел, но возможно тут есть ответ ?
...
Рейтинг: 0 / 0
17.05.2010, 15:51
    #36632388
bured
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Net DataService - сменить кодировку
у СкриптМенеджера enableGlobalization = true.
По идее само поправится.
...
Рейтинг: 0 / 0
17.05.2010, 17:19
    #36632633
iConst
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Net DataService - сменить кодировку
buredу СкриптМенеджера enableGlobalization = true.
По идее само поправится.
Не использую менеджер - он ругается, поскольку версия 3.5.1 FW(SP1) не имеет нужных классов в .js ресурсах. Страница отдается в utf-8.

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

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

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

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

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

Вот грабли! Лишний трафик гонять не хочется - как раз решаю задачу минимизации объема передаваемых данных. Собственно по-этому и отказался от XML.
...
Рейтинг: 0 / 0
27.05.2010, 14:49
    #36653066
tsyselsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Net DataService - сменить кодировку
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
27.05.2010, 16:51
    #36653475
iConst
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Net DataService - сменить кодировку
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
27.05.2010, 19:30
    #36653916
tsyselsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Net DataService - сменить кодировку
iConst
- И что?

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

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

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

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

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

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

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

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

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

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


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