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..










Hiç yorum yok:

Yorum Gönder