Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF: метод принимающий Stream, исключение при Stream.Position = 0 / 3 сообщений из 3, страница 1 из 1
31.01.2009, 19:34
    #35789774
Alex_BBB
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF: метод принимающий Stream, исключение при Stream.Position = 0
Есть метод WCF принимающий Stream:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
// WCF принимает Stream от клиента
public void GetStamp(Stream file)
{
    // Посчитаем хеш

    // Перед вызовом метода file.Position = 0
    string hh1 = GetRIPEMD160Hash(file); // Хеш правильный

    // file.Position != 0 (уже не равен 0)
    string hh2 = GetRIPEMD160Hash(file); // Хеш не правильный
}

Что бы исправить ситуацию пробую выставить file.Position = 0 перед вторым подсчетом хеша:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
// WCF принимает Stream от клиента
public void GetStamp(Stream file)
{
    // Посчитаем хеш

    // Перед вызовом метода file.Position = 0
    string hh1 = GetRIPEMD160Hash(file); // Хеш правильный

    file.Position = 0; // исключение 'Specified method is not supported.'
    string hh1 = GetRIPEMD160Hash(file);
}
Выскакивает исключение: Specified method is not supported.


Вот так хеш считаю.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
// Посчитать хеш
public static string GetRIPEMD160Hash(Stream input)
{
    System.Security.Cryptography.RIPEMD160 ripemdHasher =
        new System.Security.Cryptography.RIPEMD160Managed();
    byte[] data = ripemdHasher.ComputeHash(input);
    
    return _GetHashStr(data);
}


Какие пути решения? (не копировать же поток в MemoryStream, какой длинны MemoryStream может быть?)
...
Рейтинг: 0 / 0
31.01.2009, 19:57
    #35789799
тихая гавань
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF: метод принимающий Stream, исключение при Stream.Position = 0
Alex_BBB,

А вы проверили, поток поддерживает позиционирование?
А почему нет( копирование), В SOAP расширениях ( вы помоему эти занимались год назад)
поток загоняется в стойло копированием.( в прочем могу ошибаться)
...
Рейтинг: 0 / 0
31.01.2009, 23:43
    #35789929
Alex_BBB
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF: метод принимающий Stream, исключение при Stream.Position = 0
Может кому понадобится.

Вот как можно посчитать два правильных хеша не сохраняя поток принимаемый WCF сервисом:
Код: 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.
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.
public class StreamHasher
{
    private byte[] _Hash1;
    private byte[] _Hash2;

    private HashAlgorithm _HashAlgorithm1;
    private HashAlgorithm _HashAlgorithm2;

    private int _BufferSize = 4096;


    public static string _GetHashStr(byte[] data)
    {
        StringBuilder sBuilder = new StringBuilder(data.Length * 2);
        for (int i = 0; i < data.Length; i++)
        {
            sBuilder.Append(data[i].ToString("x2"));
        }

        return sBuilder.ToString();
    }


    public StreamHasher(HashAlgorithm hashAlgorithm1, HashAlgorithm hashAlgorithm2)
    {  
        this._HashAlgorithm1 = hashAlgorithm1;
        this._HashAlgorithm2 = hashAlgorithm2;
    }


    public void ComputeHash(Stream stream)
    {
        byte[] readAheadBuffer, buffer;
        int readAheadBytesRead, bytesRead;
        long totalBytesRead = 0;

        readAheadBuffer = new byte[_BufferSize];
        readAheadBytesRead = stream.Read(readAheadBuffer, 0, readAheadBuffer.Length);

        totalBytesRead += readAheadBytesRead;

        do  
        {  
            bytesRead = readAheadBytesRead;  
            buffer = readAheadBuffer;      

            readAheadBuffer = new byte[_BufferSize];  
            readAheadBytesRead = stream.Read(readAheadBuffer, 0, readAheadBuffer.Length);  

            totalBytesRead += readAheadBytesRead;

            if (readAheadBytesRead == 0)
            {
                _HashAlgorithm1.TransformFinalBlock(buffer, 0, bytesRead);
                _HashAlgorithm2.TransformFinalBlock(buffer, 0, bytesRead);
            }
            else
            {
                _HashAlgorithm1.TransformBlock(buffer, 0, bytesRead, buffer, 0);
                _HashAlgorithm2.TransformFinalBlock(buffer, 0, bytesRead);
            }
        }
        while (readAheadBytesRead != 0);

        _Hash1 = _HashAlgorithm1.Hash;
        _Hash2 = _HashAlgorithm2.Hash;
    }

    public int BufferSize
    {
        get { return _BufferSize; }
        set { _BufferSize = value; }
    }

    public byte[] Hash1
    {
        get { return _Hash1; }
    }

    public byte[] Hash2
    {
        get { return _Hash2; }
    }

    public string Hash1Str
    {
        get { return _GetHashStr(_Hash1); }
    }

    public string Hash2Str
    {
        get { return _GetHashStr(_Hash2); }
    }
}


Использовать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
// WCF принимает Stream от клиента
public void GetStamp(Stream file)
{
    // Посчитаем хеш

    // Естественно хеш алгоритмы нужны разные, для проверки введем одинаковые
    StreamHasher sh = new StreamHasher(SHA512Managed.Create(), SHA512Managed.Create());
    sh.ComputeHash(file);

    // Обе строки представляют правильный хеш и равны друг другу
    string hh1 = sh.Hash1Str;
    string hh2 = sh.Hash2Str;
}


Костыли по мативам Hashing Big Files With Style .
...
Рейтинг: 0 / 0
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF: метод принимающий Stream, исключение при Stream.Position = 0 / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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