Archiv | WCF RSS for this section

HttpWebRequest und Tombstoning in WP7

Für eine aktuelle App muss ich mit Webservices arbeiten, und es ist schon echt sportlich das Handling mit mehreren Webservice Aufrufen. Aber wo es wirklich schwierig ist, Wenn mitten in der Abfrage auch noch Tombstoning und Application Switching unterstützt wird wird es echt kompliziert. Aber habe einen Lösungsansatz gefunden.

catch (WebException e) { if (e.Status == WebExceptionStatus.RequestCanceled) 
MessageBox.Show("Looks like your request was interrupted by tombstoning"); 
else { using (HttpWebResponse response = (HttpWebResponse)e.Response) 
{ MessageBox.Show("I got an http error of: " + response.StatusCode.ToString()); } } }

Abb.: try catch an wird auf WebException geprüft

Durch diese Fehlerbehandlung ist es möglich die Oberfläche zu informieren was passiert ist.Es sieht einfach aus aber Trick liegt eben im Detail.

Quelle:

HttpWebRequest (WebClient) And Tombstoning in Windows Phone 7

Die Wolke liefert Daten

Für zukünftige Aktivitäten im Business Bereich bietet Microsoft ja SQL Azure auf seiner Cloud Windows Azure an. Seit einer gewissen Zeit arbeite ich mich so ein wenig dort ein. Jetzt habe ich gestern einen Post gefunden wie man die Datenhaltung aufbaut in Verbindung mit WP7.

image

Abb.: Datenhaltung SQL Azure nach WP7

In einer Step für Step Anleitung wird vom Service Contract über den Service hin zur fertigen Anwendung alles ausführlich beschrieben. Der Transfer geht über JSON DTO Service. Es ist wirklich nicht so schwer dieses zuverstehen. Hier noch ein paar Zeilen Code:
using System.Runtime.Serialization;

namespace RESTJSONStudentsData
{
[DataContract]
public class PersonDTO
{
[DataMember]
public string StudentId { get; set; }
[DataMember]
public string FirstName { get; set; }
[DataMember]
public string LastName { get; set; }

}
}

Abb.: Data Contract

Und jetzt nich die WCF Verbindung kurz beschrieben:
using System.Collections.Generic;
using System.ServiceModel;
using System.ServiceModel.Web;

