কীভাবে এএসপি.নেট ওয়েব এপিআইকে সর্বদা জেএসএনকে ফিরিয়ে দিতে বাধ্য করবেন?


103

এএসপি.নেট ওয়েব এপিআইএলটি ডিফল্টরূপে বিষয়বস্তু আলাপচারিতা করে - এক্সএমএল বা জেএসএন বা অন্যান্য ধরণের Acceptশিরোনামের ভিত্তিতে ফিরে আসবে । আমার এটির প্রয়োজন নেই / চাই না, ওয়েব এপিআইকে সর্বদা জেএসএন ফেরত বলার কোনও উপায় আছে (কোনও বৈশিষ্ট্য বা কোনও কিছুর মতো)?


আপনি জসন ব্যতীত সমস্ত ফর্ম্যাটর অপসারণ করতে এটি করতে সক্ষম হতে পারেনGlobalConfiguration.Configuration.Formatters
ক্লডিও রেডি

উত্তর:


75

এএসপি.নেট ওয়েব এপিআইতে কেবল জেএসনকে সমর্থন করা - সঠিক উপায়

আইসিএনট্যান্টনিজিওয়েটারকে জসনকন্ট্যান্টনিজিওয়েটারের সাথে প্রতিস্থাপন করুন:

var jsonFormatter = new JsonMediaTypeFormatter();
//optional: set serializer settings here
config.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(jsonFormatter));

জসনসন্টেন্টনিগ্রোয়েটার বাস্তবায়ন:

public class JsonContentNegotiator : IContentNegotiator
{
    private readonly JsonMediaTypeFormatter _jsonFormatter;

    public JsonContentNegotiator(JsonMediaTypeFormatter formatter) 
    {
        _jsonFormatter = formatter;    
    }

    public ContentNegotiationResult Negotiate(
            Type type, 
            HttpRequestMessage request, 
            IEnumerable<MediaTypeFormatter> formatters)
    {
        return new ContentNegotiationResult(
            _jsonFormatter, 
            new MediaTypeHeaderValue("application/json"));
    }
}

4
কোডটির প্রথম অংশটি কেটে পেস্ট করা যায় কোথায়? আমি আমার Global.asax এ কোনও "কনফিগারেশন" অবজেক্টটি দেখতে পাচ্ছি না। সেই পরিবর্তনশীল কোথা থেকে আসছে? নিবন্ধটিও ব্যাখ্যা করে না।
বাডিজে

3
প্রকল্প তৈরির ক্ষেত্রে ভিএস ২০১২ দ্বারা গিরিটেড করা WebApiConfig.cs ফাইলটিতে পাবলিক স্ট্যাটিক শূন্য রেজিস্টার (এইচটিটিপি কনফিগারেশন কনফিগারেশন) {...} পদ্ধতি পরীক্ষা করুন
দিমিত্রি পাভলভ

এটি কী জাসনকে এই অর্থে জোর করে যে কোনও ক্লায়েন্ট Acceptইনগ এক্সএমএল জেএসএন পাবে, এবং 406 পাবে না ?
লুক পুপলেট

1
আমি আমার নিজস্ব মন্তব্য / প্রশ্নের উত্তর দিতে পারি: এটি Acceptশিরোনাম যাই হোক না কেন XML প্রদান করে ।
লুক পুপলেট

2
এটি আমার স্বশবাকল ইন্টিগ্রেশনকে ভঙ্গ করে এবং মনে হচ্ছে এটি গিথুব ( github.com/domaindrivendev/Swashbuckle/issues/219 ) এ এই সমস্যার সাথে সম্পর্কিত । আমি এই পদ্ধতিটি ব্যবহার করতে চাই তবে নীচের একটিটি GlobalConfiguration...Clear()আসলে ব্যবহার করে।
seangwright

167

সমস্ত ফর্ম্যাটর সাফ করুন এবং জসন ফর্ম্যাটরটি আবার যুক্ত করুন।

GlobalConfiguration.Configuration.Formatters.Clear();
GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter());

সম্পাদনা

আমি এটি Global.asaxভিতরে ভিতরে যোগ Application_Start()


এবং কোন ফাইল .. ?? global.ascx .. ??
শাশ্বত

আপনার অ্যাপ্লিকেশন_সার্ট () পদ্ধতিতে
জাফিন

6
ফিলিপ ডব্লিউ এখন আরও ভাল উপায় পেয়েছে :), এখানে দেখুন strathweb.com/2013/06/…
টিয়ান ডো

