回到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调用者吗?对于开发,我怎样才能看到确切的异常堆栈?
我在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}甚至提到这个问题的教程.
这些功能的根本区别是什么?我所知道的全部三个结果都是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.
我试图在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) 我仍然不太清楚isync并等待.net 4.5.到目前为止,我想我明白等待:
如果我误解了什么,请纠正我.所以,如果以上情况属实,我会遇到一个我想要异步的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(最好不是),其他人呢?
我总觉得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) 我的印象是,我们实际上可以在实时服务器上运行一个控制台应用程序,该应用程序可以监听和提供数据(如果是为了这个目的,则是网页).这样,我们就不必在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.
任何帮助将不胜感激.
我有以下设置:
应用程序/指令
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
我有一个组件,其SCSS引用同一组件文件夹中的图像,使用background-image: url('./logo.jpg').
删除前导./也没有帮助.在任何情况下,图像都不会显示在浏览器中.
我正在运行ng serve并查看该dist文件夹,logo.jpg确实被复制并放置在与预期相同的组件文件夹中.
我还希望能够引用我的.css或.scss文件所在文件夹之外的其他位置的图像,使用相对路径,就像我从.ts文件中使用我的组件.html和.css一样.
我想我需要某种url解析器,它会在输出的.css文件上生成完整的URL.我如何获得这样的解析器以及如何在Angular CLI中配置它?
我在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# ×4
asp.net-core ×3
asp.net ×2
action ×1
angular-cli ×1
angularjs ×1
async-await ×1
asynchronous ×1
controller ×1
converter ×1
http-post ×1
iis ×1
iis-8 ×1
javascript ×1
json ×1
json.net ×1
odata ×1
poco ×1
routing ×1
self-hosting ×1
url ×1
webserver ×1