10 Haziran 2013 Pazartesi

Web Page Screen Shot ASP.NET


Günlerden yeni gün, yeni görevim ise bir web sayfasının görüntüsünü alıp .bmp uzantısıyla kaydetmek idi. Kulağa gayet basit gelmişti, sonuçta print screen düğmesi bile vardı, ne kadar zor olabilirdi ki? sonra o dediğimin Form Applicationlarda çok basit olduğunu farkettim.. Halbuki ben bu işlemi bir web application da yapmalıydım. Eaaah hikayeleştiremiycem :D cümle kurmaya üşenir oldum hayydi hıyarlısı..

Hikayeleştiremiycem de girişi öyle yaptım şimdi nasıl devam etsem abes olacak.. Abesle iştigal ederekten devam edelim, bayağı araştırdım ben bu işi.. Pek çok örnek de buldum ancak ya .exe kullanmışlar (link : http://nolovelust.com/post/C-Website-Screenshot-Generator-AKA-Get-Screenshot-of-Webpage-With-Aspnet-C), ya paralı ekstradan bir dll kullanmışlar..(http://www.websitesscreenshot.com/) 2 - 3 örnek denedim de.. exe li olan çok başarısızdı, çok kalitesiz bir resim veriyordu.. dll dediğimin bedavasını(!) bayağı aradım ama bulamadım. hehe.. Neyse,, sonra birazdan kopyalayacağım örnekle karşılaştım, kalite olarak gayet başarılı, ekstra bir dll cart curt kullanmıyorsun, ASP.NET in nimetlerinden faydalanıyorsun.. Güzel kod hoş kod.. ilk denediğim URL de sorunsuz harika bir resim elde ettim.. Ama sonra basit bir www.google.com url ini de deneyeyim bari dedim, boş bir resim elde ettim.. meğer bu kodumuz her sayfada çalışmazmış, her scripti desteklemezmiş.. :( Ama bu benim için sorun olmadı belki yanlışlıkla biri bloguma girer de bu kodu alırsa ona problem olabilir diye üzülüyorum .. Hayırlısı olsun,, sonuçta bizim işimizi gördü, görüntüsünü almak istediğimiz sayfayı destekledi şükür :)

Kod şu;


public partial class WebForm2 : System.Web.UI.Page
    {

       protected void Page_Load(object sender, EventArgs e)
        {
            Thread webBrowseThread = new Thread(new ThreadStart(GenerateScreenshot));
            webBrowseThread.SetApartmentState(ApartmentState.STA);
            webBrowseThread.Start();
        }

        //this method on providing the url of the webpage copies the image of that webpage.
       public void GenerateScreenshot()
        {
            //string url = "http://www.websitesscreenshot.com/";
            //string url = "http://www.google.com.tr/";
            //string url = "http://www.codeproject.com/Articles/96028/WCF-Service-with-custom-username-password-authenti";
            string url = "http://jsplumbtoolkit.com/jquery/demo.html";
            
            int width = 1024;
            int height = 768;    
            try
            {
                DateTime timeStamp = DateTime.Now;
                // Load the webpage into a WebBrowser control
                WebBrowser wb = new WebBrowser();
                wb.ScrollBarsEnabled = false;
                wb.ScriptErrorsSuppressed = true;
                wb.Navigate(url);

                WebBrowserReadyState flag = wb.ReadyState;

                while (flag != WebBrowserReadyState.Complete && DateTime.Now < timeStamp.AddSeconds(10))
                {
                    System.Windows.Forms.Application.DoEvents();
                    flag = wb.ReadyState;
                    TimeSpan elapsed = DateTime.Now.Subtract(timeStamp);
                }                            
               
                wb.Width = wb.Document.Body.ScrollRectangle.Width;
                wb.Height = wb.Document.Body.ScrollRectangle.Height;
                if (wb.Width < width)
                {
                    // Take Screenshot of the web pages full width
                    wb.Width = width;
                }
                if (wb.Height < height)
                {
                    // Take Screenshot of the web pages full height
                    wb.Height = height;
                }
                
                // Get a Bitmap representation of the webpage as it's rendered in the WebBrowser control
                Bitmap bitmap = new Bitmap(wb.Width, wb.Height);

                wb.DrawToBitmap(bitmap, new System.Drawing.Rectangle(0, 0, wb.Width, wb.Height));
                Graphics Grfx = Graphics.FromImage(bitmap);
                Grfx.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                Grfx.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                Grfx.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
                Grfx.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                Grfx.DrawImage(bitmap, 0, 0, wb.Width, wb.Height);
                wb.Dispose();
                bitmap.Save(@Server.MapPath("screenShot/output.bmp"), System.Drawing.Imaging.ImageFormat.Bmp);               

            }
            catch (Exception ex)
            {
            }
        }

    }

Örneği aldığım link şu;



WCF e url ile parametre verip test etmek

Hep karıştırıyorum yazarken sonra bak dur url e.. gereksiz zaman kaybı..
O zaman ben de arada sırada blogumdan kopya çekeriim :)

