В Интернете существует множество MD5 для зашифрованных символов ASP, и они очень распространены, но MD5 для файлов действительно очень редок из-за ограничений самого языка ASP. Мы знаем, что md5 строки может необратимо зашифровать простой текст, чтобы обеспечить безопасность хранения или передачи данных. Аналогичным образом, шифрование файлов md5 также используется, чтобы гарантировать, что они не будут изменены и проверены во время передачи по сети. Другое использование — на личных сайтах: оно может гарантировать уникальность загруженных изображений или файлов. Принцип заключается в том, что после загрузки на сервер значение md5 загруженного файла одновременно записывается в базу данных. Таким образом, при следующей загрузке того же файла мы можем запросить базу данных, чтобы узнать, так ли это. тот же файл. Если значение md5 одинаковое, мы будем считать его одинаковым. Для файлов значение md5 является «идентификатором» файла. Фактически, у Baidu также есть приложения в этой области. для картинок на Baidu и кликнув на картинку, иногда «Вы также можете нажать на следующую ссылку, чтобы просмотреть эту картинку: XXX URL», принцип тот же, md5 файл.
Без лишних слов, давайте начнем.
1. asp вызывает программу .Net через интерактивный режим xml для реализации файла md5.
Из-за ограничений своего языка asp не может реализовать md5 файлов, но .net действительно может это сделать. Можно ли выполнить md5 для файла через .net, а затем отправить информацию в asp для ее получения? md5 asp можно добиться Ответ Это точно. Это предполагает взаимодействие между программами ASP и .NET. Ранее я написал класс ASP: «Классы отправки и получения XML-данных ASP». Его можно просмотреть в моем пространстве Baidu: http://hi.baidu.com/manbutianmi. /blog/item/dec182fc6db36587b801a0f6.html посвящен ASP-обработке отправки и получения XML-данных и может использоваться для связи между интерфейсами API между различными гетерогенными системами. Эта статья представляет собой приложение этого класса. Код выглядит следующим образом:
код стороны asp
xmlcls.asp
<%
Rem обрабатывает отправку и получение классов XML-данных.
'------------------------------------------------ -
«Эта информация об авторских правах должна быть сохранена при перепечатке.
'Автор: Walkman
'Веб-сайт: Сеть мобильных тем: http://www.shouji138.com
'Версия: ver1.0
'------------------------------------------------ -
КлассXmlClass
Определение переменной Rem
Частный XmlDoc, XmlHttp
Код личного сообщения, SysKey, XmlPath
Частный m_GetXmlDoc,m_url
Частная инициализация m_XmlDocAccept
Rem
Частный подкласс_Initialize()
При ошибке Возобновить Далее
Код сообщения = ""
ХмлПат = ""
Установить XmlDoc = Server.CreateObject("msxml2.FreeThreadedDOMDocument.3.0")
XmlDoc.ASYNC = Ложь
Конец субтитра
Рем уничтожает объект
Частный подкласс_Terminate()
Если IsObject(XmlDoc), то установите XmlDoc = Ничего
Если IsObject(m_XmlDocAccept), то установите m_XmlDocAccept = Ничего
Если IsObject(m_GetXmlDoc), то установите m_GetXmlDoc = Ничего
Конец субтитра
'Определение публичного атрибута начинается --------------------------
Сообщение об ошибке удаления
Открытая собственность Получить сообщение()
Сообщение = Код сообщения
Конечная собственность
Удалить адрес для отправки XML
Публичная собственность Let URL(str)
m_url = ул
Конечная собственность
'Конец определения публичного атрибута --------------------------
'Запуск частного процесса и метода --------------------------
Освободить загрузку XML
Частная подпрограмма LoadXmlData()
Если XmlPath <> "" Тогда
Если не XmlDoc.Load(XmlPath), Тогда
XmlDoc.LoadXml "<?xml version=""1.0""coding=""gb2312""?><root/>"
Конец, если
Еще
XmlDoc.LoadXml "<?xml version=""1.0""coding=""gb2312""?><root/>"
Конец, если
Завершить
преобразование символов Sub Rem
Частная функция AnsiToUnicode (ByVal str)
Дим i, j, c, i1, i2, u, fs, f, p
АнсиТоЮникод = ""
р = ""
Для i = 1 To Len(str)
c = Mid(str, i, 1)
j = AscW(с)
Если j < 0 Тогда
j = j + 65536
Конец, если
Если j >= 0 и j <= 128 Тогда
Если р = «с» Тогда
AnsiToUnicode = " " & AnsiToUnicode
р = "е"
Конец, если
AnsiToUnicode = AnsiToUnicode & c
Еще
Если р = "е" Тогда
AnsiToUnicode = AnsiToUnicode & " "
р = "с"
Конец, если
AnsiToUnicode = AnsiToUnicode & («&#» & j & «;»)
Конец, если
Следующий
Конечная функция
Преобразование символов Rem
Частная функция strAnsi2Unicode(asContents)
Dim len1,i,varchar,varasc
strAnsi2Unicode = ""
len1=LenB(asContents)
Если len1=0, то выходим из функции
Для i = от 1 до len1
varchar=MidB(asContents,i,1)
вараск = AscB (varchar)
Если вараск > 127 Тогда
Если MidB(asContents,i+1,1)<>"" Тогда
strAnsi2Unicode = strAnsi2Unicode & chr(ascw(midb(asContents,i+1,1) & varchar))
Конец, если
я=я+1
Еще
strAnsi2Unicode = strAnsi2Unicode & Chr(varasc)
Конец, если
Следующий
Конечная функция
Rem добавляет символы в файл
Частная подпрограмма WriteStringToFile (имя файла, строка)
При ошибке Возобновить Далее
Дим фс,тс
Set fs= createobject("script_ing.filesystemobject")
Если не IsObject(fs), то выйдите из Sub
Установите ts=fs.OpenTextFile(Server.MapPath(имя файла),8,True)
ts.writeline(стр)
ц.закрыть
Установите ts=Ничего
Установить fs=Ничего
Конец субтитра
'Конец частного процесса и метода --------------------------
'Открытый метод запускается --www.devdao.com------------------------
''''''''''' Отправьте XML-часть для начала
Rem заполнить объект XmlDoc из внешнего XML-файла
Публичная подпрограмма LoadXmlFromFile (путь)
XmlPath = Server.MapPath(путь)
ЗагрузитьXmlДанные()
Конец субтитра
Rem заполнить объект XmlDoc строкой
Публичная подпрограмма LoadXmlFromString(str)
XmlDoc.LoadXml строка
Конец субтитра
Rem устанавливает параметры узла, такие как NodeValue «appID», AppID, 1, False.
'------------------------------------------------ -
'параметр:
'NodeName имя узла
'Значение NodeText
'Тип сохранения NodeType [text=0,cdata=1]
'blnEncode, кодировать ли [true, false]
'------------------------------------------------ -
Public Sub NodeValue (Byval NodeName, Byval NodeText, Byval NodeType, Byval blnEncode)
Тусклый дочерний узел, CreateCDATASection
ИмяУзла = Lcase(ИмяУзла)
Если XmlDoc.documentElement.selectSingleNode(NodeName) ничего не значит Тогда
Set ChildNode = XmlDoc.documentElement.appendChild(XmlDoc.createNode(1,NodeName,""))
Еще
Установить ChildNode = XmlDoc.documentElement.selectSingleNode(NodeName)
Конец, если
Если blnEncode = True Тогда
NodeText = AnsiToUnicode(NodeText)
Конец, если
Если NodeType = 1 Тогда
ДетскийУзел.Текст = ""
Установите CreateCDATASection = XmlDoc.createCDATASection(Replace(NodeText,"]]>","]]>"))
ChildNode.appendChild(createCDATASection)
Еще
ДетскийУзел.Текст = Текст узла
Конец, если
Конец субтитра
'------------------------------------------------ -
'Получаем значение узла в отправленном пакете XML
'параметр:
'Имя узла Str
'------------------------------------------------ -
Открытое свойство GetXmlNode(ByvalStr)
Если XmlDoc.documentElement.selectSingleNode(Str) равен нулю, тогда
XmlNode = "Ноль"
Еще
XmlNode = XmlDoc.documentElement.selectSingleNode(Str).text
Конец, если
Конечное свойство
'----------------------------------------------- -- ---
'Получаем возвращенный объект XML-данных
'пример:
'Если GetXmlData не равно NULL, GetXmlData является объектом XML
'------------------------------------------------ -
Открытая собственность GetXmlData()
Установите GetXmlData = m_GetXmlDoc
Конечная собственность
'------------------------------------------------ -
'Отправить XML-пакет
'------------------------------------------------ -
Публичная подпрограмма SendHttpData()
Dim я, GetXmlDoc, LoadAppid
Установите Xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP.3.0")
Set GetXmlDoc = Server.CreateObject("msxml2.FreeThreadedDOMDocument.3.0") ' Возвращает XML-пакет
XmlHttp.Open "POST", m_url, false
XmlHttp.SetRequestHeader "тип содержимого", "текст/xml"
XmlHttp.Отправить XmlDoc
'Response.Write strAnsi2Unicode(xmlhttp.responseBody)
Если GetXmlDoc.load(XmlHttp.responseXML) Тогда
Установите m_GetXmlDoc = GetXmlDoc.
Еще
MessageCode = "Ошибка при запросе данных!"
Выход из подзаголовка
Конец, если
Установить GetXmlDoc = Ничего
Установить XmlHttp = Ничего
Конец субтитра
'------------------------------------------------ -
'Распечатать XML-данные запроса на отправку
'------------------------------------------------ -
Публичная подпрограмма PrintSendXmlData()
Ответ.Очистить
Response.ContentType = "текст/xml"
Response.CharSet = "gb2312"
Ответ.Истекает = 0
Response.Write "<?xml version=""1.0""coding=""gb2312""?>"&vbNewLine
Response.Write XmlDoc.documentElement.XML
Конец субтитра
'------------------------------------------------ -
'Распечатать возвращенные XML-данные
'------------------------------------------------ -
Публичная подпрограмма PrintGetXmlData()
Ответ.Очистить
Response.ContentType = "текст/xml"
Response.CharSet = "gb2312"
Ответ.Истекает = 0
Если IsObject(m_GetXmlDoc) Тогда
Response.Write "<?xml version=""1.0""coding=""gb2312""?>"&vbNewLine
Response.Write m_GetXmlDoc.documentElement.XML
Еще
Response.Write "<?xml version=""1.0""coding=""gb2312""?><root></root>"
Конец, если
Конец субтитра
Рем сохраняет XML-данные запроса на отправку в файл с именем sendxml_date.txt.
Публичная подпрограмма SaveSendXmlDataToFile()
Тусклое имя файла,str
имя файла = «sendxml_» и DateValue (сейчас) и «.txt»
ул = ""
str = str & ""& Now() & vbNewLine
str = str & "--------------------------------------------- --- "& vbNewLine
str = str & "<?xml version=""1.0""coding=""gb2312""?>" & vbNewLine
str = str & XmlDoc.documentElement.XML & vbNewLine
str = str & "--------------------------------------------- --- "& vbNewLine
str = str & vbNewLine & vbNewLine & vbNewLine
WriteStringToFile имя файла,str
Конец субтитра
Рем сохраняет возвращенные XML-данные в файл с именем getxml_date.txt.
Публичная подпрограмма SaveGetXmlDataToFile()
Тусклое имя файла,str
имя файла = «getxml_» и DateValue (сейчас) и «.txt»
ул = ""
str = str & ""& Now() & vbNewLine
str = str & "--------------------------------------------- --- "& vbNewLine
Если IsObject(m_GetXmlDoc) Тогда
str = str & "<?xml version=""1.0""coding=""gb2312""?>" & vbNewLine
str = str & m_GetXmlDoc.documentElement.XML
Еще
str = str & "<?xml version=""1.0""coding=""gb2312""?>" & vbNewLine & "<root>" & vbNewLine & "</root>"
Конец, если
ул = ул и vbNewLine
str = str & "--------------------------------------------- --- "& vbNewLine
str = str & vbNewLine & vbNewLine & vbNewLine
WriteStringToFile имя файла,str
Конец субтитра
'------------------------------------------------ -
'Получаем информацию об узле возвращенного XML
'XmlClassObj.GetSingleNode("//msg")
'------------------------------------------------ -
Открытая функция GetSingleNode(nodestring)
Если IsObject(m_GetXmlDoc) Тогда
GetSingleNode = m_GetXmlDoc.documentElement.selectSingleNode(nodestring).text
Еще
GetSingleNode = ""
Конец, если
Конечная функция
''''''''''''''''''Конец отправки XML-части
''''''''''''''''''Начинается приемная часть xml
'------------------------------------------------ -
'Получить XML-пакет, информация об ошибке получена через объект Message
'------------------------------------------------ -
Открытая функция AcceptHttpData()
Тусклый XMLдом
Установите XMLdom = Server.CreateObject("Microsoft.XMLDOM")
XMLdom.Async = Ложь
XMLdom.Load(Запрос)
Если XMLdom.parseError.errorCode <> 0 Тогда
MessageCode = "Невозможно правильно получить данные" & "Descript_ion: " & XMLdom.parseError.reason & "<br>Line: " & XMLdom.parseError.Line
Установите m_XmlDocAccept = Null
Еще
Установите m_XmlDocAccept = XMLdom
Конец, если
Конечная функция
'----------------------------------------------- -- ---
'Возврат для получения информации об узле пакета XML
'XmlClassObj.GetSingleNode("//msg")
'------------------------------------------------ -
Открытая функция AcceptSingleNode(nodestring)
Если IsObject(m_XmlDocAccept) Тогда
AcceptSingleNode = m_XmlDocAccept.documentElement.selectSingleNode(nodestring).text
Еще
AcceptSingleNode = ""
Конец, если
Конечная функция
'------------------------------------------------ -
'Распечатать XML-данные, полученные принимающей стороной
'------------------------------------------------ -
Публичная подпрограмма PrintAcceptXmlData()
Ответ.Очистить
Response.ContentType = "текст/xml"
Response.CharSet = "gb2312"
Ответ.Истекает = 0
Если IsObject(m_XmlDocAccept) Тогда
Response.Write "<?xml version=""1.0""coding=""gb2312""?>"&vbNewLine
Response.Write m_XmlDocAccept.documentElement.XML
Еще
Response.Write "<?xml version=""1.0""coding=""gb2312""?><root></root>"
Конец, если
Конец субтитра
Рем сохраняет полученные данные XML-пакета в файл с именем Acceptxml_date.txt.
Публичная подпрограмма SaveAcceptXmlDataToFile()
Тусклое имя файла,str
имя файла = «acceptxml_» и DateValue (сейчас) и «.txt»
ул = ""
str = str & ""& Now() & vbNewLine
str = str & "--------------------------------------------- --- "& vbNewLine
Если IsObject(m_XmlDocAccept) Тогда
str = str & "<?xml version=""1.0""coding=""gb2312""?>" & vbNewLine
str = str & m_XmlDocAccept.documentElement.XML
Еще
str = str & "<?xml version=""1.0""coding=""gb2312""?>" & vbNewLine & "<root>" & vbNewLine & "</root>"
Конец, если
ул = ул и vbNewLine
str = str & "--------------------------------------------- --- "& vbNewLine
str = str & vbNewLine & vbNewLine & vbNewLine
WriteStringToFile имя файла,str
Конец субтитра
'''''''''''''''''Получите XML-часть и завершите
Rem. Сохраните данные отладки в файл с именем debugnote_date.txt.
Публичная подпрограмма SaveDebugStringToFile(debugstr)
Тусклое имя файла,str
имя_файла = "debugnote_" и DateValue(сейчас) & ".txt"
ул = ""
str = str & ""& Now() & vbNewLine
str = str & "--------------------------------------------- --- "& vbNewLine
str = str & debugstr & vbNewLine
str = str & "--------------------------------------------- --- "
str = str & vbNewLine & vbNewLine & vbNewLine
WriteStringToFile имя файла,str
End Sub
'Открытый метод заканчивается --------------------------
Конечный класс
%>
filemd5fun.asp
<!--#Include File="xmlcls.asp"-->
<%
Рем получает md5 файла, параметром является имя файла.
Функция GetFileMD5(имя файла)
Const Apisysno = "k8n6g2b0m1a6b0f6e8" 'Значение ключа интерфейса должно быть согласованным, чтобы предотвратить незаконное применение интерфейса.
Димксмлклассобдж
Set XmlClassObj = new XmlClass 'Создать объект
XmlClassObj.LoadXmlFromString("<?xml version=""1.0""coding=""gb2312""?><root/>") 'Заполните объект XMLDOC символами XML и используйте его для отправки XML
XmlClassObj.URL = " http://www.shouji138.com/aspnet2/FileMD5.aspx " 'Установите URL-адрес ответа, который должен быть изменен на ваш URL-адрес
Rem-формат xml
Rem "<?xml version="1.0"coding="gb2312"?>
Рем <корень>
Рем <sysno></sysno>
Рем <apiaction></apiaction>
Рем <имя файла></имя файла>
Рем </root>
XmlClassObj.NodeValue "sysno",Apisysno,0,False 'Значение ключа интерфейса для предотвращения нелегального применения
XmlClassObj.NodeValue "apiaction","createfilemd5",0,False 'Действие ответа интерфейса, используемое для определения интерфейса для нескольких целей
XmlClassObj.NodeValue "filename",filename,0,False 'Путь к файлу и имя файла, используйте относительный
путь'XmlClassObj.SaveSendXmlDataToFile() 'Сохраните отправленный пакет базы данных XML в текстовый файл для целей отладки
XmlClassObj.SendHttpData() 'Отправить данные XML
'XmlClassObj.SaveGetXmlDataToFile() 'Сохраняем полученные XML-данные
Результат обработки Rem.
Тусклое сообщение, статус.
status = XmlClassObj.GetSingleNode("//status") 'Отображение статуса, если все в порядке, это означает успех, в противном случае возникает ошибка
message = XmlClassObj.GetSingleNode("//message") 'Отобразить полученное значение MD5. Если статус не в порядке, сообщение является сообщением об ошибке.
Установить XmlClassObj = Ничего
Если статус = «ОК» Тогда
GetFileMD5 = сообщение
Еще
GetFileMD5 = ""
Конец, если
Конечная функция
%>
test.asp
<!--#Include File="filemd5fun.asp"-->
<%
Response.Write "Значение md5 файла web.config:" & GetFileMD5("web.config") & "<br />"
Response.Write "Значение md5 файла files/logo-yy.gif равно:" & GetFileMD5("files/logo-yy.gif") & "<br />"
Response.Write "Значение md5 файла xmlcls.asp:" & GetFileMD5("xmlcls.asp") & "<br />"
%>
Боковой код .net:
MD5.cs
использование системы;
использование System.Collections.Generic;
использование System.Text;
используя пространство имен System.IO
Winsteps.FileMD5
;
{
общественный класс MD5
{
общедоступная статическая строка md5_hash (путь к строке)
{
пытаться
{
FileStream get_file = новый FileStream (путь, FileMode.Open, FileAccess.Read, FileShare.Read);
System.Security.Cryptography.MD5CryptoServiceProvider get_md5 = новый System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] hash_byte = get_md5.ComputeHash(get_file);
строка resule = System.BitConverter.ToString(hash_byte);
resule = resule.Replace("-", "");
вернуть результат;
}
поймать (Исключение e)
{
вернуть электронное сообщение;
}
}
}
}
FileMD5.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="FileMD5.aspx.cs" Inherits="Winsteps.FileMD5.FileMD5" %>
<!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="сервер">
<title>Веб-сайт с мобильной темой: http://www.shouji138.com</title>
</голова>
<тело>
<form id="form1" runat="server">
<дел>
</div>
</форма>
</тело>
</html>
FileMD5.aspx.cs
с использованием системы;
использование System.Data;
использование System.Configuration;
использование System.Collections;
использование System.Web;
использование System.Web.Security;
использование System.Web.UI;
использование System.Web.UI.WebControls;
использование System.Web.UI.WebControls.WebParts;
использование System.Web.UI.HtmlControls
с использованием System.Xml;
используя пространство имен System.Configuration
Winsteps.FileMD5
;
{
общедоступный частичный класс FileMD5: System.Web.UI.Page
{
protected void Page_Load (отправитель объекта, EventArgs e)
{
строка sysno = "11111";
статус строки = «Ложь»;
строковое сообщение = «Неизвестная ошибка»;
строка net2sysno = ConfigurationManager.AppSettings["sysno"];
Документ XmlDocument = новый XmlDocument();
пытаться
{
документ.Загрузка(Запрос.Входной поток);
sysno = doc.SelectSingleNode("//sysno").InnerText.Trim();
если (net2sysno != сисно)
{
message = "Незаконное применение!";
}
еще
{
строка имя_файла = Server.MapPath(doc.SelectSingleNode("//имя_файла").InnerText.Trim());
сообщение = MD5.md5_hash(имя файла);
статус = «ОК»;
}
}
поймать (исключение ex)
{
сообщение = ex.Сообщение;
}
окончательно
{
если (док!= ноль)
документ = ноль;
}
Response.Clear(); //Очистить символы HTML
Response.ContentType = "текст/xml";
Response.Charset = "GB2312";//Если строка xml содержит китайский язык
Response.Write("<?xml version="1.0"coding="GB2312"?>");
Response.Write("<корень>");
Response.Write(" <статус>" + статус + "</статус>");
Response.Write(" <сообщение>" + сообщение + "</сообщение>");
Response.Write("</root>");
Ответ.Конец()
;
}
}
Web.config
<?xml version="1.0"coding="utf-8"?>
<конфигурация>
<Настройки приложения>
<add key="sysno" value="k8n6g2b0m1a6b0f6e8"></add>
</appSettings>
<система.веб>
<httpRuntime ExecutionTimeout="3600" maxRequestLength="1048576"/>
<компиляция debug="true" defaultLanguage="c#" />
<customErrors mode="Выкл." />
<identity impersonate="true"/>
<режим аутентификации="Формы">
<forms name="forums" path="/" loginUrl="Login.aspx" Protection="All" timeout="40">
</формы>
</аутентификация>
<pages validateRequest="false"></pages>
<глобализация requestEncoding="gb2312" responseEncoding="gb2312" Culture="zh-CN" uiCulture="zh-CN"/>
</система.веб>
</конфигурация>
sysno файла web.config должен соответствовать значению Apisysno в файле md5fun.asp. Во время конкретного приложения вам следует изменить этот ключ на свое собственное значение для обеспечения безопасности.
Демонстрационный адрес: http://www.shouji138.com/aspnet2/filemd5.asp
Хотя код длинный, принцип прост. ASP отправляет данные XML в asp.net (xml содержит имя файла md5) -> asp.net получает XML и выполняет md5 для файла -> asp.net возвращает результат. результат передается в asp через xml (xml содержит полученное значение md5) -> asp получает возвращенный xml и анализирует значение md5.
Область применения:
1. При передаче файлов между двумя системами вы можете выполнить файл md5 перед передачей и файл md5 после передачи, чтобы проверить, равны ли два значения. Если они равны, это означает, что они не были изменены в процессе передачи.
2. В системе загрузки, если требуется, чтобы один и тот же файл не мог быть загружен, md5 загруженного файла может быть сохранен в базе данных. Таким образом, если тот же файл будет загружен в следующий раз, md5 будет. то же самое, и в загрузке будет отказано.
3. В поисковых системах и программном обеспечении Xunlei b2b для файла md5 файлы с одинаковым md5 считаются одним и тем же файлом, независимо от того, совпадают ли имена файлов, и файлы могут быть доступны из нескольких источников.
4. Другие приложения. . . . .
2. asp реализует md5 через COM-компоненты (компонент должен быть зарегистрирован на сервере)
, чтобы зарегистрировать компонент md5 файла asp, адрес загрузки: DelphiASPObj.in_path=Server.Mappath("Web.config") 'Путь к файлу
Response.Write «Значение md5 файла web.config:» & DelphiASPObj.get_path_md5 & «<br />»
Установить DelphiASPObj=ничего
%>
3. Сравнение двух способов получения файла md5.
Первый метод — получить md5 файла путем взаимодействия с XML-данными с помощью программы asp.net. Сервер должен поддерживать asp.net. Общие виртуальные хосты предоставляют. среда asp.net, но цена выше;
Второй метод реализуется путем регистрации COM-компонентов, что требует разрешений сервера и больше подходит тем, у кого есть сервер.
Кроме того, первый способ взаимодействия делает ASP более гибким и может использоваться на двух разных серверах для взаимодействия данных, а также может широко использоваться на различных гетерогенных платформах.
4. Чтобы получить адрес загрузки, перейдите на мой веб-сайт и в сеть мобильных тем, чтобы просмотреть демо-версию и загрузить демонстрационный адрес пакета программы: http://www.shouji138.com/aspnet2/filemd5.asp
Загрузка пакета программы: