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


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.