Web Deploy hatası \ (503) Server Unavailable
Önceki yazılardan olan Web deployment konusundan sonra sıkça mail aldığım ve sıkça karşılaşılan bir hata olan;
The response header ‘MSDeploy.Response’ was ” but ‘v1′ was expected.The remote server returned an error: (503) Server Unavailable
hatasına kısaca açıklık getirmek istiyorum. Bu hatanın sebebi deployment servisinin bir şekilde durması ve bu nedenle gelen publish isteklerini cevaplamamasıdır.
Çözümüyse command prompt ekranında;
-net start msdepsvc
komutuyla servisi calıştırmaktır.
Visual Studio 2010, Web Deploy Konfigurasyonları
Profil bazlı web deployment imkanı Visual Studio 2010 un en büyük getirilerinden. Bu aşamayı kullanabilmek için IIS kurulu web sunucunuzun yapılandırmasına bağlı olarak izlemeniz gereken birkaç farklı senaryo mevcut.
Bu senaryoları tüm detaylarıyla anlatan bağlantıları paylaşalım;
Automating Deployment with Microsoft Web Deploy
This is the twenty-eighth in a series of blog posts I’m doing on the VS 2010 and .NET 4 release.
This blog post continues a series of posts I’m doing that cover the new improvements we made around web deployment. In my first post in the deployment series I provided an overview of the new VS 2010 Web Deployment features.
Configuring Remote Administration and Feature Delegation in IIS 7
IIS 7 (IIS 7.0 on Windows Server® 2008 or IIS 7.5 on Windows Server 2008 R2) provides administrators and developers with a new configuration system that is accessible, extensible and distributable. The new XML-based format allows for easy configuration of the modules and features available in IIS 7. It also enables granular control of the locations at which settings for individual features can be configured (for example, at the server level in the applicationHost.config file, or at a site or an application level in a Web.config file).
Configure the Web Deployment Handler
This guide provides a basic overview of the steps to configure the Web Deployment handler on your hosted server and test that a user can deploy applications to a Web site. This setup will be using the information in this document to install the Web Deployment Tool onto a new server and configure recommended settings.
http://learn.iis.net/page.aspx/516/configure-the-web-deployment-handler/
Crm 2011 Early Bound Programlama Hatası – Unable to cast object of type ‘Microsoft.Xrm.Sdk.Entity’
Crm 2011 sdksının sunduğu programla yapılarından biri Early Bound olarak adlandırılmakta ve CrmSvcUtil aracını kullanarak Organizasyonun obje olarak bir çıktısının alınması temeline dayanmaktadır.
Bu biçimde bir kullanım esnasında çıktısını aldığınız organizasyon varlıkları (Entity) üzerinde benim örneğimde olacağı üzere linq sorgularında cast hatası almanız olası ve çözülmesi çok basit, basit olduğu kadar da ince bir detayda gizli. Nedir bu detay ;
ClientCredentials c = new ClientCredentials();
c.Windows.ClientCredential = new System.Net.NetworkCredential(userName, userPassword, userDomain);OrganizationServiceProxy proxy = new OrganizationServiceProxy(new Uri(organizationUri), null, c, null);
proxy.EnableProxyTypes();//create organization service with layer of proxy
this._service = (IOrganizationService)proxy;
kalın harflerle işaretlediğim üzere OrganizationServiceProxy nesnesinden türettiğimiz proxy objesinin EnableProxyTypes() konfigürasyonunu yapmak belirtilen hatadan kurtulmamız için yeterli.
Mevzu bahis hataları tam olarak hatırlarsak;
- Object of type Microsoft.Xrm.Sdk.Entity cannot be converted to type Xrm.abdf Message = Unable to cast object of type ‘Microsoft.Xrm.Sdk.Entity’ to type Xrm.abdf
Asp.Net Web Formları arasında alternatif veri taşıma yöntemi
İki web formu arasında veri taşımak kullanılan yöntemler açısından genelde kararsız kalınan ve kolaya kaçmakla birlikte güvenlik açıklarına sebebiyet veren konuların başında gelir.
Klasik olarak kullanılan yöntem html form dahilinde oluşturulmuş formlarla post etmek ve diğer formda bu değerleri karşılamak. Ya da yazılacak özel bir sınıfa formdan gelen değerleri yazdırıp bir eventle kendi sayfasında ya da bilgilerin gönderileceği ikinci bir formda karşılayarak okumak ve yorumlamaktır.
Bu klasik kullanımlara ek olarak farklı bir methodu kısaca anlatmaya çalışacağım.
Öncelikli olarak System.Web.UI.Page dan türeyen kendimize has bir web.ui sınıfı olşuturalım ve oluşturacağımız web formları bu sınıftan türetelim. Oluşturduğumuz bu sınıfa PostValues adı altında bir Dictionary tipinde özellik ekledim. Eklediğim bu özelliği formlar arasında veri taşırken kullanacağım. Peki bu nasıl olacak ? İnceleyelim;
Veri girişi yapılacak formu mainform, veri gönderilecek formu da subform olarak kabul edersek, SubForm.aspx dosyamın içine;
şeklinde bir tanım yapıyorum. Bu tanımla birlikte hangi formdan hangi sayfadan gelecek verileri kabul edeceğimi tanımlamış oluyorum. Tanımladığım bu yapı sayesinde kod tarafında şöyle bir erişime sahip oluyorum;
Dictionary<string, string> postValues = PreviousPage.PostValues;
Tanımlamış olduğum özelliğe direk erişim sağlamış oluyorum.
Bu özelliği ana formda istediğim güvenlik önlemlerini alarak istediğim validasyonları kullanarak doldurabilir daha sonra da ikinci formda kontrol edebilirim. Peki bu post değerlerini hangi aşamada dolduracağım ? Bunun için önerebileceğim en doğru yer buton un Click eventidir.
Asp.Net MVC 2 –9- Test süreçleri, Unit Testing
Test işlemleri daha önce profile serimizde ele aldığımız üzere genelde ertelenen bir aşamadır. Ancak güncellenen yazılım teknikleriyle birlikte test süreçleri daha kolay hale getirilmekte, test için geliştirilmiş araçlar ya da sihirbazlar aracılığıyla ek efor gerektirmeden dahil edilebilmektedir. Bu gelişmeler ertelenen test süreçlerini daha önemli ve vazgeçilmez hale getirmiştir. Test süreçlerinin kazandığı önem ve kolaylık boyutundan, belli bir senaryo dahilinde test edilmesi hayli zor olan Asp.Net te Mvc yapılanmasına uyum gösterek etkilenmiştir.
Yeni bir mvc projesi oluşturduğunuzda unit test seçeneğini de birlikte sunmakta ve iki proje şeklinde yeni solution açılmaktadır. Ancak başlangıçta bu seçeneği seçmeyip sonradan eklemek isterseniz izlemeniz gereken yol; add new project\yeni proje ekle diyerek test tipinde bir projeyi solution’a eklemektir. Eklediğimiz unit test projesinin esas projemizle paralel ve anlaşılır durumda olması için test sınıflarını ekleyeceğimiz klasörleri de aynı adlarla vermek doğru olacaktır. Klasör içine ekleyeceğimiz test sınıf adlarınını sonunaysa test eklemek referanslar arasındaki karışıklığı giderecek bir adaım olacaktır. Test sınıfları da ana proje sınıfları da aynı adda olması durumunda solution anlaşılırlığını yitirecektir.
Klasör yapılarını kurduktan sonra Models klasörüne sağ tıklarak new test diyalog penceresiyle birlikte yeni bir unit test sınıfı ekliyoruz. Test sınıfı ekledikten sonra test sınıfımız otomatik olarak açılacak ve ekranda [TestClass], [TestMethod] gibi attributlere sahip kısımlar göreceğiz. TestClass test aşamalarını yer alacağı metodların yani TestMethod özelliğindeki metodların yer alacağı ve aşama aşama kontrollerin yapılacağı kısımlardır. Buradaki aşamalar geliştiricinin ya da analistini çizdiği senaryoya göre farklı şekilde tasarlanabilir. Test senaryomda ilk önce boş girişler yapılarak yeni bir kayıt oluşturmayı daha sonraysa string değerlere integer değerler, integer değerlere de string değerler vererek sonuçlarını gözlemleyeceğim.
Öncelikle yeni bir kullanıcı sınıfı oluşturarak belirlediğim senaryoya göre bu sınıfa değerler atıyorum. Atadağım değerler sonrasında modelin IsValid propertysini test methodunun içinde sınmaya yapacak olan Assert.IsFalse fonksiyonuna gönderiyorum. Bu fonksiyon test aşamalarını senaryo dahilindeki sıraya göre çalıştırıp sonuçlarını ekrana yazacaktır. Test methodlarını oluşturduktan sonra CTRL R, A kısayoluyla ya da test->run->All test projects i seçerek test sürecimizi başlatıyoruz.
Test süreci başladığında göreceğiniz üzere tüm test aşamaları ekranda verdiğimiz method isimleriyle listelenecek ve sonuçları yazılacaktır. Küçük ölçekli projelerde sorun olmasa da büyük ölçekli projelerde hata veren aşamaya daha rahat ulaşım için method isimlerini anlaşılır vermek doğru bir adım olacaktır.
Controller sınıfımız için kurgulanan senaryoda ActionResult olarak dönen bir sonucu ViewResult olarak göstermeye çalışmayı ve ayrıca sisteme olmayan bir id ye ait kaydı göstermeyi denemek istiyorum. Bunun iiçin gerekli test methodunu yazara sonuçları gözlemlediğimde Failed hatasıyla birlikte aşamayı geçemedğimi test sonuçlarından görebiliyorum.
Asp.Net MVC 2 –8- Güvenlik kontrolleri \ Authorizing, Role Management
Genel Asp.net uygulamalarında olduğu gibi Asp.NET MVC Frameworkünde de üzerinde önemle durulan konulardan biridir güvenlik unsurları. Şu ana kadar yazdığım makaleler ve örneklerde herhangi bir kimlik doğrulama ve rol kısıtlaması olmaksızın her aksiyona izin vermiştik. Şimdi Asp.NET MVC Frameworkünün nin imkan verdiği doğrultuda güvenlik kısıtlaması ve kontrolü konularını açıklamaya çalışacağım.
Controller katmanları içerisinde yer alan yeni kayıt ekleme ve düzeltme işlemlerini başlangıç için seçebiliriz. Örneklerde de görüleceği üzere mvc yapısı itibariyle bu işlemlerin ayrı katmanda yer almasının ne kadar fonksiyonel olduğunu anlayacağız. Sadece üye olanların bir formu görüntelemesine izin verme kısıtlamasını, ilgili fonksiyonun başına Authorize parametresini ekleyerek sağlayabilmek mümkün. Öte yandan yeni bir kayıt oluşturma aşamasındaki işlevselliğiyse Post tanımlamasının yanında yine Authorize parametresini vererek kolay bir şekilde sağlamak mümkün. Ayrıca sayılan bu iki işlemi de genel üyeliğe zorunlu hale getirdiğimiz gibi kullanıcı bazında kısıtlama yapmakta mümkün. Authorize tanımlamasına kullanıcı adlarını göndererek (Örn: Admin) sözkonusu işlemi sadece belirtilen kullanıcının gerçekleştirmesine izin verebiliriz. Kullanıcı bazında olduğu gibi mevzubahis kısıtlamayı Rol bazında da yaparak tüm bir departmana iş kolundaki çalışanlara yetki tanımı yapılabilir. (Tüm bu açıklamalara ait ekran görüntüleri aşağıda takip edilebilir)
Kullanıcı bazındaki kısıtlamalarda özellikle de sözkonusu kısıtlama, kaydın detayını görmek ve güncellemekse bazı sıkıntıları beraberinde getirebilir. En basit olarak kendi eklediğim bir kaydın detayını kullanıcı adım Users listesinde olmadığı için görüp üzerinde değişiklik yapamayabilirim. Peki bu sıkıntıyı nasıl aşabiliriz.
Öncelikle kısa bir bilgi vermek gerekirse oluşturduğumuz mvc projesinde kullanıcı kaydı oluşturma saklama ve login işlemleri AccountController olarak Asp.Net in MemberShip apisi züerinden oluşturulmuş bir şekilde gelmektedir. Bu yapı yardımıyla yeni bir kullanıcı açabilir açtığımız kullanıcıyla sisteme giriş yapabiliriz. Generate olan bu database yapısını ve kayıtları görmek için tüm dosyaları göster seçeneğini işaretlediğimiz takdirde App_Data klasörü altında görebiliriz. Peki bu önbilgiyi neden verdik. Sisteme giriş yaptığımızda Asp.Net apisinin sağladığı User.Identity.Name şeklinde giriş yapan kullanıcı bilgisini okuyabilir ve mevcut kullanı kimliğine ulaşabiliriz.
Böylelikle kurguladığımız bu yapıda, ulaştığımız bu kimlik bilgilerini yeni kayıt girerken kaydettiğimiz takdirde düzenleme ve görüntüleme isteklerinde, isteği yapan kullanıcıyla aynıysa izin ver şeklinde bir yapı kurabiliriz. Böylelikle kod tarafında kullanıcı listesi saklamak yerine daha güvenli ve kontrollü bir güvenlik kısıtlama yapısı kurgulayabiliriz.
Asp.Net MVC 2 –7- Özelleştirilmiş Sayfalandırma\Custom Paging
Mvcye kolayca ekleyebileceğimiz özellikleri anlatmaya devam ediyoruz. Mvc olduğu kadar Linq yapısının da avantajıyla IQueryable interface yapısıyla viewlari bölümlendirebilir sayfalandırma\paging yapabilirsiniz.
Öncelikle bugün kullanıcıları listelemek için bir fonksiyon ekledik. Bu fonksiyonumuz dönüş tipini kayıtlar içerisinde sıralama ve atlama yapabilmek için IQuerayable olarak belirledik. Kurguladığımız bu yapı itibariyle Skip() ve Take() adlarındaki iki fonksiyona dikkat etmiş olabilirsiniz. Bu iki fonksiyon neticesinde IQueryable yapısı paraleleindeki sayfalandırmayı yapımıza uyarlıyoruz. Skip() baştan itibaren es geçilmesi gereken kayıt sayısını, Take() ise bu noktadan itibaren kaç kayıt alacağımızı belirtmemiz için kullanılan fonksiyonlardır. Kullanıcı sayısı 10 dan fazla olması durumunda sonraki sayfalara dallanma işlemi gerçekleşecektir. Bu yapıyı kurgulayarak gerekli düzenlemeyi Controller nesnemizin içindeki Index() aşamasına yerşetiriyoruz. Bu özelliği ana sayfa düşündüğümüz için böyle bir düzenleme yaptık ama ayrı bir view ve farklı bir sayfada gösterilmek istenirse o şekilde de yapılandırma sağlanabilir.
Eklediğimiz bu özelliğin bir de view tarafına yansıtılması gereken link kısmı var. Bu tarz bir yapı generic olduğu ve birden fazla nesne için kullanılabileceğini varsayarsak mevcut model yapısın ayrı olarak <T> type ıyla tüm nesneler için kullanılabilecek bir yapı hazırlıyoruz. Bu yapıda toplam sayfa sayısını, tıklanan indekse göre önceki sayfa ya da sonraki sayfa var mı kontrolünü yapmayı hedefliyoruz.
public class PagedObject<T> : List<T>
{
public int Index { get; set; }
public int Size { get; set; }
public int Count { get; set; }
public int TotalPage { get; set; }public PagedObject(IQueryable<T> source, int currentPage, int pageSize)
{
Index = currentPage;
Size = pageSize;
Count = source.Count();
TotalPage = Count / Size;this.AddRange(source.Skip(Index * Size).Take(Size));
}public bool HasPrePage
{
get
{
return (Size > 0);
}
}public bool HasNextPage
{
get
{
return (Index+1 < TotalPage);
}
}
}
PagedObject şeklinde ayrı bir sınıf yapısıyla tasarladığımız bu yapıda dört ayrı özellik\property mevcut.
Index; şu anda bulunduğumuz sayfayı
Size; bir sayfada gösterilecek kayıt sayısını,
Count; toplam kayıt sayısını,
TotalPage; toplam sayfa sayısını
göstermektedir.
<T> türünden tanımladığımız bu sınıf yapısı neticesinde istediğimiz kayıt için kullanabilecek durumdadır. Obje oluşturulurken Constract fonksiyonu için elimizdeki sonuç setini, bulunduğu sayfayı ve bir sayfada gösterilecek olan kayıt sayısını göndermek yeterli olacaktır. Ayrıca HasPrePage ve HasNextPage özellikleri sayesinde kullanıcı ekranlarında bir sonraki ya da bir önceki kayıt olup olmaması durumuna göre linklerle ilgili aktive\deaktive edebilme işlemlerini sağlayabileceğiz.
PageObject model yapısını kullanabimek için view içerisinde bu yöndeki değişikliği yaparak özelleştirilmiş assemblymizin adresini belirtmemiz kullanım için yeterli olacaktır.
Dynamics Crm Web Servis Soap Hatası ve Çözüm Önerisi
Dynamics Crm tabanlı bir web uygulamasında karşılaştığım ilginç bir web servis hatası ve çözümünü paylaşmak istiyorum.
Projemiz Dynamics Crm üzerinden yetki kontrollerini yapan bağımsız bir web uygulamasıdır.
Projeye Crm web servisi dahil edilirken, http://1.1.1.1/MSCRMServices/2007/CrmServiceWsdl.aspx?uniquename=organizasyonismi
şeklinde adres verilmiş ve hata alinmadan servis dahilindeki siniflara,fonksiyonlara ulaşarak web reference olarak eklenebilmiştir.
Aynı adrese browserdan erişim yapıldığında sorunsuz olarak servis yapısına yine ulaşılabilmektedir.
Ancak proje dahilinde request\response aşamasına gelindiğinde bu adrese login olunamamakta, AuthenticationTokenValue null olarak dönmekte ve;
Possible SOAP version mismatch: Envelope namespace http://schemas.xmlsoap.org/wsdl/ was unexpected. Expecting http://schemas.xmlsoap.org/soap/envelope/.
Hatası vermekteydi.
Mevcut hatanın çözümü http://1.1.1.1/MSCrmServices/2007/CrmService.asmx şeklinde adres tanımının doğru bir şekilde yapılmasıyla aşılabilmektedir.
Blog yazımında türkçe ve html karakter problemi
Blog yayınlama esnasında wordpress altyapısını kullanarak yazı yayınlarken karşılaştığım özel karakter sorunuyla ilgili çözümü paylaşmak istiyorum.
Özel karakter diyorum çünkü problem sadece türkçe karakter problemi değiş; < > gibi karakterlerinde değiştirilerek post edilmesi nedeniyle wordpress admini haricinde hiçbir uygulamadan yazı giremiyorsunuz bu sorun nedeniyle.
Not well formatted hatası olarak alacağınız;türkçe ve html karakterlerin değişimine sebep olan bu problemi
http://wordpress.org/support/topic/402653 adresindeki çözüm önerisiyle giderebilirsiniz.
Asp.Net MVC 2 –6- Dry ve Partial View yapısı
Model View Controller serimizde geldiğimiz aşama itibariyle form ve beraberindeki sınıf yapılarına müdahele edebilir durumdayız. Kurguladığımız database yapısı paralelinde business\iş modelimize göre form ve sınıf yapılarını özelliştirme aşamalarına birkaç ek yöntemle devam edeceğiz.
Mvc nin önemli prensiplerinden biri kendini tekrar etme\Dont repeat yourself kısacası DRY olarak adlandırılan prensibe göz atacağız öncelikle. Serimizde kullandığımız User yapısından yola çıkarak örneklersek eğer dikkatinizi çekeceği üzere Create ve Edit formları birbirinin aynı kod bloklarını içermektedir. Daha sonra yapmış olduğumuz kullanıcı departman düzeltmesini Create için yaptığımızda edit için unutabiliriz, unutmasak bile ayrı ayrı aynı kodları yazmak suretiyle kod kirliliğine yol açmış ve proje boyutlarını arttırmış olacağız. Hem de mvcnin prensibi olan Dry i tamamen reddetmiş olacağız. Nasıl bir yol izlemeliyiz bu durumda? inceleyelim.
Yeni ana form yapımızı oluşturacağımız View\User klasörüne sağ tıklayarak Add->View seçeneklerini takip ederek işlemi view ekleme penceresine ulaşıyoruz. Bu pencerede dikkat etmemiz gereken Create Partial View ve Create strongly typed view seçeneklerinin işaretli olmasıdır. Typed view seçeneğiyle mevcut Controller sınıflardan seçimimizi yapmış, partial view seçeneğiyle de yapılandırılmış ola view yapısını eklediğimiz View a göndermiş oluyoruz.
Bu işlemi yaptıktan sonra Create ya da Edit formunun tekrarlanan kısmını alarak UserBase yapımızın gövdesini oluşturuyoruz.
Bu aşamayla ana form yapısını oluşturduktan sonra Create ve Edit form aşamalarını Html.RenderPartial fonksiyonuyla ana formu çağıracak şekilde düzenliyoruz.
Çalıştırdığımızda göreceğimiz üzere sonuç aynı. Daha az uğraşı daha az kod kalabalığı her zaman daha rahat problem çözümü demek.
Partial viewlara ek not olarak Site.Master yapısını kullanmak ve tekrar edilen kodlardan uzak durmak başvurulacak ek bir yöntemdir.