namespace RESTJSONStudentsData
{
[ServiceContract]
public interface IService1
{
[OperationContract]
[WebGet(UriTemplate=“/Persons“,
RequestFormat=WebMessageFormat.Json,
ResponseFormat=WebMessageFormat.Json]
List<PersonDTO> GetPersons();
}
}

Hier sollte hervorgehoben werden die Json Format Einstellungen. Diese können dann ganz einfach per DataContractJsonSerializer konvertiert werden. So ist es echt einfach geworden.

Quelle:

Data from Cloud on Windows Phone

 

Splash Screen mit ProgressBar und Backroundworker

hat auf seinem Blog debug mode….. einen Post erstellt, mit einem Designvorschlag für einen Splash Screen mit ProgressBar. Diese Vorgehensweise erlaubt es dem Entwickler seine benötigten Daten für die App geschickt zu verstecken und somit den User nicht nervt mit ständigen Nachladen von Daten. Diese vorgehensweise ist meist aber nur sinnvoll wenn es sich um eine Online App handelt.

image

Abb.: Aufbau des Design Vorschlags

Der Aufbau ist als Usercontrol implementiert, und recht einfach nachvollziehbar.

<Grid x:Name=“LayoutRoot“ Height=“800″ Width=“640″>
<Image Source=“waitsymbol.jpg“
Margin=“0,0,0,0″
VerticalAlignment=“Top“
Height=“650″
HorizontalAlignment=“Left“
Width=“400″
Stretch=“Fill“/>
<TextBlock
Text=“loading….“
HorizontalAlignment=“Left“
Style=“{StaticResource PhoneTextTitle2Style}“
Margin=“185,656,0,97″
/>
<ProgressBar x:Name=“SpalshScreenProgressbar“
Width=“380″
HorizontalAlignment=“Left“
IsIndeterminate=“True“
Margin=“49,707,0,74″ />
</Grid>

Das Control wird einfach in ein PopUp als Child Objekt hinzugefügt.

image

Nun noch den Backround Service einbauen und fertig ist Splash Screen.

clip_image001

Abb.: Fertiges Control im Einsatz

Quelle:

How to create Splash Screen with Progress Bar in Windows Phone 7

Raster & Marker in der Bing Maps

Wer eine App mit Bing Maps plant und nicht so recht weiß wie man Marker und Raster in eine Map integriert, findet eine ganze Reihe von Posts über dieses Thema.

Abb.: Verschiedene Raster auf einer Bing Map

Diese Post sind auf dem Blog von Awkward Coder zu finden. Mit Hilfe von einer Shape Class und einem Template können solche Effekte erstellt werden.

Quelle:

Tessellating shapes on top of Bing Maps in a WP7 app

Mango’s Agenten ein Designansatz

Über die Agents in Mango Update habe ich ja schon berichtet, wie man nur Code gemeinsam benutzen kann, also in der Normalen App und im Agent, zeigt Shawn Wildermuth.

10-15-2011 7-31-44 PM

Der Ansatz ist mir durch WCF schon bekannt aber die Idee fand ich sehr smart. Ich habe auch einen Update Agenten momentan im Einsatz und baue jetzt aber das um wie in diesem Demo. Wieder zeigt sich das man nie auslernen tun.

Quelle:

Confusion Around WP7.1 Periodic Agents

 

Geo Service Bing Service Wrapper

Auf dem  Xaml Ninja Blog ist ein genialer Post erschienen wir der Developer eine Wrapperclass erstellt mit WP7 Contrib. Richtig ins Detail gehts tief in die Entwicklung und saubere Abwicklung von Problemen wie Logging, und MVVM  deren Erstellung.

Aufbau eines ViewModels inclusive Services:

First up we need to declare the private fields so let’s go ahead and do that

01.private readonly IBingMapService bingMapService;
02.private readonly ILocationService locationService;
03.private LocationRect boundingRectangle;
04.private GeoCoordinate currentDeviceGeoCoordinate;
05.private IDisposable currentLocationObserver;
06.private RelayCommand selectFindMyCurrentLocationCommand;
07.private RelayCommand selectFindGeoLocationFromAddressCommand;
08.private Address address;
09.private LocationData locationDataByPoint;
Constuctor des VM:
01.public LocationViewModel(
02.INavigationService navigationService,
03.ILocationService locationService,
04.IBingMapService bingMapService,
05.ILog log)
06.: base(navigationService, log)
07.{
08.this.locationService = locationService;
09.this.bingMapService = bingMapService;
10.this.address = new Address {CountryRegion = "UK", PostalCode = "LE17 5ER"};
11.}
Diese Post ist zu aufwändig das ich ihn in seiner Gesamtheit dastellen kann.
Quelle:

Codeless Development mit Commands

Ich habe ja schon öfter über das MVVM und Commands berichtet, heute möchte ich einen Blog Post bei Dotnet.Curry vorstellen. Es wird das neue in Silverlight 4.0 eingeführte ICommand Pattern vorgeführt. Dieses Konzept kann mit dem Mango Update in Apps eingebaut werden. Es wird kein zusätzliche Framework benötigt, was ich als echten Mehrwert finde. Gerade wenn etwas größere LOB Apps geplant sind.

In dem Post wird im Einzelschritt wirklich alles sehr gut erklärt, hier das Resultat am Ende:

wp7-load-employees

Quelle :

dotnet.curry.com

Neue WP7 Beispiel Serie

Auf SilverlightShow.net ist eine neue Exam. Serie von Peter Kuhn gestartet. Was diese Serie von anderen schon vorgestellten Beispielseiten unterscheidet, ist z.B. eine klare Übersicht an Themen und sehr gut ausgesuchte Beispiellinks über folgende Themen in der WP7 Programmierung.

