Как нетипизированный DataSet передать веб сервису в Binnary
От: vladpol Украина http://vlad-mislitel.livejournal.com/
Дата: 26.02.07 12:28
Оценка:
Есть что-то типа

DataSet Changes  = MainDataSet.GetChanges();
WS.UpdateData( setupFormName, dsChanges );


WS.UpdateData — метод веб сервиса
MainDataSet — нетипизированный


Можно ли и как указать чтобы DataSet передовался в Binnary?

Changes.RemotingFormat = SerializationFormat.Binary; — не помагает
С уважением, Владислав Полищук
Re: Как нетипизированный DataSet передать веб сервису в Binn
От: dVirt  
Дата: 26.02.07 14:09
Оценка:
Очень просто!

WS.UpdateData(Converter.ToBase64String(ds.GetXML()))

а на стороне сервера

xmlString=Converter.FromBase64String(InputString)

Я так делаю, правда вместо GetXML использую ReadXml и WriteXml
Re[2]: Как нетипизированный DataSet передать веб сервису в B
От: vladpol Украина http://vlad-mislitel.livejournal.com/
Дата: 26.02.07 14:33
Оценка:
Здравствуйте, dVirt, Вы писали:

V>Очень просто!


V>WS.UpdateData(Converter.ToBase64String(ds.GetXML()))


V>а на стороне сервера


V>xmlString=Converter.FromBase64String(InputString)


V>Я так делаю, правда вместо GetXML использую ReadXml и WriteXml


FromBase64String не имеет варианта где параметр строка
С уважением, Владислав Полищук
Re[3]: Как нетипизированный DataSet передать веб сервису в B
От: dVirt  
Дата: 27.02.07 05:46
Оценка:
Сейчас я на работе, поэтому дам тебе 2 функции из своего приложения:

Функция ConvertDataSetToString()
преобразует DataSet в строку, паралельно сжимает и шифрует эту строку

Функция ConvertStringToDataSet()
восстанавливает DataSet из сжато-зашифрованой строки

На стороне сервера сделай такие же методы и пересылай инфу сколько влезит, только не забывай про ограничение на объем передаваемой XML Web сервису информации в 4 MB! Это ограничение можно снять путём изменения параметра максимального запроса в <httpRuntime> WEB.Config

Не забудь записать свой инициализационный вектор и ключ шифрования, я их от балды вбил

{1, 2, 3, 4, 5, 6, 7, 200} и {1, 2, 3, 4, 5, 6, 7, 201} соответственно.




    Public Function ConvertDataSetToString(ByVal ds As DataSet) As String
        Dim ms, msxml As IO.MemoryStream
        Dim des As System.Security.Cryptography.DESCryptoServiceProvider
        Dim transform As System.Security.Cryptography.ICryptoTransform
        Dim cs As System.Security.Cryptography.CryptoStream
        Try
            ms = New IO.MemoryStream()

            des = New System.Security.Cryptography.DESCryptoServiceProvider()
            des.IV = New Byte() {1, 2, 3, 4, 5, 6, 7, 200}
            des.Key = New Byte() {1, 2, 3, 4, 5, 6, 7, 201}
            transform = des.CreateEncryptor()
            cs = New System.Security.Cryptography.CryptoStream(ms, transform, Security.Cryptography.CryptoStreamMode.Write)

            msxml = New IO.MemoryStream()
            Dim xmlw As New IO.StreamWriter(msxml)
            'Dim dsMs As New IO.MemoryStream()
            'ds.WriteXml(msxml)

            xmlw.WriteLine(ds.GetXml())
            xmlw.Flush()
            'xmlw.Close()

            Dim originalbuf() As Byte = msxml.ToArray()
            'msxml.Write(originalbuf, 0, originalbuf.Length)
            'msxml.Flush()
            msxml.Position = 0

            'Сжимаем
            Dim cms As New IO.MemoryStream()
            Dim comps As New IO.Compression.DeflateStream(cms, IO.Compression.CompressionMode.Compress)
            comps.Write(msxml.ToArray(), 0, msxml.ToArray().Length)
            comps.Flush()

            msxml.Close()
            comps.Close()

            Dim buf As Byte()
            buf = cms.ToArray()

            'Шифруем
            cs.Write(BitConverter.GetBytes(CLng(buf.Length)), 0, 8)
            cs.Write(BitConverter.GetBytes(CLng(originalbuf.Length)), 0, 8)
            cs.Write(buf, 0, buf.Length)
            cs.Flush()

            cs.Close()
            des.Clear()

            comps.Close()

            Return Convert.ToBase64String(ms.ToArray())
        Catch ex As Exception
            Return Nothing
        End Try
    End Function

    Public Shared Function ConvertStringToDataSet(ByVal s As String) As DataSet
        Dim ms As IO.MemoryStream
        Dim des As System.Security.Cryptography.DESCryptoServiceProvider
        Dim transform As System.Security.Cryptography.ICryptoTransform
        Dim cs As System.Security.Cryptography.CryptoStream
        Dim buf As Byte()
        Dim ds As New DataSet()
        Try
            Dim b As Byte() = Convert.FromBase64String(s)
            ms = New IO.MemoryStream()
            ms.Write(b, 0, b.Length)
            ms.Flush()
            ms.Position = 0

            des = New System.Security.Cryptography.DESCryptoServiceProvider()
            des.IV = New Byte() {1, 2, 3, 4, 5, 6, 7, 200}
            des.Key = New Byte() {1, 2, 3, 4, 5, 6, 7, 201}
            transform = des.CreateDecryptor()
            cs = New System.Security.Cryptography.CryptoStream(ms, transform, Security.Cryptography.CryptoStreamMode.Read)

            Dim lenBuf(8 - 1) As Byte
            cs.Read(lenBuf, 0, 8)
            Dim EncLen As Long = BitConverter.ToInt64(lenBuf, 0)
            cs.Read(lenBuf, 0, 8)
            Dim OrLen As Long = BitConverter.ToInt64(lenBuf, 0)

            ReDim buf(EncLen - 1)

            'Расшифровываем
            cs.Read(buf, 0, buf.Length)

            cs.Close()
            des.Clear()

            'Разжимаем
            Dim cms As New IO.MemoryStream()
            cms.Write(buf, 0, buf.Length)
            cms.Position = 0
            Dim comps As New IO.Compression.DeflateStream(cms, IO.Compression.CompressionMode.Decompress)

            Dim bf() As Byte
            ReDim bf(OrLen - 1)

            comps.Read(bf, 0, bf.Length)
            comps.Close()

            ds.ReadXml(New IO.MemoryStream(bf))

            Return ds
        Catch ex As Exception
            Return Nothing
        End Try
    End Function


Удачи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.