Есть что-то типа
DataSet Changes = MainDataSet.GetChanges();
WS.UpdateData( setupFormName, dsChanges );
WS.UpdateData — метод веб сервиса
MainDataSet — нетипизированный
Можно ли и
как указать чтобы DataSet передовался в Binnary?
Changes.RemotingFormat = SerializationFormat.Binary; — не помагает
Здравствуйте, dVirt, Вы писали:
V>Очень просто!
V>WS.UpdateData(Converter.ToBase64String(ds.GetXML()))
V>а на стороне сервера
V>xmlString=Converter.FromBase64String(InputString)
V>Я так делаю, правда вместо GetXML использую ReadXml и WriteXml
FromBase64String не имеет варианта где параметр строка
Сейчас я на работе, поэтому дам тебе 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
Удачи!