小编Mic*_*uso的帖子

如何从ASP.NET Core RC2 Web Api返回HTTP 500?

回到RC1,我会这样做:

[HttpPost]
public IActionResult Post([FromBody]string something)
{    
    try{
        // ...
    }
    catch(Exception e)
    {
         return new HttpStatusCodeResult((int)HttpStatusCode.InternalServerError);
    }
}
Run Code Online (Sandbox Code Playgroud)

在RC2中,不再有HttpStatusCodeResult,而且我找不到任何东西可以让我返回500类型的IActionResult.

对于我要问的方法,这种方法现在完全不同吗?我们不再尝试捕获Controller代码吗?我们只是让框架将一个通用500异常抛回API调用者吗?对于开发,我怎样才能看到确切的异常堆栈?

c# asp.net-core-mvc asp.net-core

154
推荐指数
10
解决办法
12万
查看次数

Web API路由 - api/{controller}/{action}/{id}"dysfunctions"api/{controller}/{id}

我在Global.asax中有默认路由:

 RouteTable.Routes.MapHttpRoute(
         name: "DefaultApi",
         routeTemplate: "api/{controller}/{id}",
         defaults: new { id = System.Web.Http.RouteParameter.Optional }
         );
Run Code Online (Sandbox Code Playgroud)

我希望能够定位特定的功能,所以我创建了另一条路线:

RouteTable.Routes.MapHttpRoute(
         name: "WithActionApi",
         routeTemplate: "api/{controller}/{action}/{id}",
         defaults: new { id = System.Web.Http.RouteParameter.Optional }
         );
Run Code Online (Sandbox Code Playgroud)

所以,在我的控制器中,我有:

    public string Get(int id)
    {
        return "object of id id";
    }        

    [HttpGet]
    public IEnumerable<string> ByCategoryId(int id)
    {
        return new string[] { "byCategory1", "byCategory2" };
    }
Run Code Online (Sandbox Code Playgroud)

打电话.../api/records/bycategoryid/5会给我我想要的东西.但是,通话.../api/records/1会给我错误

找到了与请求匹配的多个操作:...

我明白为什么那就是-航线只是定义哪些URL是有效的,但是当涉及到的功能匹配,都Get(int id)ByCategoryId(int id)比赛api/{controller}/{id},这是混淆了框架.

我需要做些什么才能让默认的API路由再次运行,并保持一个{action}?我想创建一个名为RecordByCategoryIdController匹配默认API路由的不同控制器,我会请求它.../api/recordbycategoryid/5.但是,我发现这是一个"脏"(因此不令人满意)的解决方案.我已经找到了这方面的答案,没有关于使用路线{action}甚至提到这个问题的教程.

asp.net routing action controller asp.net-web-api

93
推荐指数
2
解决办法
11万
查看次数

ASP.net Core RC2 Web API POST - 何时使用Create,CreatedAtAction和CreatedAtRoute?

这些功能的根本区别是什么?我所知道的全部三个结果都是201,这适用于成功的POST请求.

我只关注我在网上看到的例子,但他们并没有真正解释为什么他们正在做他们正在做的事情.

我们应该为我们的GET提供一个名称(id为1条记录):

[HttpGet("{id}", Name="MyStuff")]
public async Task<IActionResult> GetAsync(int id)
{
     return new ObjectResult(new MyStuff(id));
}
Run Code Online (Sandbox Code Playgroud)

命名此get函数的目的是什么,除了它可能是以下POST函数所需的"可能":

[HttpPost]
public async Task<IActionResult> PostAsync([FromBody]MyStuff myStuff)
{
     // actual insertion code left out

     return CreatedAtRoute("MyStuff", new { id = myStuff.Id }, myStuff);
}
Run Code Online (Sandbox Code Playgroud)

我注意到CreatedAtRoute还有一个不包含路由名称的重载.

还有一个CreatedAtAction类似的参数.为什么存在这种变体?

还有Created一个期望URL和我们想要返回的对象.我可以使用这个变体并提供一个伪造的URL并返回我想要的对象并完成它并完成吗?

我不确定为什么有这么多的变种只是为了能够将201返回给客户端.在大多数情况下,我想要做的就是返回"app-assigned"(很可能来自数据库)唯一ID或具有最少信息的我的实体版本.

我认为最终,201响应"应该"创建一个位置标题,其中包含新创建的资源的URL,我相信所有3和它们的重载最终会完成.为什么我总是要返回一个位置标题?我的JavaScript客户端,本机移动和桌面应用程序从不使用它.例如,如果我发出HTTP POST来创建账单并将其发送给用户,这样的位置URL会是什么?(我很抱歉没有深入研究互联网的历史,为此寻找答案.)