işte de kullanımı;

http://localhost/Metro/EHsTreeView.svc/GetOdpByParent?parentTypeId=286ffd8c-713c-4832-9bf6-e2c0dd06b9bd&level=5&operationId=0a5b40b2-a990-4c4c-be74-75c241fd13b3



the girl is so dangerousss.....

:S

5 Haziran 2013 Çarşamba

Ajax-Enabled WCF Service "Method not allowed." hatası.

Vay benim garip blogum ben seni çok mu yalnız bıraktıım :)) Zaten başladığım birşeyi hakkıyla devam ettirebilseydim şimdi çook farklı yerlerdeydim.. Neyse serzenişlerim bittiyse gelsin yeni notlarım :)

Yine WCF deryasına daldım. Bu deryada en çok Burak Selim Şenyurt ustanın webinerlerinden faydalanıyorum. Allah razı olsun ne diyeyim :) Tavsiye ederim.. Linki de notlarımda bulunsun:

http://www.buraksenyurt.com/category/WCF-Ogreniyorum.aspx

WCF lerle daha önceki karşılaşmamızı geçen sene paylaşmışım, 1 yıl sonra bloguma girip o postumu görünce çok hoşuma gitti.. Özellikle sıkılmış olduğum kısım şuanki hislerime de tercüman oldu. :)

Ajax-Enabled WCF Service i ilk kullanışım oldu.. Yeni yazılım müdürüm sağolsun paylaşımcılığı ile başarısızlık korkularımı giderdi. takıldığım yerde sorarım güveniyle yine Burak Selim Şenyurt un yaptığı örneği denemeye koyuldum. (Link : http://www.buraksenyurt.com/post/Screencast-AJAX-Enabled-WCF-Services.aspx)

localde çalışırken hiçbir problem yoktu, hatta sadece GET metodum varken iis te yayınlayarak da sorunum yoktu.. Ancak ne zaman devreye POST metodu girdi, devrelerim yanmaya başladı.. Çünkü ne yaptıysam POST metodumda "Method not Allowed" hatasını almaktan kurtulamadım. o forum senin bu forum benim dolaşıp pek çok şey denedim. Olmadı. tecrübesizliğin verdiği yavaşlıkla yarım günümü bu yedi.. Nitekim müdürüme danışmak zorunda kaldım. Kendisi yılların verdiği tecrübeyle "cross" lu bir arama yaptırdı ve sonuca ulaştı. nasıl aramam gerektiğini bilmediğimden kaybetmişim. İşte o cross lu post:

http://stackoverflow.com/a/10936534

Global.asax ıma aşağıdaki kodu kopyaladım ve sorunum çözüldü.

if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
    {
        // this one tells about the supported methods to client.
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods",
                      "GET, POST, OPTIONS");

        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", 
                       "Content-Type, Accept");

        HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");

        HttpContext.Current.Response.End();
    }

Üşenmeyip diğer metodlarımı da paylaşacağım. sonra lazım olabilir.

Servisim:

using System;
using System.IO;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
using System.Web;

namespace BabyService
{
    [ServiceContract(Namespace = "")]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class MyBabyService
    {
        [OperationContract]
        [WebGet(ResponseFormat = WebMessageFormat.Json)]
        public string GetSuggestions(string firstLetter)
        {
            //if (String.IsNullOrWhiteSpace(firstLetter))
            //    throw new WebException("Olmaz ki!");

            return String.Join(",", from name in File.ReadAllLines(HttpContext.Current.Server.MapPath("~/NameList.txt"))
                                    where name.StartsWith(firstLetter, StringComparison.OrdinalIgnoreCase)
                                    select name);
        }

        [OperationContract]
        [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json)]
        public void GetFirstletter(string firstLetter)
        {
            StreamWriter sw = File.AppendText(HttpContext.Current.Server.MapPath("~/POST.txt"));
            sw.WriteLine(firstLetter);
            sw.Flush();
            sw.Close();
        }
    }
}

