{"id":564,"date":"2016-03-08T23:06:16","date_gmt":"2016-03-08T21:06:16","guid":{"rendered":"https:\/\/gokhan-gokalp.com\/?p=564"},"modified":"2017-02-14T10:38:14","modified_gmt":"2017-02-14T08:38:14","slug":"asp-net-web-api-responselarinda-tutarliligi-consistency-saglamak","status":"publish","type":"post","link":"https:\/\/gokhan-gokalp.com\/tr\/asp-net-web-api-responselarinda-tutarliligi-consistency-saglamak\/","title":{"rendered":"Asp.NET Web API Response&#8217;lar\u0131nda Tutarl\u0131l\u0131\u011f\u0131 (Consistency) Sa\u011flamak"},"content":{"rendered":"<p>Merhaba arkada\u015flar, bir s\u00fcredir blo\u011fuma \u00e7ok fazla vakit ay\u0131ram\u0131yorum. Gerek i\u015f yerimdeki yo\u011funlu\u011fumdan, gerek haz\u0131rlan\u0131yor oldu\u011fum sertifikasyon s\u0131navlar\u0131ndan, gereksede \u00fczerinde \u00e7al\u0131\u015f\u0131yor oldu\u011fumuz\u00a0Asp.NET Web API kitab\u0131ndan dolay\u0131 fazla vakit bulamamaktay\u0131m.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/03\/consistency.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-565 lazyload\" data-src=\"\/wp-content\/uploads\/2016\/03\/consistency.jpg\" alt=\"consistency\" width=\"600\" height=\"300\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/03\/consistency.jpg 600w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/03\/consistency-300x150.jpg 300w\" data-sizes=\"(max-width: 600px) 100vw, 600px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 600px; --smush-placeholder-aspect-ratio: 600\/300;\" \/><\/a><\/p>\n<p>Konusu k\u00fc\u00e7\u00fck fakat etkisi b\u00fcy\u00fck olan bu konuyu payla\u015fmak istedim. Evet konumuz Asp.NET Web API \u00fczerindeki response&#8217;lar\u0131m\u0131z\u0131n <strong>tutarl\u0131l\u0131\u011f\u0131n\u0131<\/strong> (Consistency) sa\u011flamak. Bu konunun \u00f6nemli olmas\u0131n\u0131n sebebi ise: Asp.NET Web API ile RESTful mimarisinde bir servis geli\u015ftirdi\u011fimiz i\u00e7in, client ilgili servisimizi t\u00fcketirken GET, PUT, POST gibi <strong>HTTP verbs<\/strong>&#8216;lerini kullanacakt\u0131r. \u0130lgili servisimiz response olarak bazen istenilen DTO (Data Transfer Object)&#8217;yu geriye d\u00f6nerken, bazende\u00a0response body&#8217;i bo\u015f d\u00f6nerek bununla birlikte Header \u00fczerinden bir bilgi geriye d\u00f6n\u00fcyor olabilir. Bazende client&#8217;\u0131n beklenmedik bir request g\u00f6ndermesi \u00fczerine geriye bir hata mesaj\u0131 da d\u00f6n\u00fcyor olabiliriz. \u0130\u015fte bu gibi durumlar\u0131 tutarl\u0131 bir \u015fekilde handle edebilmek i\u00e7in, client&#8217;a <strong>her seferinde farkl\u0131 bir response structure<\/strong>&#8216;\u0131 sunmamam\u0131z gerekir.<\/p>\n<p>\u00d6yle bir response structure&#8217;\u0131 olu\u015ftural\u0131m ki client ilgili\u00a0servisin versiyon numaras\u0131n\u0131 (versiyonlama i\u015flemleri i\u00e7in), i\u015flemlerin\u00a0http status kodlar\u0131n\u0131 ve hatta bir hata meydana geldi ise hangi alan\u0131 kontrol etmesi gerekti\u011fi gibi bilgileri verebilmeliyiz.<\/p>\n<p>Haydi \u015fimdi biraz kodlamaya ge\u00e7elim. :) \u00d6ncelikle yukar\u0131da bahsetmi\u015f oldu\u011fumuz bu sihirli response structure&#8217;\u0131m\u0131z\u0131 olu\u015ftural\u0131m (Best practice&#8217;ler \u00fczerinde de g\u00f6rebilirsiniz.)<\/p>\n<pre class=\"lang:c# decode:true\">[DataContract]\r\npublic class ApiResponse&lt;T&gt;\r\n{\r\n    public ApiResponse(HttpStatusCode statusCode, T result, string errorMessage = null)\r\n    {\r\n        StatusCode = (int)statusCode;\r\n        Result = result;\r\n        ErrorMessage = errorMessage;\r\n    }\r\n\r\n    public ApiResponse()\r\n    {\r\n\r\n    }\r\n\r\n    [DataMember]\r\n    public string Version { get { return \"1.0\"; } }\r\n\r\n    [DataMember]\r\n    public int StatusCode { get; set; }\r\n\r\n    [DataMember(EmitDefaultValue = false)]\r\n    public string ErrorMessage { get; set; }\r\n\r\n    [DataMember(EmitDefaultValue = false)]\r\n    public T Result { get; set; }\r\n}<\/pre>\n<p><strong>ApiResponse&lt;T&gt;<\/strong> isminde generic olarak s\u0131n\u0131f\u0131m\u0131z\u0131 olu\u015fturuyoruz. Kod \u00fczerinde de g\u00f6rebildi\u011fimiz gibi,\u00a0&#8220;Version&#8221;, &#8220;StatusCode&#8221;, &#8220;ErrorMessage&#8221; ve ilgili response DTO&#8217;sunu veriyor olaca\u011f\u0131m\u0131z &#8220;Result&#8221; parametrelerini, constructor arac\u0131l\u0131\u011f\u0131 ile doldurulabilmesini sa\u011flad\u0131k. Dikkat ederseniz ApiResponse&lt;T&gt; class&#8217;\u0131n\u0131\u00a0ve property&#8217;leri &#8220;<strong>DataContract<\/strong>&#8221; ve &#8220;<strong>DataMember<\/strong>&#8221; attribute&#8217;leri ile donatt\u0131k. Opt-out olarak donatt\u0131\u011f\u0131m\u0131z bu attribute&#8217;ler, response&#8217;un serialization i\u015flemi s\u0131ras\u0131nda diledi\u011fimiz propety&#8217;lerin serialize i\u015flemine tabi olmas\u0131n\u0131 ve belirtmi\u015f oldu\u011fumuz &#8220;EmitDefaultValue&#8221; de\u011ferinin (yani herhangi bir value yoksa default value&#8217;su ile bunlar\u0131 yaratma) ge\u00e7erli olabilmesini sa\u011flamaktad\u0131r.<\/p>\n<p>Evet\u00a0response structure&#8217;\u0131m\u0131z\u0131 belirledi\u011fimize g\u00f6re \u015fimdi bunu Asp.NET Web API i\u00e7erisine \u00f6yle bir implemente edelim ki, hi\u00e7bir \u015fey yapmam\u0131za gerek kalmadan, Web API handler&#8217;lar\u0131 bu i\u015flemi her response i\u00e7in ger\u00e7ekle\u015ftirsin.<\/p>\n<p>Evet Handler ipucunu verdi\u011fimize g\u00f6re hemen handler&#8217;\u0131 olu\u015fturmaya ba\u015flayal\u0131m.<\/p>\n<pre class=\"lang:c# decode:true\">public class ApiResponseHandler : DelegatingHandler\r\n{\r\n    protected override async System.Threading.Tasks.Task&lt;HttpResponseMessage&gt; SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)\r\n    {\r\n        var response = await base.SendAsync(request, cancellationToken);\r\n\r\n        return BuildApiResponse(request, response);\r\n    }\r\n\r\n    private static HttpResponseMessage BuildApiResponse(HttpRequestMessage request, HttpResponseMessage response)\r\n    {\r\n        object content = null;\r\n        string errorMessage = string.Empty;\r\n\r\n        ValidateResponse(response, ref content, ref errorMessage);\r\n\r\n        \/\/ Yeni response'u custom olarak olu\u015fturmu\u015f oldu\u011fumuz wrapper s\u0131n\u0131f ile ba\u015ftan olu\u015fturuyoruz.\r\n        var newResponse = CreateHttpResponseMessage(request, response, content, errorMessage);\r\n\r\n        \/\/ Header key'lerini ba\u015ftan set et.\r\n        foreach (var loopHeader in response.Headers)\r\n        {\r\n            newResponse.Headers.Add(loopHeader.Key, loopHeader.Value);\r\n        }\r\n\r\n        return newResponse;\r\n    }\r\n\r\n    private static HttpResponseMessage CreateHttpResponseMessage&lt;T&gt;(HttpRequestMessage request, HttpResponseMessage response, T content, string errorMessage)\r\n    {\r\n        return request.CreateResponse(response.StatusCode, new ApiResponse&lt;T&gt;(response.StatusCode, content, errorMessage));\r\n    }\r\n\r\n    private static void ValidateResponse(HttpResponseMessage response, ref object content, ref string errorMessage)\r\n    {\r\n        if (response.TryGetContentValue(out content) &amp;&amp; !response.IsSuccessStatusCode)\r\n        {\r\n            HttpError error = content as HttpError;\r\n\r\n            if (error != null)\r\n            {\r\n                content = null;\r\n                StringBuilder sb = new StringBuilder();\r\n\r\n                foreach (var loopError in error)\r\n                {\r\n                    sb.Append(string.Format(\"{0}: {1} \", loopError.Key, loopError.Value));\r\n                }\r\n\r\n                errorMessage = sb.ToString();\r\n            }\r\n        }\r\n    }\r\n}<\/pre>\n<p>ApiResponse structure&#8217;\u0131n\u0131n handler&#8217;\u0131n\u0131, DelegatingHandler abstract class&#8217;\u0131ndan yararlanarak olu\u015fturduk. <strong>SendAsync<\/strong> method&#8217;unu override ederek, <strong>BuildApiResponse<\/strong> method&#8217;u ile as\u0131l wrapping\u00a0i\u015flemi ba\u015flam\u0131\u015f oluyor. BuildApiResponse method&#8217;u i\u00e7erisinde yapt\u0131\u011f\u0131m\u0131z ana i\u015flem ise, request \u00fczerinden ilgili <strong>content<\/strong>&#8216;i veya <strong>hata<\/strong>&#8216;y\u0131 yakalay\u0131p\u00a0<strong>CreateHttpResponseMessage<\/strong> method&#8217;u arac\u0131l\u0131\u011f\u0131 ile request \u00fczerinden tekrardan bir Response yaratmakt\u0131r. Yaratm\u0131\u015f oldu\u011fumuz yeni response&#8217;un\u00a0content&#8217;ini ApiResponse&lt;T&gt; structure&#8217;\u0131 ile belirliyoruz. Bu sayede client response&#8217;u belirlemi\u015f oldu\u011fumuz structure do\u011frultusunda al\u0131yor olacakt\u0131r.<\/p>\n<p>\u015eimdi geriye kalan son ad\u0131m ise olu\u015fturdu\u011fumuz bu ApiResponseHandler&#8217;\u0131, WebApiConfig i\u00e7erisinde bulunan MessageHandlers i\u00e7erisine eklemektir.<\/p>\n<pre class=\"lang:c# decode:true\">public static class WebApiConfig\r\n{\r\n    public static void Register(HttpConfiguration config)\r\n    {\r\n        \/\/ Custom olu\u015fturdu\u011fumuz message handler'lar\u0131 burada register ediyoruz.\r\n        config.MessageHandlers.Add(new ApiResponseHandler());\r\n    }\r\n}<\/pre>\n<p>\u0130\u015fte\u00a0hepsi bu kadar. Art\u0131k\u00a0api controller i\u00e7erisindeki her bir action method, ApiResponse&lt;T&gt; generic s\u0131n\u0131f\u0131 ile wrapping i\u015fleminden ge\u00e7erek\u00a0a\u015fa\u011f\u0131daki gibi \u00f6rnek bir Json \u00e7\u0131kt\u0131s\u0131\u00a0\u00fcretecektir.<\/p>\n<pre class=\"lang:c# decode:true \">{\r\n    Version: \"1.0\",\r\n    StatusCode: 200,\r\n    Result: {\r\n        Id: 1,\r\n        Username: \"GokhanGokalp\",\r\n        Fullname: \"G\u00f6khan G\u00f6kalp\",\r\n        Mail: \"gok.gokalp@yahoo.com\"\r\n    }\r\n}<\/pre>\n<h5>Kaynak:<\/h5>\n<blockquote><p>http:\/\/www.devtrends.co.uk\/blog\/wrapping-asp.net-web-api-responses-for-consistency-and-to-provide-additional-information<\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Merhaba arkada\u015flar, bir s\u00fcredir blo\u011fuma \u00e7ok fazla vakit ay\u0131ram\u0131yorum. Gerek i\u015f yerimdeki yo\u011funlu\u011fumdan, gerek haz\u0131rlan\u0131yor oldu\u011fum sertifikasyon s\u0131navlar\u0131ndan, gereksede \u00fczerinde \u00e7al\u0131\u015f\u0131yor oldu\u011fumuz\u00a0Asp.NET Web API kitab\u0131ndan dolay\u0131 fazla vakit bulamamaktay\u0131m. Konusu k\u00fc\u00e7\u00fck fakat etkisi b\u00fcy\u00fck olan bu konuyu payla\u015fmak istedim. Evet konumuz Asp.NET Web API \u00fczerindeki&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/gokhan-gokalp.com\/tr\/asp-net-web-api-responselarinda-tutarliligi-consistency-saglamak\/\">Devam\u0131n\u0131 okuyun<span class=\"screen-reader-text\">Asp.NET Web API Response&#8217;lar\u0131nda Tutarl\u0131l\u0131\u011f\u0131 (Consistency) Sa\u011flamak<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[48],"tags":[166,165,163,164],"class_list":["post-564","post","type-post","status-publish","format-standard","hentry","category-asp-net-web-api","tag-asp-net-web-api-handler","tag-asp-net-web-api-messagehandler","tag-asp-net-web-api-response","tag-asp-net-web-api-response-consistency","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"tr","enabled_languages":["en","tr"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"tr":{"title":false,"content":false,"excerpt":false}}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Asp.NET Web API Response&#039;lar\u0131nda Tutarl\u0131l\u0131\u011f\u0131 (Consistency) Sa\u011flamak - G\u00f6khan G\u00f6kalp<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/gokhan-gokalp.com\/asp-net-web-api-responselarinda-tutarliligi-consistency-saglamak\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Asp.NET Web API Response&#039;lar\u0131nda Tutarl\u0131l\u0131\u011f\u0131 (Consistency) Sa\u011flamak - G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gokhan-gokalp.com\/asp-net-web-api-responselarinda-tutarliligi-consistency-saglamak\/\" \/>\n<meta property=\"og:site_name\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"article:published_time\" content=\"2016-03-08T21:06:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-02-14T08:38:14+00:00\" \/>\n<meta name=\"author\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/asp-net-web-api-responselarinda-tutarliligi-consistency-saglamak\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/asp-net-web-api-responselarinda-tutarliligi-consistency-saglamak\\\/\"},\"author\":{\"name\":\"G\u00f6khan G\u00f6kalp\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"headline\":\"Asp.NET Web API Response&#8217;lar\u0131nda Tutarl\u0131l\u0131\u011f\u0131 (Consistency) Sa\u011flamak\",\"datePublished\":\"2016-03-08T21:06:16+00:00\",\"dateModified\":\"2017-02-14T08:38:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/asp-net-web-api-responselarinda-tutarliligi-consistency-saglamak\\\/\"},\"wordCount\":599,\"commentCount\":13,\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"keywords\":[\"Asp.Net Web Api Handler\",\"Asp.Net Web Api MessageHandler\",\"Asp.Net Web Api Response\",\"Asp.Net Web Api Response Consistency\"],\"articleSection\":[\"Asp.Net Web API\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/asp-net-web-api-responselarinda-tutarliligi-consistency-saglamak\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/asp-net-web-api-responselarinda-tutarliligi-consistency-saglamak\\\/\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/asp-net-web-api-responselarinda-tutarliligi-consistency-saglamak\\\/\",\"name\":\"Asp.NET Web API Response'lar\u0131nda Tutarl\u0131l\u0131\u011f\u0131 (Consistency) Sa\u011flamak - G\u00f6khan G\u00f6kalp\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\"},\"datePublished\":\"2016-03-08T21:06:16+00:00\",\"dateModified\":\"2017-02-14T08:38:14+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/asp-net-web-api-responselarinda-tutarliligi-consistency-saglamak\\\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/asp-net-web-api-responselarinda-tutarliligi-consistency-saglamak\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/asp-net-web-api-responselarinda-tutarliligi-consistency-saglamak\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Asp.NET Web API Response&#8217;lar\u0131nda Tutarl\u0131l\u0131\u011f\u0131 (Consistency) Sa\u011flamak\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"description\":\"C# &amp; Python lover\",\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gokhan-gokalp.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"pronouns\":\"he\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"caption\":\"G\u00f6khan G\u00f6kalp\"},\"logo\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\"},\"sameAs\":[\"https:\\\/\\\/gokhan-gokalp.com\"],\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/tr\\\/author\\\/gok-gokalp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Asp.NET Web API Response'lar\u0131nda Tutarl\u0131l\u0131\u011f\u0131 (Consistency) Sa\u011flamak - G\u00f6khan G\u00f6kalp","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/gokhan-gokalp.com\/asp-net-web-api-responselarinda-tutarliligi-consistency-saglamak\/","og_locale":"tr_TR","og_type":"article","og_title":"Asp.NET Web API Response'lar\u0131nda Tutarl\u0131l\u0131\u011f\u0131 (Consistency) Sa\u011flamak - G\u00f6khan G\u00f6kalp","og_url":"https:\/\/gokhan-gokalp.com\/asp-net-web-api-responselarinda-tutarliligi-consistency-saglamak\/","og_site_name":"G\u00f6khan G\u00f6kalp","article_published_time":"2016-03-08T21:06:16+00:00","article_modified_time":"2017-02-14T08:38:14+00:00","author":"G\u00f6khan G\u00f6kalp","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"G\u00f6khan G\u00f6kalp","Tahmini okuma s\u00fcresi":"4 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gokhan-gokalp.com\/asp-net-web-api-responselarinda-tutarliligi-consistency-saglamak\/#article","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/asp-net-web-api-responselarinda-tutarliligi-consistency-saglamak\/"},"author":{"name":"G\u00f6khan G\u00f6kalp","@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"headline":"Asp.NET Web API Response&#8217;lar\u0131nda Tutarl\u0131l\u0131\u011f\u0131 (Consistency) Sa\u011flamak","datePublished":"2016-03-08T21:06:16+00:00","dateModified":"2017-02-14T08:38:14+00:00","mainEntityOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/asp-net-web-api-responselarinda-tutarliligi-consistency-saglamak\/"},"wordCount":599,"commentCount":13,"publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"keywords":["Asp.Net Web Api Handler","Asp.Net Web Api MessageHandler","Asp.Net Web Api Response","Asp.Net Web Api Response Consistency"],"articleSection":["Asp.Net Web API"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gokhan-gokalp.com\/asp-net-web-api-responselarinda-tutarliligi-consistency-saglamak\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gokhan-gokalp.com\/asp-net-web-api-responselarinda-tutarliligi-consistency-saglamak\/","url":"https:\/\/gokhan-gokalp.com\/asp-net-web-api-responselarinda-tutarliligi-consistency-saglamak\/","name":"Asp.NET Web API Response'lar\u0131nda Tutarl\u0131l\u0131\u011f\u0131 (Consistency) Sa\u011flamak - G\u00f6khan G\u00f6kalp","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/#website"},"datePublished":"2016-03-08T21:06:16+00:00","dateModified":"2017-02-14T08:38:14+00:00","breadcrumb":{"@id":"https:\/\/gokhan-gokalp.com\/asp-net-web-api-responselarinda-tutarliligi-consistency-saglamak\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gokhan-gokalp.com\/asp-net-web-api-responselarinda-tutarliligi-consistency-saglamak\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/gokhan-gokalp.com\/asp-net-web-api-responselarinda-tutarliligi-consistency-saglamak\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gokhan-gokalp.com\/"},{"@type":"ListItem","position":2,"name":"Asp.NET Web API Response&#8217;lar\u0131nda Tutarl\u0131l\u0131\u011f\u0131 (Consistency) Sa\u011flamak"}]},{"@type":"WebSite","@id":"https:\/\/gokhan-gokalp.com\/#website","url":"https:\/\/gokhan-gokalp.com\/","name":"G\u00f6khan G\u00f6kalp","description":"C# &amp; Python lover","publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gokhan-gokalp.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe","name":"G\u00f6khan G\u00f6kalp","pronouns":"he","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","url":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","caption":"G\u00f6khan G\u00f6kalp"},"logo":{"@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659"},"sameAs":["https:\/\/gokhan-gokalp.com"],"url":"https:\/\/gokhan-gokalp.com\/tr\/author\/gok-gokalp\/"}]}},"_links":{"self":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/564","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/comments?post=564"}],"version-history":[{"count":6,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/564\/revisions"}],"predecessor-version":[{"id":1067,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/564\/revisions\/1067"}],"wp:attachment":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media?parent=564"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/categories?post=564"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/tags?post=564"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}