为什么要为动作和路线创建名称?动作名称和路线名称之间有什么区别?

我对此感到困惑,所以我使用了Ok()返回200,这不适合POST.

http-post asp.net-web-api asp.net-core-mvc asp.net-core

42
推荐指数
1
解决办法
2万
查看次数

抽象通用ODataController类导致'找不到HTTP资源'

我试图在VS 2013中抽象自动生成的ODataController类,因为除了POCO的名称之外,代码在不同的控制器中看起来相同,所以,我做了以下内容:

 public abstract class ODataControllerBase<T,DB> : ODataController
        where T : class, IIdentifiable, new()
        where DB : DbContext, new() 
 {
     protected DB _DataContext;

     public ODataControllerBase() : base()
     {
         _DataContext = new DB();
     }

     // only one function shown for brevity
     [Queryable]
     public SingleResult<T> GetEntity([FromODataUri] int key)
     {
         return SingleResult.Create(_DataContext.Set<T>().Where(Entity => Entity.Id.Equals(key)));
     }  
 }
Run Code Online (Sandbox Code Playgroud)

IIdentifiable 是一个强制T参数具有可读/可写Id整数属性的接口.

实现看起来像这样(POCO和DataContexts应该已经创建)

public class MyObjectsController : ODataControllerBase<MyObject,MyDbContext>
{
    public MyObjectsController() : base()
    {
    }

    // That's it - done because all the repetitive code has been …
Run Code Online (Sandbox Code Playgroud)

asp.net odata asp.net-web-api

17
推荐指数
1
解决办法
3272
查看次数

ApiController Post中的Async和Await

我仍然不太清楚isync并等待.net 4.5.到目前为止,我想我明白等待:

  1. 将函数(在其右侧)放在一个单独的线程上.
  2. 将执行放回当前函数的调用者
  3. 但保持当前函数的代码"hostage"的其余部分,直到等待(异步)函数完成.

如果我误解了什么,请纠正我.所以,如果以上情况属实,我会遇到一个我想要异步的ApiController的Post函数:

[HttpPost]
public async Task<HttpResponseMessage> Post([FromBody]MyObject obj)
{        
     myDataContext.MyObjects.InsertOnSubmit(obj);
     myDataContext.SubmitChanges();

     await SomeReallyLongRunningTaskAsync();        

     // obj would now have the new Id, which I'm really after.
     return Request.CreateResponse(HttpStatusCode.Created, obj);

}
Run Code Online (Sandbox Code Playgroud)

因此,如果我正确理解这一点,Post将完成执行并将控制权交还给任何人myApiController.Post(obj).但是,HttpResponseMessage由于等待举行return Request.CreateResponse(HttpStatusCode.Created, obj);"人质",我还没有这个对象.

在上面这个简单的例子中,调用会立即返回客户端(即客户端JS网站还是移动应用程序)?如果是这样,它会是201,400,500(最好不是),其他人呢?

c# asynchronous async-await asp.net-web-api

14
推荐指数
2
解决办法
2万
查看次数

自定义JsonConverter WriteJson不会改变子属性的序列化

我总觉得JSON序列化程序实际遍历整个对象的树,并在它遇到的每个接口类型对象上执行自定义JsonConverter的WriteJson函数 - 不是这样.

我有以下类和接口:

public interface IAnimal
{
    string Name { get; set; }
    string Speak();
    List<IAnimal> Children { get; set; }
}

public class Cat : IAnimal
{
    public string Name { get; set; }
    public List<IAnimal> Children { get; set; }        

    public Cat()
    {
        Children = new List<IAnimal>();
    }

    public Cat(string name="") : this()
    {
        Name = name;
    }

    public string Speak()
    {
        return "Meow";
    }       
}

