Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.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# 基于REST的MVC站点和/或WCF_C#_Wcf_Model View Controller_Rest - Fatal编程技术网

C# 基于REST的MVC站点和/或WCF

C# 基于REST的MVC站点和/或WCF,c#,wcf,model-view-controller,rest,C#,Wcf,Model View Controller,Rest,我知道实际上有很多问题与这个问题类似,但我找不到一个能准确回答我问题的问题 我正在构建一个web应用程序,它将 显然,向用户显示数据:) 具有供经过身份验证的用户使用的公共API 以后可以移植到移动设备上 所以,我被困在设计上。我将使用asp.NETMVC作为网站,但是我不确定在那之后如何构建我的架构 我应该: 使网站RESTful并充当API 在我最初的回顾中,GET返回的是完整视图,而不仅仅是数据,在我看来,这似乎扼杀了公共API的理念 另外,我真的应该在控制器中执行业务逻辑吗?为了

我知道实际上有很多问题与这个问题类似,但我找不到一个能准确回答我问题的问题

我正在构建一个web应用程序,它将

  • 显然,向用户显示数据:)
  • 具有供经过身份验证的用户使用的公共API
  • 以后可以移植到移动设备上
所以,我被困在设计上。我将使用asp.NETMVC作为网站,但是我不确定在那之后如何构建我的架构

我应该:

  • 使网站RESTful并充当API
    • 在我最初的回顾中,GET返回的是完整视图,而不仅仅是数据,在我看来,这似乎扼杀了公共API的理念
    • 另外,我真的应该在控制器中执行业务逻辑吗?为了能够扩展,在另一个服务器上有一个单独的业务逻辑层不是更好吗?或者我只是考虑把MVC站点推到另一个服务器上,它会解决同样的问题吗?我正在尝试创建一个设计,因此将其抽象为一个单独的服务似乎更好(我可以调用另一个类,但随后我又回到了可伸缩性的问题上…)
  • 使网站不是RESTful的,并创建网站将使用的RESTful WCF服务
  • 使网站和WCF服务都是restful的,但这似乎是多余的

我对休息还比较陌生,所以这个问题可能是我的误解。希望我能很好地解释这一点,但如果没有,请告诉我您是否需要澄清。

我会在上面创建一个单独的业务逻辑层和一个(restful)WCF层。这将使BLL与客户机分离。您甚至可以让不同的客户机使用相同的API(并不是说您应该或将要使用,但它提供了灵活性)。理想情况下,服务层不应返回域实体,而应返回数据传输对象(可以使用Automapper进行映射),尽管这取决于项目的范围和规格


将它放在另一台服务器上会使它成为一个不同的层。

简单明了从复杂性的角度来看,将网站和API分开是最容易的。在我看来也有点干净

然而,如果你决定走这条路,这里有一些技巧可以帮助你简化处理这两个问题的过程。(我目前正在做一个个人项目)

  • 保持你的控制器逻辑非常简单。从你想让它变得坚固这一事实来看,你可能已经这样做了
  • 将返回到视图的模型与实际模型分开。我喜欢创建特定于视图的模型,并有一种将模型转换为特定于视图的模型的方法
  • 确保你把所有东西都翻了。您可能希望在相当长的一段时间内允许并支持旧的API请求。。。。尤其是在电话里
  • 实际上,尽可能充分地使用REST,而不仅仅是HTTP的另一个名称。大多数实现都忽略了一个事实,即在任何类型的响应中,状态都应该随响应一起传输(缺少ST)。允许在页面和API响应中自我发现操作。例如,如果允许在资源中分页,请始终在api或网页中指定。有。这极大地有助于解耦,允许您有时用最新版本自动更新客户端
  • 现在您看到的控制器操作可能类似于以下伪代码

    MyAction(param) {
        // Do something with param
        model = foo.baz(param)
    
        // return result
        if(isAPIRequest) {
           return WhateverResult(model)
        }
        return View(model.AsViewSpecificModel())
    }
    

    我一直在玩弄的一件事是制作我自己类型的
    ActionResult
    ,处理返回逻辑,这样它就不会在整个项目中重复。

    我会为您的网站使用REST服务,因为它不会增加任何显著的开销(假设它们在同一台服务器上)并将大大简化您的代码库。您可以“吃自己的狗粮”,而不是有两个API:一个私有API(作为DLL引用)和一个公共API。您需要注意的唯一一点是确保您不会为了满足自己的需要而弯曲公共API,而是在需要时使用单独的私有API

    您可以在MVC站点内使用RestSharp或EasyHttp进行REST调用


    可能会使API任务更容易,您可以使用现有的域对象,只需编写一组获取/更新/删除/创建对象的服务,而无需为MVC中的所有内容编写两个操作。

    是的,我计划使用DTO和AutoMapper。所以,您是说,我可能不应该担心REST站点,但它是否使用RESTful服务?(选项2基本上)正是如此,尽管服务层!=BLL。您的服务层应该负责DTO实体映射。您的业务逻辑与实体一起工作,不需要服务或数据传输方面的知识。是的,我完全同意。事实上,这就是我在开始使用我的网站作为RESTful服务之前所计划的架构。我给了你答案,因为所有的答案都非常相似,并且与我之前的想法一致。我之所以这么说是因为你是第一个谢谢,这似乎和@diggingforfire的回答一样,除了你的第4点。你是说我应该更多地选择我的第三个选项(MVC和WCF都是REST)?如果是这样的话,你能详细解释一下为什么这不是多余的吗?我指的是API应该由“超文本”驱动的事实。我会把它清理干净。谢谢,这已经是我对REST的理解了,所以我应该可以:)那么,你也建议选择2吗?这似乎是普遍的共识。@Justin绝对不会走WCF路线,根据我的经验。为什么不呢?它似乎有相当好的休息能力。如果不是WCF,你有什么建议?我对使用其他语言持开放态度,但更愿意将内容保留在相同的技术堆栈中。@JustinPihony服务