Обзор разработки системы обмена сообщениями для мобильных устройств
Дата последнего изменения: 14 апреля 2010 г.
Применимо к: SharePoint Foundation 2010
В данном разделе предоставляется обзор добавления функциональности мобильных сообщений в проект разработки Microsoft SharePoint Foundation с использованием интерфейсов API для мобильных сообщений из SharePoint Foundation SDK. Эти интерфейсы API полезно разделить на две широкие группы: поддерживающие SMS-сообщения с помощью протокола связи OMS и позволяющие создать поддержку других протоколов связи или структуры сообщений. В большинстве сценариев разработки отправителем сообщений является веб-приложение SharePoint Foundation, в противоположность отдельному пользователю, поэтому развертыванию SharePoint Foundation потребуется учетная запись оператора мобильной связи (MSP), которая поддерживает протокол связи, используемый в решении.
Протокол OMS является протоколом связи, предоставляющим реализацию протоколов структуры сообщений SMS и MMS. Протокол OMS требует протокола SOAP для доступа веб-служб. Интерфейсы API, поддерживающие протокол OMS, описанные в разделе Решения обмена SMS-сообщениями на основе протокола OMS ниже, разработаны для обмена SMS-сообщениями. Все классы и члены, которые можно найти в пространстве имен Microsoft.SharePoint.MobileMessage с обозначением "MMS" в имени или которые имеют значение только в контексте обмена MMS-сообщениями, предназначены только для внутреннего использования и не должны вызываться из кода. Чтобы разработать решения обмена сообщениями, не использующие протокол OMS в качестве протокола связи или использующие протокол OMS для MMS-сообщений, используйте более абстрактный уровень интерфейсов API, описанный в разделе Разработка для других протоколов ниже.
Решения обмена SMS-сообщениями на основе протокола OMS
SharePoint Foundation предоставляет интерфейсы API, которые выполняют все вызовы веб-методов протокола OMS, весь анализ XML-кода и его запись. В создаваемом коде необходимо просто вызвать интерфейсы API в знакомом объектно-ориентированном синтаксисе.
Создание учетной записи оператора мобильной связи для веб-приложения
Каждое веб-приложение SharePoint Foundation, включая веб-приложение центра администрирования, может иметь учетную запись оператора мобильной связи. Обычно эти учетные записи задаются администратором фермы в разделе управления приложениями в центре администрирования. Однако можно программно создать учетную запись и назначить ее веб-приложению. Вначале вызовите конструктор SPMobileMessagingAccount(), не требующий параметр SPMobileMessageServiceProvider. Затем вызовите метод UpdateSmsAccount(SPMobileMessagingAccount) для назначения учетной записи веб-приложению. В следующем фрагменте кода webApp — это ссылка на объект SPWebApplication. (Дополнительные сведения о том, как получить ссылку на такой объект см. в разделе Получение ссылок на сайты, веб-приложения и другие ключевые объекты.) В данном фрагменте кода подразумевается, что файл имеет инструкции using для Microsoft.SharePoint и System.Security. Обратите внимание, что вызов UpdateSmsAccount(SPMobileMessagingAccount) передается в виде части анонимного делегата методу RunWithElevatedPrivileges(SPSecurity.CodeToRunElevated).
SecureString password = new SecureString();
password.AppendChar(‘a’);
password.AppendChar(‘Z’);
password.AppendChar(‘3’);
password.AppendChar(‘&’);
SPMobileMessagingAccount account = new SPMobileMessagingAccount("Contoso Messaging",
"https://contoso.com/services/mobilemessages",
"BobG",
password);
SPSecurity.RunWithElevatedPrivileges(delegate() {webApp.UpdateSmsAccount(account);
webApp.Update();});
Dim password As New SecureString()
password.AppendChar("a")
password.AppendChar("z")
password.AppendChar("3")
password.AppendChar("&")
Dim account As New SPMobileMessagingAccount("Contoso Messaging", "https://contoso.com/services/mobilemessages", "BobG", password)
SPSecurity.RunWithElevatedPrivileges(Sub()
webApp.UpdateSmsAccount(account)
webApp.Update()
End Sub)
После назначения веб-приложению учетной записи оператора мобильной связи разрабатываемый код может использовать свойство OutboundSmsServiceAccount в качестве ссылки на объект учетной записи веб-приложения.
Создание объекта веб-службы
Если имеется SPMobileMessagingAccount, код может использовать ее для создания объекта SPMobileMessageWebService, содержащего методы для отправки SMS-сообщений. Рекомендуется, где бы ни была получена ссылка на существующий объект SPMobileMessagingAccount, всегда проверять, что это не null и что ее свойство IsValidAccount() имеет значение true. В следующем фрагменте кода иллюстрируется создание объекта веб-службы. webApp — это ссылка на объект SPWebApplication.
SPMobileMessagingAccount account = webApp.OutboundSmsServiceAccount;
if (account == null || !account.IsValidAccount())
{
throw new SPException("The account passed in is invalid.");
}
else
{
SPMobileMessageWebService messagingWebService = new SPMobileMessageWebService(account);
}
Dim account As SPMobileMessagingAccount = webApp.OutboundSmsServiceAccount
If account Is Nothing OrElse (Not account.IsValidAccount()) Then
Throw New SPException("The account passed in is invalid.")
Else
Dim messagingWebService As New SPMobileMessageWebService(account)
End If
Создание и отправка мобильного сообщения
Следующие две важные задачи — создание и отправка сообщения.
Создание сообщения
С помощью объекта SPMobileMessageWebService код может вызывать веб-методы протокола OMS службы, используя методы объекта и прокси-серверов. Наиболее важное здесь, конечно, — метод SendMessage(String). Однако перед вызовом его код должен создать сообщения. Существует три способа сделать это.
Код может вызвать статический метод BuildSmsMessage(SPMobileMessagingAccount, String, String) и передать ему параметры учетной записи отправителя, параметры получателя и текст сообщения. Это простейший, но наименее гибкий способ.
Код может вызвать один из перегруженных методов SetTextContent(). Для этого может потребоваться сначала создать SPMobileMessageSmsBuilder и добавить получателей с помощью вызовов метода AddRecipient(String), а также преобразовать сообщение из объекта SPMobileSmsMessage, создаваемого SetTextContent(), в подходящий XML-код сообщения протокола OMS. Но этот способ создания сообщения предоставляет возможность иметь несколько получателей. Он позволяет также задать меньший порог числа дочерних страниц, чем порог, задаваемый поставщиком услуг (ContentParts), на который разбивается сообщение в случае превышения предела количества знаков, накладываемого службой.
Код может создать транзакцию создания сообщения. Такая транзакция состоит из следующих элементов:
вызов StartTextMessage();
один или несколько вызовов AddChunk(String);
вызов одного из перегруженных методов EndTextMessage().
Этот способ создания сообщения дает все возможности и все сложности, как и предыдущий способ, но также предоставляет больший контроль над разделением сообщения на страницы, а также дополнительные возможности, такие как добавление номеров страниц.
Вне зависимости от используемого метода, если сообщение превышает предел на число символов, задаваемый поставщиком услуг, алгоритм создания сообщения будет пытаться разделить сообщение на несколько, разделяя сообщение по "блокам" текста. Блок текста — это строка символов, которые должны быть вместе в одном сообщении, если это возможно. В результате будет сформированы серии сообщений, более понятные, чем если родительское сообщение будет разбиваться на одинаковые, но случайно разделенные, части. Если определенный блок сам по себе превышает предел символов, он будет разделен в любом случае. Только третий способ создания сообщения позволяет коду иметь некоторый контроль над разделением сообщений на блоки. В следующем фрагменте кода иллюстрируется третий способ. Обратите внимание на следующие аспекты этого примера:
account — это ссылка на объект SPMobileMessagingAccount.
Хотя существует только один вызов AddRecipient(String), можно выполнить его несколько раз, чтобы передать то же сообщение нескольким получателям, до предела, накладываемого оператором мобильной связи.
SplitLongMessage определен в следующем блоке кода ниже.
message — это объект String, содержащий сообщение.
После завершения транзакции построения сообщения объект SPMobileMessageSmsBuilder содержит сообщение в своем свойстве Message.
SPMobileMessageSmsBuilder smsBuilder = new SPMobileMessageSmsBuilder(account);
smsBuilder.AddRecipient(mobile_telephone_number);
// Begin the message building transaction
smsBuilder.StartTextMessage();
// Add the message text, split as needed into chunks.
List<StringBuilder> messageParts = SplitLongMessage(message)
foreach (StringBuilder chunk in messageParts)
{
smsBuilder.AddChunk(chunk.ToString());
}
// Finish the transaction
smsBuilder.EndTextMessage();
// At this point, the smsBuilder.Message property holds the message as an SPMobileSmsMessage object.
Dim smsBuilder As New SPMobileMessageSmsBuilder(account)
smsBuilder.AddRecipient(mobile_telephone_number)
' Begin the message building transaction
smsBuilder.StartTextMessage()
' Add the message text, split as needed into chunks.
Dim messageParts As List(Of StringBuilder) = SplitLongMessage(message)
For Each chunk As StringBuilder In messageParts
smsBuilder.AddChunk(chunk.ToString())
Next
' Finish the transaction
smsBuilder.EndTextMessage()
' At this point, the smsBuilder.Message property holds the message as an SPMobileSmsMessage object
Метод SplitLongMessage реализует простой алгоритм для обеспечения того, чтобы никакой из блоков сообщения не превышал предела для SMS-сообщений в 133 символа (однобайтовых) для каждого блока составного SMS-сообщения, иногда называемого "длинным SMS-сообщением". Также он обеспечивает разделение только по пробелам, чтобы не было разделения слова между частями сообщения. Более сложный алгоритм может потребоваться, если имеющееся решение обмена мобильными сообщениями не может ограничиться только однобайтовыми символами в сообщении.
public static List<StringBuilder> SplitLongMessage(String message)
{
// Split the original message at white space.
String[] words = message.Split(null);
List<StringBuilder> chunks = new List<StringBuilder>();
StringBuilder latestChunk = new StringBuilder(132);
// Reconstruct the message in chunks of up to 133 characters.
foreach (String word in words)
{
if (word.Length + latestChunk.Length <= 132) //Not 133 because a space will be added
{
latestChunk.Append(word + " "); // Add back the white space
}
else
{
// Add a copy of the chunk to the list
chunks.Add(new StringBuilder(latestChunk.ToString()));
// Empty out latest chunk so the next one can be started
latestChunk.Remove(0, latestChunk.Length);
// The word that exceeded the limit becomes the first word of the next chunk
latestChunk.Append(word + " ");
}
}
// Add the last short chunk
if (latestChunk.Length > 0)
{
chunks.Add(latestChunk);
}
return chunks;
}
Public Shared Function SplitLongMessage(ByVal message As String) As List(Of StringBuilder)
' Split the original message at white space.
Dim words() As String = message.Split(Nothing)
Dim chunks As New List(Of StringBuilder)()
Dim latestChunk As New StringBuilder(132)
' Reconstruct the message in chunks of up to 133 characters.
For Each word As String In words
If word.Length + latestChunk.Length <= 132 Then 'Not 133 because a space will be added
latestChunk.Append(word & " ") ' Add back the white space
Else
' Add a copy of the chunk to the list
chunks.Add(New StringBuilder(latestChunk.ToString()))
' Empty out latest chunk so the next one can be started
latestChunk.Remove(0, latestChunk.Length)
' The word that exceeded the limit becomes the first word of the next chunk
latestChunk.Append(word & " ")
End If
Next word
' Add the last short chunk
If latestChunk.Length > 0 Then
chunks.Add(latestChunk)
End If
Return chunks
End Function
Вне зависимости от того, создается ли объект SPMobileSmsMessage (на который есть ссылка в свойстве SPMobileMessageBuilder.Message) с помощью вызова SetTextContent() или с помощью транзакции построения сообщения, разрабатываемый код должен преобразовать этот объект в подходящий XML-код протокола OMS. Это осуществляется вызовом метода GetMessageXml(). Этот дополнительный шаг записи XML-кода не требуется, если сообщение создается с помощью вызова метода BuildSmsMessage(SPMobileMessagingAccount, String, String), так как он возвращает XML-код сообщения.
String messageXml = smsBuilder.GetMessageXml();
Dim messageXml As String = smsBuilder.GetMessageXml()
Отправка сообщения
Сообщение отправляется посредством передачи законченного, совместимого с протоколом OMS XML-кода методу SendMessage(String) объекта SPMobileMessageWebService. Сведения о создании такого объекта см. в разделе Создание объекта веб-службы выше. В следующем фрагменте кода messagingWebService — это объект SPMobileMessageWebService, а messageXml — это законченное совместимое с протоколом OMS сообщение.
SPMobileMessageDeliveryReport report = messagingWebService.SendMessage(messageXml);
Dim report As SPMobileMessageDeliveryReport = messagingWebService.SendMessage(messageXml)
Отчет, возвращаемый методом SendMessage(String), содержит данные об успешности отправки сообщения и, если сообщение не было отправлено, — причины этого. Рекомендуется включить код, обрабатывающий отчет, записывающий в журнал успешные сообщения и отвечающий на ошибки. Дополнительные сведения о структуре отчета см. в разделе SPMobileMessageDeliveryReport.
Отправка пакетов сообщений
Если в решении используется пакетная отправка, коду необходимо сохранять сообщения, созданные между пакетными заданиями, в некоторой структуре очереди, которая может быть очищена после отправки пакета, такой как List<T><SPMobileSmsMessage>. Пакетное задание начинается с создания объекта SPMobileMessageBatchPackage, к которому добавляется каждый объект сообщения. Затем пакет передается методу BatchSendMessages(SPMobileMessageBatchPackage).
В фрагменте кода ниже messageCollection — это объект List<T><SPMobileSmsMessage>, а messagingWebService — это объект SPMobileMessageWebService. Сведения о создании такого объекта см. в разделе Создание объекта веб-службы выше.
SPMobileMessageBatchPackage package = new SPMobileMessageBatchPackage();
foreach (SPMobileSmsMessage message in messageCollection)
{
package.AddMessage(message);
}
List<SPMobileMessageDeliveryReport> reports = messagingWebService.BatchSendMessages(package);
Dim package As New SPMobileMessageBatchPackage()
For Each message As SPMobileSmsMessage In messageCollection
package.AddMessage(message)
Next message
Dim reports As List(Of SPMobileMessageDeliveryReport) = messagingWebService.BatchSendMessages(package)
Обратите внимание, что нет необходимости явно преобразовывать объекты SPMobileSmsMessage, находящиеся в пакете, в XML-сообщения, совместимые с протоколом OMS. Пакет возвращает XML-разметку всего пакетного задания в свойстве Xml. Эта XML-разметка отправляется методом BatchSendMessages(SPMobileMessageBatchPackage) в веб-службу обмена сообщениями.
Рекомендуется включить код, который обрабатывает список отчетов, возвращаемых методом BatchSendMessages(SPMobileMessageBatchPackage), записывает в журнал успешные сообщения и отвечает на ошибки.
Другие методы веб-службы
Класс SPMobileMessageWebService имеет два других метода: GetUserInfo(String) и GetServiceInfo(), которые действуют в качестве прокси-серверов для веб-методов протокола OMS GetUserInfo и GetServiceInfo соответственно.
Разработка для других протоколов
Корпорация Майкрософт не поддерживает создание производных от каких-либо классов в Microsoft.SharePoint.MobileMessage, чтобы создать решение обмена мобильными сообщениями, не использующее протокол OMS. Если требуется работа решения с таким оператором связи, который не использует протокол OMS, рассмотрите возможность создания веб-службы, которая работает как промежуточный слой между интерфейсами API обмена мобильными сообщениями SharePoint Foundation и оператором мобильной связи, использующим другой протокол. Служба может принимать сообщения в протоколе OMS от SharePoint Foundation и преобразовывать их в сообщения, подходящие для оператора мобильной связи, использующего другой протокол.