 public class Dog : IAnimal
 {
    public string Name { get; …
Run Code Online (Sandbox Code Playgroud)

c# serialization json converter json.net

12
推荐指数
1
解决办法
2万
查看次数

ASP.net 5在Live Windows Server上自托管 - EACCES权限被拒绝了吗?

我的印象是,我们实际上可以在实时服务器上运行一个控制台应用程序,该应用程序可以监听和提供数据(如果是为了这个目的,则是网页).这样,我们就不必在IIS上托管我们的Web应用程序了.我一直认为这就是"在你自己的过程中托管网络应用程序"的意思.

这是我认为相关的project.json的一部分:

  "dependencies": {
    "Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
    "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final"
  },

  "commands": {
    "web": "Microsoft.AspNet.Server.Kestrel --server.urls http://localhost:5010"
  },
Run Code Online (Sandbox Code Playgroud)

如果我转到命令提示符,dir到项目的根目录,然后运行dnx web,是的,确实,控制台应用程序正在运行,我可以转到我的浏览器并键入http:// localhost:5010并查看网站.

但是,当我将该URL更改为实际URL时(是的,我已经将DNS指向我的服务器以获取该URL),我将收到错误消息EACCES permission denied.

如果我们可以"自我托管"但只能使用localhost,这似乎只对本地开发有利.如果它不能用于实时/制作,为什么能够"在我自己的过程中自我托管"?

我需要做什么?我是否需要为特定文件夹设置一些权限?哪个用户/组,哪个权限,以及哪个文件夹?我在项目的根目录上尝试了IIS_IUSRS,当然,这不起作用,因为我还想绕过IIS.

任何帮助将不胜感激.

iis webserver self-hosting iis-8 asp.net-core

12
推荐指数
1
解决办法
6437
查看次数

Angular Directive不评估ng-repeat内部

我有以下设置:

应用程序/指令

var app = angular.module("MyApp", []);

app.directive("adminRosterItem", function () {
    return {
        restrict: "E",
        scope: {
            displayText: "@"
        },
        template: "<td>{{ displayText }}</td>", // should I have this?
        link: function(scope, element, attrs){
            // What do I put here? I don't seem to have any
            // element to initialize (set up event handlers, for example)
        },
        compile: function(?,?,?){} // should I have this? If so, what goes inside?
    }
});
Run Code Online (Sandbox Code Playgroud)

调节器

function PositionsController($scope) {
           $scope.positions = [{ Name: "Quarterback", Code: …
Run Code Online (Sandbox Code Playgroud)

javascript angularjs angularjs-directive angularjs-ng-repeat

10
推荐指数
2
解决办法
3万
查看次数

Angular CLI - 如何在CSS或SCSS中解析url?

我有一个组件,其SCSS引用同一组件文件夹中的图像,使用background-image: url('./logo.jpg').

删除前导./也没有帮助.在任何情况下,图像都不会显示在浏览器中.

我正在运行ng serve并查看该dist文件夹,logo.jpg确实被复制并放置在与预期相同的组件文件夹中.

我还希望能够引用我的.css或.scss文件所在文件夹之外的其他位置的图像,使用相对路径,就像我从.ts文件中使用我的组件.html和.css一样.

我想我需要某种url解析器,它会在输出的.css文件上生成完整的URL.我如何获得这样的解析器以及如何在Angular CLI中配置它?

url angular-cli

9
推荐指数
2
解决办法
4461
查看次数

Microsoft.AspNet.Identity.EntityFramework.IdentityUser的外键?

我在VS 2013,刚刚创建了一个MVC应用程序.

我正在创建一个对象,我打算在结果数据库中有一个AspNetUsers表的外键.该项目确实有一个ApplicationUser(派生自IdentityUser),看起来像是与AspNetUsers表的属性列匹配.

我们如何正确地为此声明外键?

public MyObject
{
   public string UserId { get; set; }

   [ForeignKey("UserId")]
   public ApplicationUser User { get; set;}

   // other properties
}
Run Code Online (Sandbox Code Playgroud)

现在,我修改ApplicationUser以获得MyObjects的集合:

public ApplicationUser : IdentityUser
{
     public virtual ICollection<MyObject> MyObjects { get; set; }    
}
Run Code Online (Sandbox Code Playgroud)

这似乎是如何在EF Code First中进行一对多操作.但是,当我更新数据库时,我收到的错误表明身份成员(IdentityUserLogin,IdentityUserRole等)没有定义键.也许这些课程不打算参加EF Code First Migrations?

我可以"回到"并通过SQL语句添加外键,但如果我想再次从Code First更新,我可能会收到错误(数据库目前不匹配旧的迁移或类似的东西).

我们如何正确地使用外键参考这些会员表?

我还尝试使用AspNetUsers表的匹配属性创建一个AspNetUser类.我没有在Client类上使用"public ApplicationUser",而是声明了"public AspNetUser".这样做会导致迁移失败 - "未应用自动迁移,因为它会导致数据丢失".

那么该怎么办?

c# entity-framework poco ef-code-first ef-migrations

8
推荐指数
2
解决办法
1万
查看次数