Exemplarische Vorgehensweise: Verwenden der WCF Exchange Server-E-Mail-Übertragung
Aktualisiert: November 2007
Sie können Anwendungen erstellen, die auf der Windows Communication Foundation (WCF) Exchange Server-E-Mail-Übertragung zum Senden und Empfangen von Nachrichten über bestimmte Ein- und Ausgabekanäle basieren. Dazu verwenden Sie einen Computer, auf dem Microsoft Exchange Server als Vermittler ausgeführt wird. Auf der WCF Exchange Server-E-Mail-Übertragung basierende Anwendungen werden sowohl auf dem Desktop als auch auf Geräten unterstützt.
In dieser exemplarischen Vorgehensweise werden die Features der WCF Exchange Server-E-Mail-Übertragung vorgestellt. Folgende Aufgaben werden behandelt:
Einrichten des Computers
Erstellen der Anwendung für das Gerät (Client)
Erstellen der Anwendung für den Desktop (Server)
Eine vollständige Auflistung des in diesen Verfahren dargestellten Codes finden Sie im Beispielabschnitt am Ende dieser exemplarischen Vorgehensweise.
Hinweis: |
---|
Dieses Beispiel sollte nicht für Produktionscode verwendet werden. |
Vorbereitungsmaßnahmen
Für dieses Beispiel ist .NET Compact Framework Version 3.5 erforderlich.
Einrichten des Computers
In diesem Verfahren stellen Sie sicher, dass Ihre Entwicklungsumgebung ordnungsgemäß zum Ausführen des Beispiels eingerichtet ist.
So richten Sie den Computer zum Ausführen des Beispiels ein
Installieren Sie Windows Mobile Version 5.0 oder das Windows Mobile 6 Software Development Kit (SDK).
Das Windows Mobile 6 Professional SDK umfasst das AUTD-Feature (Always-Up-To-Date) von ActiveSync, das von der E-Mail-Übertragung auf dem Gerät verwendet wird, um den Posteingang aktuell zu halten. Weitere Informationen finden Sie auf der Windows Mobile-Website.
Überprüfen Sie, ob ein E-Mail-Server, auf dem Microsoft Exchange Server 2007 ausgeführt wird, im Netzwerk verfügbar ist.
Wenn Exchange Server 2007 nicht verfügbar ist, können Sie eine Evaluierungsversion verwenden, die unter Virtual PC ausgeführt wird. Weitere Informationen finden Sie auf der Exchange Server-Website.
Stellen Sie sicher, dass Ihr Computer eine Verbindung zum neuen Exchange-E-Mail-Server herstellen kann, indem Sie Outlook Web Access (OWA) auf dem Computer ausführen und eine Verbindung zu einem E-Mail-Konto herstellen.
Stellen Sie sicher, dass Exchange-Webdienste auf dem Exchange-E-Mail-Server aktiviert sind.
Eine Möglichkeit besteht darin, unter Verwendung einer der folgenden URLs auf die Seite exchange.asmx auf dem E-Mail-Server zuzugreifen: http://server-address/ews/exchange.asmx oder https://server-address/ews/exchange.asmx.
Wenn Sie den Emulator verwenden, stellen Sie den Emulator mit Netzwerkfähigkeiten bereit.
Hinweis: Das ActiveSync AUTD-Feature wird nicht ausgeführt, wenn die Netzwerkverbindung über ActiveSync bereitgestellt wird. Sie können Device Emulator 2.0 verwenden, der im Lieferumfang von Windows Mobile 6 Professional SDK enthalten oder als separates Download verfügbar ist, um die NE2000 PCMCIA-Karte durch Konfiguration der Emulatoreigenschaften an einen Hostnetzwerkadapter zu binden.
Nachdem Sie den Emulator in Betrieb genommen haben, konfigurieren Sie ActiveSync für die Kommunikation mit Ihrem Exchange-E-Mail-Server. Weitere Informationen finden Sie unter "Step 5: Configure and Manage Mobile Device Access on the Exchange Server" in Deploying Windows Mobile 6 Powered Devices with Microsoft Exchange Server 2007 auf der Microsoft TechNet-Website.
Erstellen der Anwendung für das Gerät
In diesem Verfahren erstellen Sie eine Anwendung für das Gerät, das als Client fungiert, und verfassen und senden dann mithilfe der E-Mail-Übertragung eine Nachricht an den Server.
So erstellen Sie die Anwendung für das Gerät
Erstellen Sie ein neues Projekt für intelligente Geräte in Visual Studio.
Fügen Sie dem Projekt die folgenden Verweise hinzu:
Microsoft.ServiceModel.Mail.dll
Microsoft.ServiceModel.Mail.WindowsMobile.dll
System.ServiceModel.dll
System.Runtime.Serialization.dll
Fügen Sie die CFMessagingSerializer-Klasse hinzu, die in Gewusst wie: Serialisieren von Meldungen in WCF-Anwendungen beschrieben wird.
Auf dem Desktop können Sie zum Erstellen serialisierter Daten entweder ein benutzerdefiniertes Serialisierungsprogramm oder Attribute verwenden. Es wird jedoch empfohlen, dass Sie für das Gerät und den Desktop dasselbe Serialisierungsprogramm verwenden.
Erstellen Sie die Nachricht.
Dim str As String = "Hello"
String str = "Hello";
Erstellen Sie die Nachricht, und serialisieren Sie sie.
' Create the message. Dim serializer As New CFMessagingSerializer(GetType(String)) Dim m As Message = Message.CreateMessage(MessageVersion.Soap12WSAddressing10, "urn:test", str, serializer)
// Create the message. CFMessagingSerializer serializer = new CFMessagingSerializer(typeof(string)); Message m = Message.CreateMessage(MessageVersion.Soap12WSAddressing10, "urn:test", str, serializer);
Erstellen Sie Variablen zur Darstellung des Kanalnamens, der Geräte-E-Mail-Adresse und der Server-E-Mail-Adresse.
Dim channelName As String = "StoreandFowardMessageHelloWorld" Dim serverAddress As String = "ServerMailAddress@fabrikam.com" Dim clientAddress As String = "DeviceMailAddress@fabrikam.com"
string channelName = "StoreandFowardMessageHelloWorld"; string serverAddress = "ServerMailAddress@fabrikam.com"; string clientAddress = "DeviceMailAddress@fabrikam.com";
Erstellen Sie den Ausgabekanal.
' Build the output channel. Dim binding As New WindowsMobileMailBinding() Dim parameters As New BindingParameterCollection() Dim channelFactory As IChannelFactory(Of IOutputChannel) channelFactory = binding.BuildChannelFactory(Of IOutputChannel)(parameters) channelFactory.Open() Dim outChannel As IOutputChannel = channelFactory.CreateChannel(New EndpointAddress(MailUriHelper.Create(channelName, serverAddress))) outChannel.Open()
// Build the output channel. WindowsMobileMailBinding binding = new WindowsMobileMailBinding(); BindingParameterCollection parameters = new BindingParameterCollection(); IChannelFactory<IOutputChannel> channelFactory = binding.BuildChannelFactory<IOutputChannel>(parameters); channelFactory.Open(); IOutputChannel outChannel = channelFactory.CreateChannel(new EndpointAddress(MailUriHelper.Create(channelName,serverAddress))); outChannel.Open();
Fügen Sie Code zum Senden der Nachricht hinzu.
' Send the message. outChannel.Send(m)
// Send the message. outChannel.Send(m);
Erstellen Sie einen Listener, und fügen Sie Code zum Überwachen der Antwort hinzu.
Die Codeausführung wird vom Listener blockiert. Deshalb wird empfohlen, den Listener in einem separaten Thread des Produktionscodes auszuführen. Fügen Sie den Listenercode in diesem Beispiel nach dem Absendercode hinzu.
' Listen for the response. Dim listener As IChannelListener(Of IInputChannel) listener = binding.BuildChannelListener(Of IInputChannel)(MailUriHelper.CreateUri(channelName, clientAddress)) listener.Open() Dim inputChannel As IInputChannel = listener.AcceptChannel() inputChannel.Open() Dim reply As Message = inputChannel.Receive()
// Listen for the response. IChannelListener<IInputChannel> listener = binding.BuildChannelListener<IInputChannel>(MailUriHelper.CreateUri(channelName,clientAddress),parameters); listener.Open(); IInputChannel inputChannel = listener.AcceptChannel(); inputChannel.Open(); Message reply = inputChannel.Receive();
Sobald eine Antwort vom Server empfangen wird, deserialisieren Sie sie und geben dem Benutzer das Ergebnis bekannt.
' When you receive a response, deserialize the message. str = reply.GetBody(Of String)(serializer) MessageBox.Show(str, "Received message")
// When you receive a response, deserialize the message. str = reply.GetBody<string>(serializer); MessageBox.Show(str, "Received message");
Führen Sie eine Bereinigung durch.
outChannel.Close() channelFactory.Close() listener.Close() inputChannel.Close() binding.Close()
outChannel.Close(); channelFactory.Close(); listener.Close(); inputChannel.Close(); binding.Close();
Erstellen Sie die Clientanwendung, und stellen Sie sie auf dem Emulator oder Gerät bereit, die Sie für die Synchronisation mit dem Exchange-E-Mail-Server konfiguriert haben.
Erstellen der Anwendung für den Desktop
In diesem Verfahren erstellen Sie eine Anwendung für einen Desktopcomputer, durch die der in diesem Beispiel verwendete Server dargestellt wird. Der Server verarbeitet eine Nachricht vom Client, fügt sie an und sendet sie an den Client zurück.
So erstellen Sie die Anwendung für den Desktop
Erstellen Sie eine neue Windows-Konsolenanwendung.
Fügen Sie dem Projekt die folgenden Verweise hinzu:
Microsoft.ServiceModel.Mail.dll
Microsoft.ServiceModel.Channels.Mail.ExchangeWebService.dll
System.ServiceModel.dll
System.Runtime.Serialization.dll
Fügen Sie die CFMessagingSerializer-Klasse hinzu, die in Gewusst wie: Serialisieren von Meldungen in WCF-Anwendungen beschrieben wird.
Erstellen Sie einige Variablen, von denen manche den Werten aus dem Geräteprojekt entsprechen müssen.
' Set some global variables. Dim channelName As String = "StoreandFowardMessageHelloWorld" Dim serverAddress As String = "ServerMailAddress@fabrikam.com" Dim serverPWD As String = "MyPassword" Dim clientAddress As String = "DeviceMailAddress@fabrikam.com" Dim exchangeServerLocation As String = "http://fabrikam"
// Set some global variables. string channelName = "StoreandFowardMessageHelloWorld"; string serverAddress = "ServerMailAddress@fabrikam.com"; string serverPWD = "MyPassword"; string clientAddress = "DeviceMailAddress@fabrikam.com"; string exchangeServerLocation = "http://fabrikam";
Erstellen Sie den Listener.
Wenn Sie Windows-Anmeldeinformationen verwenden, übergeben Sie einen Nullwert als zweites Argument an das ExchangeWebServiceMailBinding-Objekt. Wie auf dem Gerät wird die Codeausführung vom Eingabekanal blockiert. Deshalb wird empfohlen, einen neuen Thread für jeden Listener im Produktionscode zu erstellen.
' Create the listener. If you are using Windows credentials, ' pass a null value as the second argument to the ExchangeWebServiceMailBinding. Dim binding As MailBindingBase binding = New ExchangeWebServiceMailBinding(New Uri(exchangeServerLocation), New System.Net.NetworkCredential(serverAddress, serverPWD)) Dim parameters As New BindingParameterCollection() Dim listener As IChannelListener(Of IInputChannel) listener = binding.BuildChannelListener(Of IInputChannel)(MailUriHelper.CreateUri(channelName, serverAddress)) listener.Open() Dim inputChannel As IInputChannel = listener.AcceptChannel() inputChannel.Open() Dim reply As Message = inputChannel.Receive() Dim serializer As New CFMessagingSerializer(GetType(String)) Dim str As String = "" str = reply.GetBody(Of String)(serializer)
// Create the listener. If you are using Windows credentials, // pass a null value as the second argument to the ExchangeWebServiceMailBinding. MailBindingBase binding = new ExchangeWebServiceMailBinding(new Uri(exchangeServerLocation), new System.Net.NetworkCredential(serverAddress, serverPWD)); BindingParameterCollection parameters = new BindingParameterCollection(); IChannelListener<IInputChannel> listener = binding.BuildChannelListener<IInputChannel> (MailUriHelper.CreateUri(channelName, serverAddress), parameters); listener.Open(); IInputChannel inputChannel = listener.AcceptChannel(); inputChannel.Open(); Message reply = inputChannel.Receive(); CFMessagingSerializer serializer = new CFMessagingSerializer(typeof(string)); string str = ""; str = reply.GetBody<string>(serializer);
Fügen Sie Code zur Verarbeitung der Nachricht hinzu.
' Process the message. str += ", World!"
// Process the message. str += ", World!";
Fügen Sie Code zum Senden der Antwort über den Ausgabekanal hinzu.
' Send the response through an output channel. Dim m As Message = Message.CreateMessage(MessageVersion.Soap12WSAddressing10, "urn:test", str, serializer) Dim channelFactory As IChannelFactory(Of IOutputChannel) channelFactory = binding.BuildChannelFactory(Of IOutputChannel)(parameters) channelFactory.Open() Dim outChannel As IOutputChannel = channelFactory.CreateChannel(New EndpointAddress(MailUriHelper.CreateUri(channelName, clientAddress))) outChannel.Open() outChannel.Send(m)
// Send the response through an output channel. Message m = Message.CreateMessage(MessageVersion.Soap12WSAddressing10, "urn:test", str, serializer); IChannelFactory<IOutputChannel> channelFactory = binding.BuildChannelFactory<IOutputChannel>(parameters); channelFactory.Open(); IOutputChannel outChannel = channelFactory.CreateChannel(new EndpointAddress( MailUriHelper.CreateUri(channelName, clientAddress))); outChannel.Open(); outChannel.Send(m);
Führen Sie eine Bereinigung durch.
' Clean up. outChannel.Close() channelFactory.Close() listener.Close() inputChannel.Close() binding.Close()
// Clean up. outChannel.Close(); channelFactory.Close(); listener.Close(); inputChannel.Close(); binding.Close();
Erstellen Sie das Projekt, und starten Sie die Serveranwendung.
Starten Sie die Clientanwendung auf dem Emulator oder Gerät.
Beispiel
Beschreibung
In den folgenden umfassenden Beispielen wird veranschaulicht, wie Nachrichten mithilfe der WCF Exchange Server-E-Mail-Übertragung gesendet und empfangen werden.
Vollständige Codeliste für das Gerät (Client)
Dim str As String = "Hello"
' Create the message.
Dim serializer As New CFMessagingSerializer(GetType(String))
Dim m As Message = Message.CreateMessage(MessageVersion.Soap12WSAddressing10, "urn:test", str, serializer)
Dim channelName As String = "StoreandFowardMessageHelloWorld"
Dim serverAddress As String = "ServerMailAddress@fabrikam.com"
Dim clientAddress As String = "DeviceMailAddress@fabrikam.com"
' Build the output channel.
Dim binding As New WindowsMobileMailBinding()
Dim parameters As New BindingParameterCollection()
Dim channelFactory As IChannelFactory(Of IOutputChannel)
channelFactory = binding.BuildChannelFactory(Of IOutputChannel)(parameters)
channelFactory.Open()
Dim outChannel As IOutputChannel = channelFactory.CreateChannel(New EndpointAddress(MailUriHelper.Create(channelName, serverAddress)))
outChannel.Open()
' Send the message.
outChannel.Send(m)
' Listen for the response.
Dim listener As IChannelListener(Of IInputChannel)
listener = binding.BuildChannelListener(Of IInputChannel)(MailUriHelper.CreateUri(channelName, clientAddress))
listener.Open()
Dim inputChannel As IInputChannel = listener.AcceptChannel()
inputChannel.Open()
Dim reply As Message = inputChannel.Receive()
' When you receive a response, deserialize the message.
str = reply.GetBody(Of String)(serializer)
MessageBox.Show(str, "Received message")
outChannel.Close()
channelFactory.Close()
listener.Close()
inputChannel.Close()
binding.Close()
End Sub
End Class
static void Main()
{
String str = "Hello";
// Create the message.
CFMessagingSerializer serializer = new CFMessagingSerializer(typeof(string));
Message m = Message.CreateMessage(MessageVersion.Soap12WSAddressing10, "urn:test", str, serializer);
string channelName = "StoreandFowardMessageHelloWorld";
string serverAddress = "ServerMailAddress@fabrikam.com";
string clientAddress = "DeviceMailAddress@fabrikam.com";
// Build the output channel.
WindowsMobileMailBinding binding = new WindowsMobileMailBinding();
BindingParameterCollection parameters = new BindingParameterCollection();
IChannelFactory<IOutputChannel> channelFactory = binding.BuildChannelFactory<IOutputChannel>(parameters);
channelFactory.Open();
IOutputChannel outChannel = channelFactory.CreateChannel(new EndpointAddress(MailUriHelper.Create(channelName,serverAddress)));
outChannel.Open();
// Send the message.
outChannel.Send(m);
// Listen for the response.
IChannelListener<IInputChannel> listener = binding.BuildChannelListener<IInputChannel>(MailUriHelper.CreateUri(channelName,clientAddress),parameters);
listener.Open();
IInputChannel inputChannel = listener.AcceptChannel();
inputChannel.Open();
Message reply = inputChannel.Receive();
// When you receive a response, deserialize the message.
str = reply.GetBody<string>(serializer);
MessageBox.Show(str, "Received message");
outChannel.Close();
channelFactory.Close();
listener.Close();
inputChannel.Close();
binding.Close();
}
Vollständige Codeliste für den Desktop (Server)
' Set some global variables.
Dim channelName As String = "StoreandFowardMessageHelloWorld"
Dim serverAddress As String = "ServerMailAddress@fabrikam.com"
Dim serverPWD As String = "MyPassword"
Dim clientAddress As String = "DeviceMailAddress@fabrikam.com"
Dim exchangeServerLocation As String = "http://fabrikam"
' Create the listener. If you are using Windows credentials,
' pass a null value as the second argument to the ExchangeWebServiceMailBinding.
Dim binding As MailBindingBase
binding = New ExchangeWebServiceMailBinding(New Uri(exchangeServerLocation), New System.Net.NetworkCredential(serverAddress, serverPWD))
Dim parameters As New BindingParameterCollection()
Dim listener As IChannelListener(Of IInputChannel)
listener = binding.BuildChannelListener(Of IInputChannel)(MailUriHelper.CreateUri(channelName, serverAddress))
listener.Open()
Dim inputChannel As IInputChannel = listener.AcceptChannel()
inputChannel.Open()
Dim reply As Message = inputChannel.Receive()
Dim serializer As New CFMessagingSerializer(GetType(String))
Dim str As String = ""
str = reply.GetBody(Of String)(serializer)
' Process the message.
str += ", World!"
' Send the response through an output channel.
Dim m As Message = Message.CreateMessage(MessageVersion.Soap12WSAddressing10, "urn:test", str, serializer)
Dim channelFactory As IChannelFactory(Of IOutputChannel)
channelFactory = binding.BuildChannelFactory(Of IOutputChannel)(parameters)
channelFactory.Open()
Dim outChannel As IOutputChannel = channelFactory.CreateChannel(New EndpointAddress(MailUriHelper.CreateUri(channelName, clientAddress)))
outChannel.Open()
outChannel.Send(m)
' Clean up.
outChannel.Close()
channelFactory.Close()
listener.Close()
inputChannel.Close()
binding.Close()
End Sub
End Class
static void Main()
{
// Set some global variables.
string channelName = "StoreandFowardMessageHelloWorld";
string serverAddress = "ServerMailAddress@fabrikam.com";
string serverPWD = "MyPassword";
string clientAddress = "DeviceMailAddress@fabrikam.com";
string exchangeServerLocation = "http://fabrikam";
// Create the listener. If you are using Windows credentials,
// pass a null value as the second argument to the ExchangeWebServiceMailBinding.
MailBindingBase binding = new ExchangeWebServiceMailBinding(new Uri(exchangeServerLocation),
new System.Net.NetworkCredential(serverAddress, serverPWD));
BindingParameterCollection parameters = new BindingParameterCollection();
IChannelListener<IInputChannel> listener = binding.BuildChannelListener<IInputChannel>
(MailUriHelper.CreateUri(channelName, serverAddress), parameters);
listener.Open();
IInputChannel inputChannel = listener.AcceptChannel();
inputChannel.Open();
Message reply = inputChannel.Receive();
CFMessagingSerializer serializer = new CFMessagingSerializer(typeof(string));
string str = "";
str = reply.GetBody<string>(serializer);
// Process the message.
str += ", World!";
// Send the response through an output channel.
Message m = Message.CreateMessage(MessageVersion.Soap12WSAddressing10, "urn:test", str, serializer);
IChannelFactory<IOutputChannel> channelFactory = binding.BuildChannelFactory<IOutputChannel>(parameters);
channelFactory.Open();
IOutputChannel outChannel = channelFactory.CreateChannel(new EndpointAddress(
MailUriHelper.CreateUri(channelName, clientAddress)));
outChannel.Open();
outChannel.Send(m);
// Clean up.
outChannel.Close();
channelFactory.Close();
listener.Close();
inputChannel.Close();
binding.Close();
}
Kompilieren des Codes
Für das auf dem Gerät ausgeführte Beispiel sind Verweise auf folgende Namespaces erforderlich:
Für das auf dem Desktop ausgeführte Beispiel sind Verweise auf folgende Namespaces erforderlich:
Sicherheit
Die Sicherheit für die E-Mail-Übertragung ist in diesem Beispiel nicht aktiviert. Weitere Informationen finden Sie unter WCF Exchange Server-E-Mail-Übertragung.
Siehe auch
Aufgaben
Gewusst wie: Verwenden von Meldungssicherheit mit der WCF Exchange Server-E-Mail-Übertragung
Weitere Ressourcen
Windows Communication Foundation (WCF)-Entwicklung und .NET Compact Framework