powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF: метод принимающий Stream, исключение при Stream.Position = 0
3 сообщений из 3, страница 1 из 1
WCF: метод принимающий Stream, исключение при Stream.Position = 0
    #35789774
Alex_BBB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть метод 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
WCF: метод принимающий Stream, исключение при Stream.Position = 0
    #35789799
тихая гавань
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_BBB,

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

Вот как можно посчитать два правильных хеша не сохраняя поток принимаемый 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
3 сообщений из 3, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF: метод принимающий Stream, исключение при Stream.Position = 0
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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