如何制作可以接受来自外部站点的请求的 ASP.NET MVC 控制器?

Posted

技术标签:

【中文标题】如何制作可以接受来自外部站点的请求的 ASP.NET MVC 控制器?【英文标题】:How do I make an ASP.NET MVC controller that can take requests from an external site? 【发布时间】:2016-05-24 06:09:05 【问题描述】:

我想要一个像

这样的控制器
public ActionResult UnlockAssets ( string psd ) 

    // ... 

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

【问题讨论】:

您的主要障碍将是克服大多数浏览器强制执行的同源策略。您可以先阅读它和解决方案(Cors、JSONP 等) 你应该看看WebApi 而不是 我不明白为什么你不能只使用 WebClient 或通过 javascript 调用方法 yourdomain.com/controller/action 你不需要 WebApi。你可以在 MVC 中做同样的事情,但你需要考虑 CORS。看看这个问题***.com/questions/6290053/… (codeproject.com/Articles/866143/Learn-MVC-Project-in-days-Day) 【参考方案1】:

是的,例如,外部站点可能会通过 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 应用程序快速增长并且失控,只需使用控制器。否则,通过将 Web API 添加到现有 MVC 项目或最好将新的 Web API 项目添加到解决方案来使用 Web API。

【讨论】:

我还以为会这么琐碎,不知道是不是漏了什么 如果你以前看过的话,这当然是微不足道的;)【参考方案2】:

您可能想要一个 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);
        
    

【讨论】:

以上是关于如何制作可以接受来自外部站点的请求的 ASP.NET MVC 控制器?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 netcat 接受来自 LAN 外部的连接?

如何防止 iFrame 中的 JavaScript 访问外部站点的属性,即使 iFrame 的内容来自同一来源?

如何从外部登录网站?

对于接受来自多个站点(例如 facebook connect、google、flickr 等)的登录的站点,架构的良好实践是啥?

Corona sdk 应用程序 - 它可以接受来自应用程序外部的文件吗?

如何在 Microsoft Lync 中自动接受来自 WPF 的桌面共享请求