7
@ টিয়েনডো - ফিলিপের নিজস্ব ব্লগের সাথে সংযুক্ত?
ফিল করুন

10

ফিলিপ ডাব্লু এর সঠিক উত্তর ছিল তবে স্বচ্ছতা এবং সম্পূর্ণ কার্যক্ষম সমাধানের জন্য আপনার Global.asax.cs ফাইলটি দেখতে দেখতে এটি সম্পাদনা করুন: (লক্ষ্য করুন আমাকে রেফারেন্স System.Net.Http. স্টক উত্পন্ন ফাইলটিতে ফর্ম্যাটিং করতে হবে)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Formatting;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;

namespace BoomInteractive.TrainerCentral.Server {
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801

    public class WebApiApplication : System.Web.HttpApplication {
        protected void Application_Start() {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            //Force JSON responses on all requests
            GlobalConfiguration.Configuration.Formatters.Clear();
            GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter());
        }
    }
}

9
GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();

এটি এক্সএমএল ফর্ম্যাটারটি সাফ করে এবং এভাবে JSON ফর্ম্যাটে ডিফল্ট হয়।


প্রয়োজনীয় সমস্ত
কিছুর

4

দিমিত্রি পাভলভের দুর্দান্ত উত্তরের দ্বারা অনুপ্রাণিত হয়ে আমি এটিকে কিছুটা পরিবর্তন করেছি যাতে আমি যে ফর্ম্যাটরটি প্রয়োগ করতে চাই সেগুলি প্লাগ-ইন করতে পারি।

দিমিত্রি Creditণ।

/// <summary>
/// A ContentNegotiator implementation that does not negotiate. Inspired by the film Taken.
/// </summary>
internal sealed class LiamNeesonContentNegotiator : IContentNegotiator
{
    private readonly MediaTypeFormatter _formatter;
    private readonly string _mimeTypeId;

    public LiamNeesonContentNegotiator(MediaTypeFormatter formatter, string mimeTypeId)
    {
        if (formatter == null)
            throw new ArgumentNullException("formatter");

        if (String.IsNullOrWhiteSpace(mimeTypeId))
            throw new ArgumentException("Mime type identifier string is null or whitespace.");

        _formatter = formatter;
        _mimeTypeId = mimeTypeId.Trim();
    }

    public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
    {
        return new ContentNegotiationResult(_formatter, new MediaTypeHeaderValue(_mimeTypeId));
    }
}

2

আপনি যদি কেবল একটি পদ্ধতির জন্য এটি করতে চান, তবে আপনার পদ্ধতিটি ফিরে আসার HttpResponseMessageপরিবর্তে ঘোষণা করুন IEnumerable<Whatever>এবং করুন:

    public HttpResponseMessage GetAllWhatever()
    {
        return Request.CreateResponse(HttpStatusCode.OK, new List<Whatever>(), Configuration.Formatters.JsonFormatter);
    }

এই কোডটি ইউনিট পরীক্ষার জন্য বেদনাদায়ক তবে এটি এর মতো এটিও সম্ভব:

    sut = new WhateverController() { Configuration = new HttpConfiguration() };
    sut.Configuration.Formatters.Add(new Mock<JsonMediaTypeFormatter>().Object);
    sut.Request = new HttpRequestMessage();

যদি আপনি কোনও পদ্ধতির জন্য কিছু চান তবে কেবল একটি এমএসডিএন.ইমক্রিফটিও
এলিজাবেথ

2

এটিতে সঠিক শিরোনাম রয়েছে। আরও কিছুটা মার্জিত বলে মনে হচ্ছে।

public JsonResult<string> TestMethod() 
{
return Json("your string or object");
}

1
জসোনারসাল্ট এবং জসন ক্লাসগুলির জন্য সম্পূর্ণরূপে যোগ্য নাম কি?
জোশ উইথে ডিসি


0

আপনি WebApiConfig.cs এ ব্যবহার করতে পারেন:

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));

0

OWIN ব্যবহারকারীদের জন্য

GlobalConfiguration.Configuration.Formatters.Clear();
GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter());

(স্টার্টআপ। সি) এ পরিণত হয়:

   public void Configuration(IAppBuilder app)
        {
            OwinConfiguration = new HttpConfiguration();
            ConfigureOAuth(app);

            OwinConfiguration.Formatters.Clear();
            OwinConfiguration.Formatters.Add(new DynamicJsonMediaTypeFormatter());

            [...]
        }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.