C# 5.0 includes the async and await keywords to ease writing of asynchronous code In Windows Store Apps, new Task-based methods are.

Download Report

Transcript C# 5.0 includes the async and await keywords to ease writing of asynchronous code In Windows Store Apps, new Task-based methods are.

C# 5.0 includes the async and await keywords to ease writing of
asynchronous code
In Windows Store Apps, new Task-based methods are used for
networking exclusively ,not supported on Windows Phone 8
Solutions for Windows Phone are available:
API
WP7.1
WP8
W8
System.Net.WebClient



System.Net.HttpWebRequest


(async only)
 (NuGet)
 (NuGet)

Windows.Web.Syndication.SyndicationClient



Windows.Web.AtomPub.AtomPubClient



ASMX Web Services



WCF Services



OData Services



System.Net.Http.HttpClient
using System.Net;
...
WebClient client;
public MainPage()
{
...
client = new WebClient();
client.DownloadStringCompleted += client_DownloadStringCompleted;
}
void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
this.downloadedText = e.Result;
}
private void loadButton_Click(object sender, RoutedEventArgs e)
{
client.DownloadStringAsync(new Uri("http://MyServer/ServicesApplication/rssdump.xml"));
}
using System.Net;
using System.Threading.Tasks;
...
private async void LoadWithWebClient()
{
var client = new WebClient();
string response = await client.DownloadStringTaskAsync(
new Uri("http://MyServer/ServicesApplication/rssdump.xml"));
this.downloadedText = response;
}
// Following requires HttpClient.Compression NuGet package
var handler = new AdvancedREI.Net.Http.Compression.CompressedHttpClientHandler();
// Create the HttpClient
HttpClient httpClient = new HttpClient(handler);
// To use without compression support (but why do that?), use default HttpClient constructor
// without the compression handler: HttpClient httpClient = new HttpClient();
// Optionally, define HTTP headers
httpClient.DefaultRequestHeaders.Add("Accept", "application/json");
// Make the call
HttpResponseMessage response = await httpClient.GetAsync(
"http://services.odata.org/Northwind/Northwind.svc/Suppliers");
response.EnsureSuccessStatusCode(); // Throws exception if bad HTTP status code
string responseBodyAsText = await response.Content.ReadAsStringAsync();
UPDATE June 2013: New beta of portable HttpClient supporting automatic decompression now available
See http://bit.ly/13fpWau
Making Decisions based on Data Connections
Use the NetworkInterfaceType object to detect
network type and speed
Subscribe to the NetworkChange event to detect
when the network state changes
private const int IANA_INTERFACE_TYPE_OTHER = 1;
private const int IANA_INTERFACE_TYPE_ETHERNET = 6;
private const int IANA_INTERFACE_TYPE_PPP = 23;
private const int IANA_INTERFACE_TYPE_WIFI = 71;
...
string network = string.Empty;
// Get current Internet Connection Profile.
ConnectionProfile internetConnectionProfile =
Windows.Networking.Connectivity.NetworkInformation.GetInternetConnectionProfile();
if (internetConnectionProfile != null) // if ‘null’, we are offline.
{
switch (internetConnectionProfile.NetworkAdapter.IanaInterfaceType)
{
case IANA_INTERFACE_TYPE_OTHER:
cost += "Network: Other"; break;
case IANA_INTERFACE_TYPE_ETHERNET:
cost += "Network: Ethernet"; break;
case IANA_INTERFACE_TYPE_WIFI:
cost += "Network: Wifi\r\n"; break;
default:
cost += "Network: Unknown\r\n"; break;
}
}
Mobile devices are often connected to poor quality network
connections
Best chance of success in network data transfers achieved
by:
Avoid transferring redundant data
Design your protocol to only transfer precisely the data you
need and no more
Wire Serialization Format
Size in Bytes
ODATA XML
73786
ODATA JSON
34030
JSON ‘Lite’
15540
JSON ‘Lite’ GZip
8680
http://sharpziplib.com/
http://sharpcompress.codeplex.com/
var request = HttpWebRequest.Create("http://yourPC/Service.svc/Suppliers") as HttpWebRequest;
request.Accept = "application/json";
request.Method = HttpMethod.Get;
request.Headers["Accept-Encoding"] = "gzip";
HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync();
// Read the response into a Stream object.
System.IO.Stream stream;
stream = new GZipInputStream(response.GetResponseStream());
else
stream = response.GetResponseStream();
string data;
using (var reader = new System.IO.StreamReader(stream))
{
data = reader.ReadToEnd();
}
stream.Close();
private void EnableGZipResponses(DataServiceContext ctx)
{
ctx.WritingRequest += new EventHandler<ReadingWritingHttpMessageEventArgs>(
(_, args) =>
{
args.Headers["Accept-Encoding"] = "gzip";
} );
ctx.ReadingResponse += new EventHandler<ReadingWritingHttpMessageEventArgs>(
(_, args) =>
{
if (args.Headers.ContainsKey("Content-Encoding") &&
args.Headers["Content-Encoding"].Contains("gzip"))
{
args.Content = new GZipStream(args.Content);
}
} );
}
Reference: http://blogs.msdn.com/b/astoriateam/archive/2011/10/04/odata-compression-in-windows-phone-7-5-mango.aspx
if (oSession.host.toLowerCase() == "yourpc:8888")
oSession.host = "yourpc:80";
http://yourPC:8888/
private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
{
var request = HttpWebRequest.Create("http://myServer:15500/NorthwindDataService.svc/Suppliers")
as HttpWebRequest;
request.Credentials = new Credentials("username", "password"); // override allows domain to be specified
request.Accept = "application/json;odata=verbose";
request.BeginGetResponse(new AsyncCallback(GotResponse), request);
}
Provide your own UI to request the credentials from the user
If you store the credentials, encrypt them using the ProtectedData class
private void StoreCredentials()
{
// Convert the username and password to a byte[].
byte[] secretByte = Encoding.UTF8.GetBytes(TBusername.Text + "||" + TBpassword.Text);
// Encrypt the username by using the Protect() method.
byte[] protectedSecretByte = ProtectedData.Protect(secretByte, null);
// Create a file in the application's isolated storage.
IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication();
IsolatedStorageFileStream writestream =
new IsolatedStorageFileStream(FilePath, System.IO.FileMode.Create,
System.IO.FileAccess.Write, file);
// Write data to the file.
Stream writer = new StreamWriter(writestream).BaseStream;
writer.Write(protectedSecretByte, 0, protectedSecretByte.Length);
writer.Close();
writestream.Close();
}
// Retrieve the protected data from isolated storage.
IsolatedStorageFile file = IsolatedStorageFile.GetUserStoreForApplication();
IsolatedStorageFileStream readstream =
new IsolatedStorageFileStream(FilePath, System.IO.FileMode.Open, FileAccess.Read, file);
// Read the data from the file.
Stream reader = new StreamReader(readstream).BaseStream;
byte[] encryptedDataArray = new byte[reader.Length];
reader.Read(encryptedDataArray, 0, encryptedDataArray.Length);
reader.Close();
readstream.Close();
// Decrypt the data by using the Unprotect method.
byte[] clearTextBytes = ProtectedData.Unprotect(encryptedDataArray, null);
// Convert the byte array to string.
string data = Encoding.UTF8.GetString(clearTextBytes, 0, clearTextBytes.Length);
https://manage.dev.live.com
/Applications
http://localhost
http://localhost
C:\Users\yourUsername\Documents\IISExpress\config\applicationhost.config
<sites>
<binding protocol="http" bindingInformation="*:18009:localhost" />
<binding protocol="http" bindingInformation="*:18009:YourPCName" />
YourPCName:18009
netsh advfirewall firewall add rule name="IIS Express (non-SSL)" action=allow
protocol=TCP dir=in localport=8080
yourPC
8080
http://msdn.microsoft.com/en-us/library/ms178109(v=VS.100).aspx
Bluetooth
Near Field Communication (NFC)
App to device
App to app
Connect devices
Acquire content
Exchange digital objects
ProximityDevice device = ProximityDevice.GetDefault();
// Make sure NFC is supported
if (device != null)
{
PeerFinder.TriggeredConnectionStateChanged += OnTriggeredConnectionStateChanged;
// Start finding peer apps, while making this app discoverable by peers
PeerFinder.Start();
}
ProximityDevice device = ProximityDevice.GetDefault();
// Make sure NFC is supported
if (device != null)
{
PeerFinder.TriggeredConnectionStateChanged += OnTriggeredConnStateChanged;
// Include the Windows 8 version of our app as possible peer
PeerFinder.AlternateIdentities.Add("Windows", "my Win8 appID");
// Start finding peer apps, while making this app discoverable by peers
PeerFinder.Start();
}
void OnTriggeredConnStateChanged(object sender, TriggeredConnectionStateChangedEventArgs args)
{
switch (args.State)
{
case TriggeredConnectState.Listening: // Connecting as host
break;
case TriggeredConnectState.PeerFound: // Proximity gesture is complete – setting up link
break;
case TriggeredConnectState.Connecting: // Connecting as a client
break;
case TriggeredConnectState.Completed: // Connection completed, get the socket
streamSocket = args.Socket;
break;
case TriggeredConnectState.Canceled:
// ongoing connection cancelled
break;
case TriggeredConnectState.Failed:
// Connection was unsuccessful
break;
}
}
PeerFinder.AllowBluetooth = true;
PeerFinder.AllowInfrastructure = true;
Windows.Networking.Proximity.ProximityDevice proximityDevice;
long publishedMessageId = -1;
private void PublishUriButton_Click(object sender, RoutedEventArgs e)
{
if (proximityDevice == null) proximityDevice = ProximityDevice.GetDefault();
// Make sure NFC is supported
if (proximityDevice != null) {
// Stop publishing the current message.
if (publishedMessageId != -1) {
proximityDevice.StopPublishingMessage(publishedMessageId);
}
// Publish the new one
publishedMessageId = proximityDevice.PublishUriMessage(
new Uri("zune:navigate?appid=351decc7-ea2f-e011-854c-00237de2db9e"));
}
}
http://channel9.msdn.com/Events/TechEd
www.microsoft.com/learning
http://microsoft.com/technet
http://microsoft.com/msdn