Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从现有asp.net-mvc站点向intranet中的其他REST客户端公开几个调用?_C#_Json_Security_Asp.net Mvc 4_Asp.net Web Api - Fatal编程技术网

C# 从现有asp.net-mvc站点向intranet中的其他REST客户端公开几个调用?

C# 从现有asp.net-mvc站点向intranet中的其他REST客户端公开几个调用?,c#,json,security,asp.net-mvc-4,asp.net-web-api,C#,Json,Security,Asp.net Mvc 4,Asp.net Web Api,我有一个现有的asp.net-mvc网站,现在我需要将我的一些调用公开给目前只在我的网站中使用的外部应用程序。这一切都发生在我公司的内部网中 我也读过这篇文章,它解释了Web API与控制器操作的关系,这篇文章似乎也有类似的问题,但答案似乎有点过时。因此,我试图确定给定的最新可用功能是什么最简单的解决方案,以满足我的需求 在我的例子中,因为我已经在我当前的网站中使用了相同的控制器操作,所以WEB API没有真正的意义,但是如果我搜索关于asp.net-mvc身份验证或安全性的任何内容,我只会看到

我有一个现有的asp.net-mvc网站,现在我需要将我的一些调用公开给目前只在我的网站中使用的外部应用程序。这一切都发生在我公司的内部网中

我也读过这篇文章,它解释了Web API与控制器操作的关系,这篇文章似乎也有类似的问题,但答案似乎有点过时。因此,我试图确定给定的最新可用功能是什么最简单的解决方案,以满足我的需求

在我的例子中,因为我已经在我当前的网站中使用了相同的控制器操作,所以WEB API没有真正的意义,但是如果我搜索关于asp.net-mvc身份验证或安全性的任何内容,我只会看到关于WEB API的文章


有鉴于此,我试图找出将控制器操作公开给另一个应用程序的最佳实践。

虽然我强烈建议使用web服务体系结构,如web API或ServiceStack,但您可以公开控制器操作

您首先需要使用
[AllowAnonymous]
属性来装饰操作。然后,在web.config中,您需要为要公开的每个操作将以下代码块添加到
configuration
部分

<location path="ControllerNameHere/ActionNameHere">
    <system.web>
        <authorization>
            <allow users="*" />
        </authorization>
    </system.web>
</location>


正如你可能已经猜到的,这变得非常重复和烦人,这就是为什么web服务是一个很好的选择。

在理想的情况下,您可以按照其他人的建议将应用程序转换为web api控制器,但为了更加实用,您可以实施一个临时解决方案,通过扩展
ApiController

您没有提及当前应用程序使用的MVC版本,也没有提及当前控制器如何将数据返回到web应用程序。 因此,我假设您通过视图模型和razor视图返回数据。例如:

public class ProductsController : Controller
{
      public void Index()
      { 
            var view = new ProductsListView();
            view.Products = _repository.GetProducts();
            return View(view);
      }
}
假设现在您想通过REST类api公开产品列表? 首先检查是否安装了web api(通过nuget)

安装软件包Microsoft.AspNet.WebApi

(同样,我不确定您使用的是哪一版本的asp.net,因此此过程可能因版本而异)

现在在您的
public void应用程序中\u Start()

WebApiConfig

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}
我喜欢创建一个名为ApiControllers的专用文件夹,并添加同名的控制器;通过这种方式,可以使控制器的名称与它们在不同名称空间中的名称相同:

namespace YourApp.Web.ApiControllers
{
    [AllowAnonymous]
    public class ProductsController : ApiController
    {
        [HttpGet]
        public HttpResponseMessage Products()
        {
              var result = new ProductResult();//you could also use the view class ProductsListView
              result.Products = _repository.GetProducts();
              return Request.CreateResponse(httpStatusCode, result);
        }
    }
}
然后,您可以通过
yourapp.com/api/products


注意,尽量减少控制器内部代码的重复-这可以通过将公共部分提取到服务类中来实现

我有一个类似的要求,网站2需要从网站1调用一些控制器操作。因为在逻辑上没有任何变化,所以我想避免使用WebAPI进行整个重写。我创建了另一组返回Json的控制器和操作。新的控制器操作将调用原始控制器操作,然后在返回之前将结果数据转换为json。然后,其他应用程序(Website2)会发出http get和post请求,以获取json数据并在内部对其进行反序列化。对我来说很有效


我不必在基于json的操作上设置安全层,因为它们是公共的,但您可能需要一个安全层来验证请求。

虽然webapi是最好的方法,但您根本不需要将控制器/操作转换为webapi

通过内联网中的IP地址限制控制器/操作,您可以轻松实现您的目标。只需确保所有intranet站点都位于同一个域上,其他跨域jQueryAjax调用将无法工作。 这是一个例子

另一种方法是使用基本身份验证,只允许硬编码的用户标识/密码通过ajax访问这些控制器/操作和调用:

发送前:函数(xhr){ xhr.setRequestHeader(“授权”、“基本”+btoa(用户名+:“+密码));
},

我会将操作转换为Web API控制器,并使网站和应用程序使用相同的操作。将比从外部设置要使用的MVC控制器更容易,正如SO答案所示。
namespace YourApp.Web.ApiControllers
{
    [AllowAnonymous]
    public class ProductsController : ApiController
    {
        [HttpGet]
        public HttpResponseMessage Products()
        {
              var result = new ProductResult();//you could also use the view class ProductsListView
              result.Products = _repository.GetProducts();
              return Request.CreateResponse(httpStatusCode, result);
        }
    }
}