Client tarafım... 

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm.aspx.cs" Inherits="GetBabyNames.WebForm" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
 <script src="http://code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
 <script type="text/javascript">

     function btnGetSuggestion_Click() {
         var deger = $("#txtName").val();
         $.ajax({

             type: "GET",
             //url: "http://localhost:11524/MyBabyService.svc/GetSuggestions?firstLetter=" + deger,
             url: "http://192.168.44.209/MyBabyService.svc/GetSuggestions?firstLetter=" + deger,
             dataType: "json",
             contentType: "application/json; charset=x-mac-turkish",
             success: function (data) {
                 $("#txtResult").val(data.d);
             },
             error: function (xhr, ajaxOptions, thrownError) {
                 alert(xhr.status);
                 alert(thrownError);

             }
         });
     } 
         function bntPostFirstLetter_Click() {
             var deger = $("#txtName").val();
             $.ajax({
                 type: "POST",
                 //url: "http://localhost:11524/MyBabyService.svc/GetFirstletter",
                 url: "http://192.168.44.209/MyBabyService.svc/GetFirstletter",
                 data: '{"firstLetter": "' + deger + '"}',
                 dataType: "json",
                 contentType:  "application/json; charset=utf-8",
                 varProcessData : true,
                 success: function (data) {
                     alert("Basarili");
                 },
                 error: function (xhr, ajaxOptions, thrownError) {
                     alert(xhr.status);
                     alert(thrownError);
                 } 
             });
     }
     
    </script>
<style>
    #txtResult {
    width:600px;
 }

</style>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        <Services>
            <asp:ServiceReference Path="http://192.168.44.209/MyBabyService.svc" />
        </Services>
    </asp:ScriptManager>
Name<br />
<input type="button" id="bntPostFirstLetter" value="Post" onclick="bntPostFirstLetter_Click()" /><br />
<input type="button" id="bntGetSuggestions" value="İsimBul" onclick="btnGetSuggestion_Click()" /><br />
    Suggestions<br />
 
    </form>
</body>
</html>

Acemilik işte..










11 Mayıs 2012 Cuma

Veritabanındaki Tüm Kayıtları Tablo Yapılarını Bozmadan Silme

Bu seferki notumu ben deneyimlemedim ama çalışma arkadaşım görevini nasıl hallettiğini benimle paylaştı.. Pratik bir çözüm olduğundan notlarımda bulunsun istedim..
Mevzu veritabanımızın tüm kayıtlarını tablo yapılarımızı bozmadan boşaltmaktı. Başka başka şirketlere kurulumlarda pratiklik sağlayacak bir Stored procedure gerekliydi.. Komacaaan bir veri tabanımız olduğundan alt alta updateler deleteler trucateler anlamsız olacaktı; ki tabloların bir dolu bağlantısı keyleri vs vardı.. O zaman biz dee

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
EXEC sp_MSForEachTable 'DELETE FROM ?'
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'

 
kodlarını pratik olarak kullanıp sorunsuzca işimizi hallederiz. :)
Kodumdan gelen bu temiz veritabanını senin için hazırladım.... :P

8 Mayıs 2012 Salı

WCF Services - The maximum message size quota for incoming messages (65536) has been exceeded.



Son birkaç zamandır işlevini bile tam anlamadığım WCF Serviceslarla uğraşıyordum.. Herzamanki gibi mononun laneti vuku buldu ve pek çok gıcık engelle karşılaşıp ondan bundan yardım alaraktan serviceten doğru cevabı alabilip son aşamaya kadar gelebildim. Son aşama dediğim de servisten gelen metodları çalıştırıp sonuçları bir xml dosyasına yazdırmaktı.. Bu kadar basitti yani,, ne olurdu hemencik olsaydı :) Ama olmaaz, eğer hemen olursa uğursuzluk gelir..
Neyse sorunum bu defa da bazı metodların çalışırken
"The maximum message size quota for incoming messages (65536) has been exceeded. bla bla bla"
şeklinde bir hata vermesiydi.. Araştırdım ettim, sorunun app.config dosyasındaki
maxBufferSize ve maxReceivedMessageSize ayarlarıyla olduğunu keşfettim. Gel gelelim bu ayarları ne yaparsam yapayım aynı hatayı almaya devam ettim. Adeta yaptığım değişikliği kaale almıyordu program. Tam çözümü buldum derken olmaması cesaretimi kırmıştı.. Ama sonra bir forumda o şahane postu gördüm.. Linki:

http://forums.asp.net/post/4700212.aspx

Bu linkten hareketle app.config dosyamdaki alanlardan sadece
     maxBufferSize="2147483647"
     maxBufferPoolSize="524288"
     maxReceivedMessageSize="2147483647">
     <readerQuotas
      maxDepth="2147483647"
      maxStringContentLength="2147483647"
      maxArrayLength="2147483647"
      maxBytesPerRead="2147483647"
      maxNameTableCharCount="2147483647" />
ve

<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
alanlarımı değiştirip çalıştırdım. Hatadan eser kalmamıştı..
Her ne kadar WCF lerle uğraşırken çok sıkılmışsam da hatanın çözümünü bulmanın değeri paha biçilemez.
İnternete nasıl teşekkür edeceğimi bilemiyorum :)