如何创建可以从外部站点获取请求的ASP.NET MVC控制器?

时间:2016-02-12 23:00:38

标签: c# asp.net asp.net-mvc

我想要一个像

这样的控制器
public ActionResult UnlockAssets ( string psd ) 
{
    // ... 
}

外部站点可以调用并返回JSON。这可能吗?如果是这样,我从哪里开始?

3 个答案:

答案 0 :(得分:3)

您可能需要Web API(http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api

这是一个简单的例子

using System;
using System.Linq;
using System.Net;
using System.Web.Http;


 public class DocumentsController : ApiController
{
    public IHttpActionResult UnlockAssets (string psd )
    {
        var documents = new DocumentRepo();
        if (!documents.Exists(psd))
        {
            return NotFound();
        }else{
            documents.unlock(psd)
            return Ok(product);
        }
    }
}

答案 1 :(得分:2)

是的,外部站点可能会通过Ajax调用您的控制器。

外部站点将具有Ajax的Javascript函数,该函数将调用url:

http://www.yourwebsite.com/yourcontrollername/UnlockAssets?psd=value

您的响应可以是JSON,您可以使用ActionResult签名并返回JSON,但格式化可能已关闭且标头响应标头可能不正确,不要说您对请求者/客户端有JSON响应。

因此,这将是适用于您的控制器的正确的ASP.NET MVC签名方法

[HttpGet] //or [HttpPost] or both
public JsonResult UnlockAssets ( string psd ) 
{
    return Json(new { foo = "blah"}); 
    //or
    return Json(someinstanceofaclassofyours); 
}

您不需要像其他人建议的Web API,您可能更喜欢Web API,但实际上它只取决于适合您的时间,您的时间表,客户在调用服务器时需要的内容,架构的复杂性,客户需求的复杂性。

普通的ASP.NET MVC应用程序控制器可以在简单的体系结构(甚至是复杂的体系结构)中充当“API”,并且可以很好地满足外部客户端的需求。该控制器可以为您的ASP.NET MVC站点提供服务器视图,并将JSON返回给外部调用者。如果控制器看起来像是组织架构的正确方法,那就好了。

在做出架构决策时,您可能会认为Web API在构建客户端要使用的实际API时更合适,此API将具有文档,为客户端调用者公开各种方法,是健壮的。 Web API也可用于客户端调用的简单方法。没有正确或错误的选择它更适合这项工作。

我想说,如果你有模型,实体框架已经在ASP.NET MVC应用程序中交织在一起,而你只是有一个尝试向外部客户端公开的方法,那么你看不到你的MVC应用程序快速增长失控,只需使用控制器。否则,可以通过向现有MVC项目添加Web API或者最好在解决方案中添加新的Web API项目来使用Web API。

答案 2 :(得分:0)

您需要一个Web API。为此,右键单击controllers文件夹并添加Web API控制器ex -

public IEnumerable<Claim> Get()
{
    var principal = (User as ClaimsPrincipal);
    List<Claim> claimsList = new List<Claim>();
    foreach (var claim in principal.Claims)
    {
        claimsList.Add(claim);
    }
    return claimsList;
}

然后,如果没有自动生成,则需要添加WebAPI.config文件,并将以下代码添加到其中。

public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
        name: "DefaultDataApi",
        routeTemplate: "Api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}
}

在global.asax.cs

中的Application_Start()方法中添加以下行
GlobalConfiguration.Configure(WebApiConfig.Register);

确保在

之前添加上面的行
RouteConfig.RegisterRoutes(RouteTable.Routes)

否则它将无效。 现在您的外部站点只需要访问该控制器的URL。希望能解决问题