  • Designing Data Access Strategies (19%) (this article)
  • Designing and Implementing Notification Strategies (17%)
  • Working with Platform APIs, Tasks, and Choosers (21%)
  • Designing the Application Architecture (21%)
  • Designing the User Interface and User Experience (23%)

Besonders möchte ich auf den Post über Notification Strategie und Implementierung eingehen.

image

Hier werden wirklich keine Einzelheiten ausgelassen und der Entwickler bekommt eine Bandbreite angeboten die Ihresgleichen sucht.

Quelle:

Getting ready for the Windows Phone 7 Exam 70-599 (Part 2)

WCF Data Services und Tombstoning

In Mango ist wieder eine neue Eigenschaft eingebaut worden, die nicht zu unterschätzen ist. Beim Arbeiten mit den WCF Data Services und Tombstoning bei neuen Apps mit Mango Update.

Alex van Beek hat auf seinem Blog diese Problematik in einem Post ausführlich beschrieben.

Die Server Seite besteht aus einem WCF Dataservice.

image

Dieser muss nun per Service Referenz ins Projekt vom Client eingebunden werden.

image

Hier noch eine kleine Anzeige vom Windows Phone Client

image

Anschliesend wird beschrieben wie man Tombstoning in diesem Client einsetzt.

   1: protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
   2:       {
   3:           base.OnNavigatedTo(e);
   4:  
   5:           if (_newInstance)
   6:           {
   7:               if (State.ContainsKey("productService"))
   8:               {
   9:                   // need to restore the state.....
  10:                   string stateString = (string)State["productService"];
  11:                   DataServiceState state = DataServiceState.Deserialize(stateString);
  12:                   _context = (AdventureWorks2008Entities)state.Context;
  13:                   _products = (DataServiceCollection<Product>)state.RootCollections["products"];
  14:                   _lbxProducts.ItemsSource = _products;
  15:               }
  16:               else
  17:               {
  18:                   //A new instance with no state saved, load new data....
  19:                   DataServiceQuery<Product> products = (DataServiceQuery<Product>)
  20:                       from p in _context.Product
  21:                       where p.ListPrice < 500
  22:                       select p;
  23:                   Debug.WriteLine("Products uri: " + products.RequestUri);
  24:                   _products.LoadCompleted += new EventHandler<LoadCompletedEventArgs>(HandleProductsLoaded);
  25:                   _products.LoadAsync(products);
  26:               }
  27:           }
  28:           _newInstance = false;

29: }

Quelle :

infoSupport Blog

 

 

 

WP7 Mango Sockets Entwicklung

Im aktuellen Stand ist es fast nicht möglich Chatclients für WP7 zu entwickeln. Nach vielen Post von Entwicklern hat Microsoft nachgebessert, und im Mango Update die Socket Netzwerkstruktur eingeführt. Im Blog von Mister Goodcat gibt es für Einsteiger einen kleinen Message Client/Server mit Sockets.

image

Abb.: Server Console

 

Es ist nun wirklich einfach mit einigen Zeilen Code eine Socket Kommunikation aufzubauen:

// create endpoint
var ipAddress = IPAddress.Parse(host);
var endpoint = new IPEndPoint(ipAddress, port);

// convert text to send (prefix with length)
var message = string.Format("{0};{1}", Message.Text.Length, Message.Text);
var buffer = Encoding.UTF8.GetBytes(message);

// create event args
var args = new SocketAsyncEventArgs();
args.RemoteEndPoint = endpoint;
args.Completed += SocketAsyncEventArgs_Completed;
args.SetBuffer(buffer, 0, buffer.Length);

// create a new socket
var socket = new Socket(AddressFamily.InterNetwork,
    SocketType.Stream,
    ProtocolType.Tcp);

// connect socket
bool completesAsynchronously = socket.ConnectAsync(args);

// check if the completed event will be raised.
// if not, invoke the handler manually.
if (!completesAsynchronously)
{
    SocketAsyncEventArgs_Completed(args.ConnectSocket, args);
}

private void SocketAsyncEventArgs_Completed(object sender, SocketAsyncEventArgs e)
{
    // check for errors
    if (e.SocketError != SocketError.Success)
    {
        Dispatcher.BeginInvoke(() => MessageBox.Show("Error during socket operation: "
            + e.SocketError));

        // do some resource cleanup
        CleanUp(e);
        return;
    }

    // check what has been executed
    switch (e.LastOperation)
    {
        case SocketAsyncOperation.Connect:
            HandleConnect(e);
            break;
        case SocketAsyncOperation.Send:
            HandleSend(e);
            break;
    }
}

Hier nun die Client Ansicht im Phone 7 Emulator:

image

 

Sehr schön gelungen finde ich auch das Flussdiagramm dieser Implementierung:

image

Quelle:

GoodCat