4 Temmuz 2013 Perşembe

Ajax-Enabled WCF Service'a json ve jquery ile kompleks veri gönderimi...



Gayet açıklayıcı bir başlık oldu :) 

Amacımız client taraftan kompleks bir veri tipini alıp servis aracılığıyla veritabanına kaydetmekti.. her zamanki gibi yeni bir proje oluşturdum, property classımı ve metodlarımı yazdım.. herşey güzel gidiyordu ki laaps diye

Operation 'SaveTextbox' in contract 'FormSavingService' has a query variable named 'text' of type 'About_Form.Dat', but type 'About_Form.Dat' is not convertible by 'QueryStringConverter'. ÿVariables for UriTemplate query values must have types that can be converted by 'QueryStringConverter'.

hatasını aldım. birşey de sorunsuz gitse şaşardım zaten. Neyse yarım gün bu hatayı nasıl çözerim diye uğraştım, millet forumlarda özel metodlar yazmış queryStringConverter için.. Hiç uğraşasım gelmedi..
Ne mi yaptım? Sıfırdan yeni proje oluşturup kodları içine kopyaladım ve hatadan eser yoktu.. :D Ya sabır.. 

Neyse sonuç olarak artık "dat" tipinde değişken alan metodlarıma veri göndermeyi deneyebilirdim. Ve jqueryci arkadaşın yardımıyla denedim. Evet belki bir çılgınlıktı, ama bunu yaptım! :)p

Bir de Transaction ımı complete demeyi unutmasaydım 3 saat neden başarılı diyor da kaydetmiyooor diye kafayı yiycek duruma gelmezdim. :S Bu da bana ders olsun. 

işte de kodlarım..

property classım'ın bir kısmı..

using System;
using System.Runtime.Serialization;

namespace FormSaving2
{
    public class SavingProperties
    {
        [DataContract]
        public class Dat
        {
            [DataMember]
            public string Text { get; set; }
            [DataMember]
            public Guid AssetId { get; set; }
            [DataMember]
            public Guid MasterTypeId { get; set; }
            [DataMember]
            public Guid SecurityId { get; set; }
            [DataMember]
            public Guid UserId { get; set; }
            [DataMember]
            public Guid PageId { get; set; }
            [DataMember]
            public Guid TypeId { get; set; }
        }
  }


Metodlarımdan bir adet örnek;

using Harmony.TL.DAL;
using System;
using System.IO;
using System.Transactions;
using System.Web;

namespace FormSaving2
{
    public class SavingFunction
    {
        private readonly HarmonyEntities _HarmonyEntities;

        public SavingFunction()
        {
            _HarmonyEntities = DatabaseEntities.GetEntities;

        }

        public void SaveTextbox(FormSaving2.SavingProperties.Dat text)
        {
            this.SaveWithText(text);
        }

 private void SaveWithText(FormSaving2.SavingProperties.Dat text)
        {

            _HarmonyEntities.AddToVDB_ASSET_INFORMATIONS(new VDB_ASSET_INFORMATIONS
            {
                GUID = Guid.NewGuid(),
                GUID_ASSET = text.AssetId,
                GUID_TYPE = text.TypeId,
                GUID_PARENT = text.MasterTypeId,
                GUID_USER = text.UserId,
                PRM0 = text.Text,
                PRM1 = 1,
                TIMESTAMP = DateTime.Now,
                GUID_SECURITY = text.SecurityId
            });

            using (TransactionScope ts = new TransactionScope())
            {
                _HarmonyEntities.SaveChanges();

                ts.Complete();
            }

        }
  }



Servisimden metodumu çağırışım;


using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;

namespace FormSaving2.Service
{
    [ServiceContract(Namespace = "")]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class FormSavingService
    {

        FormSaving2.SavingFunction fs = new SavingFunction();

        [OperationContract]
        [WebGet(ResponseFormat = WebMessageFormat.Json)]
        public void SaveTextbox(FormSaving2.SavingProperties.Dat text)
        {
            fs.SaveTextbox(text);
        }
 }



Client taraftan servise veri gönderişim.. (test değerleri verdim)..

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

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title></title>
    <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
</head>
<body>
    <form id="form1" runat="server">
   <script>

       function Get_Click() {
           var data = [];
           var dat = {
               AssetId: "5ba23c6e-07e3-4932-ba2f-f4f557c9dce5",
               MasterTypeId: "5ba23c6e-07e3-4932-ba2f-f4f557c9dce5",
               PageId: "5ba23c6e-07e3-4932-ba2f-f4f557c9dce5",
               SecurityId: "5ba23c6e-07e3-4932-ba2f-f4f557c9dce5",
               Text: $("#txtName").val(),
               TypeId: "5ba23c6e-07e3-4932-ba2f-f4f557c9dce5",
               UserId: "5ba23c6e-07e3-4932-ba2f-f4f557c9dce5"
           }
           data.push(dat);                 

           $.ajax({
               type: "GET",              
               url: "http://localhost:3301/FormSavingService.svc/SaveTextbox?text=" +       JSON.stringify(dat), 
               dataType: "json",
               varProcessData: true,
               contentType: "application/json; charset=utf-8",
               success: function (data) {
                   $("body").append("Basarılı");
               },
               error: function (xhr, ajaxOptions, thrownError) {
                   alert(xhr.status);
                   alert(thrownError);
               }
           });

       }

   </script>       
          
        <input type="text" id="txtName"  name="Gonder" />
        <input type="button"  name="Gonder" value="Gonder" onclick="Get_Click()"/>
       
    </form>
</body>
</html>



işte de böyle oldu, iyi oldu çok da güzel iyi oldu taam mı? 

Tabi bunları yapıp da servisinize Global.asax eklemeyi unutursanız not allowed hatası alabiliriteniz var.. üşenmeyeyim onu da ekleyeyim..

        protected void Application_BeginRequest(object sender, EventArgs e)
        {
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");

            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();
            }
        }

Emeği geçen arkadaş(lar)a teşekkür ederim. :)
Sağlıcakla kalın, esen kalın sayın cinlerim..

Hiç yorum yok:

Yorum Gönder