Microsoft.VirtualEarth.MapControl.Location yozgat = new Microsoft.VirtualEarth.MapControl.Location();
Visual Studio 2008 de Solution Explorer da projeyi sağ tıklayarak açılan menüden "Add Service Reference" ı tıklayarak aşağıdaki resimdeki ekran gelecektir. Sarı ile boyanmış olan Advanced i seçin
açılan pencere aşağıdaki gibi olacakdır. Resimde sarı ile berlitlimiş olan "Add Web Reference" butonunu tıklayıp
- http://staging.mappoint.net/standard-30/mappoint.wsdl
- http://dev.virtualearth.net/webservices/v1/geocodeservice/geocodeservice.svc?wsdl
- http://dev.virtualearth.net/webservices/v1/routeservice/routeservice.svc?wsdl
Servislerini gösterdiğimiz biçimde ekleyin. En son eklediğimiz servis şu an için kullanmayacağız fakat ileride noktalar arası rotalama işlemi için kullanılacakdır. İncelemenizi tavsiye ederim.
Servislerin güvenliği için bir önceki makalemizde belirtmiş olduğumuz developer account ve NetworkCredential class i ile bağlanabiliriz. Geocoding ve Routin işlemleri için yukarda belirtmiş olduğumuz servislerden ilkgindeki "GetClientToken" methodunu çağırın. Bu method size string biçiminde bir Token veisi verecekdir. Geocoding ve Routing servislerine Token bilgisi ile bağlanacakdır. Burada dikkat edilmesi gereken mevzu verilen Token bilgileri Develeper Account sayfasında belirtmiş olduğunuz kullanım suresi kadar geçerli olmasıdır.
Güvenlik Sebebi ile GetCllientToken Methodunu Silverlight Projemiz içinde kullanamayız çünkü NetworkCredential nesnemize User Account Bilgilerini Girmemiz gereklidir. Fakat bu bilgiler silverlight objesi içinde olursa buyuk bir guvenlik açıgı doğurur. Bu sebeple Silverlight Projemizi host edecegimiz web uygulamasında bir service oluşturmamız gerekir. Bu şekilde Silverlight uygulamamız Web Service Uygulamasına istek gonderir, Web Service de Microsoftun servisine Accunt bilgilerini gondererek Token bilgisini alıp silverlight uygulamamıza getirir. Aşağıda Web uygulaması içindeki GetToken Methodunu tanımlayacağız. Projeyi inidirip kodların tamamını incelediğinizde daha pekişeceğini düşünüyorum. Silverlight Uygulamamıza kendi yazdığımız servisi TokenService Olarak Tanıttım.
GetToken Methodu
[OperationContract]
public string GetToken()
{
OperationContext context = OperationContext.Current;
MessageProperties messageProperties = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpointProperty = messageProperties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
MapService.CommonServiceSoap commonService = new MapService.CommonServiceSoap();
commonService.Credentials = new System.Net.NetworkCredential("User", "Password");
MapService.TokenSpecification tokenSpec = new MapService.TokenSpecification();
tokenSpec.ClientIPAddress = endpointProperty.Address;
tokenSpec.TokenValidityDurationMinutes = 60;
string token = "";
// Anahtar Alınır
try
{
token = commonService.GetClientToken(tokenSpec);
}
catch (Exception ex)
{
throw ex;
}
return token;
}
Uygulama .cs uzantılı dosya Aşağıdaki Gibidir
namespace VirtualEarth1
{
public partial class MainPage : UserControl
{
string Token;
TokenService.Service1Client service = new VirtualEarth1.TokenService.Service1Client();
MapLayer mapLayer = new MapLayer();
public MainPage()
{
InitializeComponent();
MyMap.Children.Add(mapLayer);
Microsoft.VirtualEarth.MapControl.Location yozgat = new Microsoft.VirtualEarth.MapControl.Location();
yozgat.Latitude = 39.818080812692642;
yozgat.Longitude = 34.814686104655266;
MyMap.SetView(yozgat, 6);
service.GetTokenCompleted += new EventHandler(service_GetTokenCompleted);
service.GetTokenAsync();
btnBul.IsEnabled = false;
}
void service_GetTokenCompleted(object sender, VirtualEarth1.TokenService.GetTokenCompletedEventArgs e)
{
Token = e.Result;
btnBul.IsEnabled = true;
}
private MapGeocodeService.GeocodeServiceClient geocodeClient;
private MapGeocodeService.GeocodeServiceClient GeocodeClient
{
get
{
if (null == geocodeClient)
{
bool httpsUriScheme = HtmlPage.Document.DocumentUri.Scheme.Equals(Uri.UriSchemeHttps);
BasicHttpBinding binding = new BasicHttpBinding(httpsUriScheme ? BasicHttpSecurityMode.Transport : BasicHttpSecurityMode.None);
UriBuilder serviceUri = new UriBuilder("http://dev.virtualearth.net/webservices/v1/GeocodeService/GeocodeService.svc");
if (httpsUriScheme)
{
//For https, change the UriSceheme to https and change it to use the default https port.
serviceUri.Scheme = Uri.UriSchemeHttps;
serviceUri.Port = -1;
}
//Create the Service Client
geocodeClient = new MapGeocodeService.GeocodeServiceClient(binding, new EndpointAddress(serviceUri.Uri));
geocodeClient.GeocodeCompleted += new EventHandler(client_GeocodeCompleted);
}
return geocodeClient;
}
}
private void client_GeocodeCompleted(object sender, MapGeocodeService.GeocodeCompletedEventArgs e)
{
string outString;
try
{
if (e.Result.ResponseSummary.StatusCode != MapGeocodeService.ResponseStatusCode.Success)
{
FromOutput.Text = outString = "error geocoding ... status <" + e.Result.ResponseSummary.StatusCode.ToString() + ">";
}
else if (0 == e.Result.Results.Count)
{
FromOutput.Text = outString = "No result";
}
else
{
GeocodeResult res = e.Result.Results[0];
System.Windows.Shapes.Rectangle rec = new System.Windows.Shapes.Rectangle();
rec.Fill = new SolidColorBrush(Colors.Red);
rec.Width = 15;
rec.Height = 15;
rec.Opacity = 0.65;
mapLayer.AddChild(rec, new Microsoft.VirtualEarth.MapControl.Location(res.Locations[0].Latitude, res.Locations[0].Longitude));
}
}
catch (Exception)
{
outString = "Exception raised";
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
GeocodeAddress(txtAdres.Text);
}
private void GeocodeAddress(string address)
{
MapGeocodeService.GeocodeRequest request = new MapGeocodeService.GeocodeRequest();
request.Culture = MyMap.Culture;
request.Query = address;
request.ExecutionOptions = new MapGeocodeService.ExecutionOptions();
request.ExecutionOptions.SuppressFaults = true;
request.Credentials = new MapGeocodeService.Credentials();
request.Credentials.Token = Token;
request.Options = new MapGeocodeService.GeocodeOptions();
request.Options.Filters = new ObservableCollection();
MapGeocodeService.ConfidenceFilter filter = new MapGeocodeService.ConfidenceFilter();
filter.MinimumConfidence = MapGeocodeService.Confidence.High;
request.Options.Filters.Add(filter);
FromOutput.Text = "";
// Service Çağrılır
GeocodeClient.GeocodeAsync(request);
}
}
}