在从REST API返回错误时,我正在寻找有关良好实践的指导.我正在开发一个新的API,所以我现在可以采取任何方向.我的内容类型目前是XML,但我计划将来支持JSON.
我现在正在添加一些错误情况,例如客户端尝试添加新资源但已超出其存储配额.我已经使用HTTP状态代码处理某些错误情况(401用于身份验证,403用于授权,404用于普通错误请求URI).我查看了有福的HTTP错误代码,但400-417范围似乎没有报告特定于应用程序的错误.所以起初我很想用200 OK和特定的XML有效载荷返回我的应用程序错误(即付给我们更多,你将得到你需要的存储空间!)但是我停下来思考它并且似乎是肥皂(/耸耸肩恐怖).此外,感觉就像我将错误响应分成不同的情况,因为有些是http状态代码驱动而其他是内容驱动.
那么行业建议是什么?好的做法(请解释原因!)以及从客户端pov中,REST API中的哪种错误处理使客户端代码的生活更轻松?
使用Microsoft for .NET的异步CTP,是否可以捕获调用方法中异步方法抛出的异常?
public async void Foo()
{
var x = await DoSomethingAsync();
/* Handle the result, but sometimes an exception might be thrown.
For example, DoSomethingAsync gets data from the network
and the data is invalid... a ProtocolException might be thrown. */
}
public void DoFoo()
{
try
{
Foo();
}
catch (ProtocolException ex)
{
/* The exception will never be caught.
Instead when in debug mode, VS2010 will warn and continue.
The deployed the app will simply crash. …Run Code Online (Sandbox Code Playgroud) c# asynchronous exception-handling task-parallel-library async-await
我创建了一个.NET Core MVC应用程序,并使用依赖注入和存储库模式将一个存储库注入我的控制器.但是,我收到一个错误:
InvalidOperationException:尝试激活"WebApplication1.Controllers.BlogController"时,无法解析类型"WebApplication1.Data.BloggerRepository"的服务.
型号(Blog.cs)
namespace WebApplication1.Models
{
public class Blog
{
public int BlogId { get; set; }
public string Url { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
DbContext(BloggingContext.cs)
using Microsoft.EntityFrameworkCore;
using WebApplication1.Models;
namespace WebApplication1.Data
{
public class BloggingContext : DbContext
{
public BloggingContext(DbContextOptions<BloggingContext> options)
: base(options)
{ }
public DbSet<Blog> Blogs { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
存储库(IBloggerRepository.cs和BloggerRepository.cs)
using System;
using System.Collections.Generic;
using WebApplication1.Models;
namespace WebApplication1.Data
{
internal interface IBloggerRepository : IDisposable
{
IEnumerable<Blog> GetBlogs();
void InsertBlog(Blog blog);
void …Run Code Online (Sandbox Code Playgroud) 例如,在一个地方......
//---------------a
try
{
// some network call
}
catch(WebException we)
{
throw new MyCustomException("some message ....", we);
}
Run Code Online (Sandbox Code Playgroud)
......在另一个地方......
//--------------b
try
{
// invoke code above
}
catch(MyCustomException we)
{
Debug.Writeline(we.stacktrace); // <----------------
}
Run Code Online (Sandbox Code Playgroud)
我打印的堆栈跟踪,它只从a到b开始,它不包含WebException的内部堆栈跟踪.
如何打印所有堆栈跟踪???
我正在使用.Net4.5在VS2012中创建一个控制台项目.之后我将"添加","新项目"添加到项目中,然后选择"EF 5.x DbContext Generator".然后,几秒钟后,"错误列表"选项卡中会显示以下错误消息:
错误1运行转换:请使用您要生成的.edmx文件的实际名称覆盖替换标记'$ edmxInputFile $'.C:\项目\测试\ ConsoleAppEF5\ConsoleAppEF5\Model1.tt`
我怎样才能解决这个问题 ?
我错过了什么?
我何时应该使用async/await,何时应该在C#中使用parallel.foreach?并行和异步/等待是否有同样的目的?它们有什么不同?
我正在尝试设置一个网站和webjob,但每次我尝试独立于网站发布webjob时都会出错(即Publish as Azure WebJob从上下文菜单中选择)
C:\ Program Files(x86)\ MSBuild\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.Publishing.targets(4270,5):错误:'MyWebJob.Models.MyDataEntities-Web.config连接字符串'参数不能为null或为空.
C:\ Program Files(x86)\ MSBuild\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.Publishing.targets(4270,5):错误:'MyWebJob.Models.MoreDataEntities-Web.config连接字符串'参数不能为null或为空.
部署WebJob有两种选择
当我将我的webjob链接到一个网站项目时,它会在网站上部署而不会出错.但是,当我尝试独立部署它时,我在控制台和错误列表中出现上述错误,但仍然部署了webjob.
如何独立部署我的webjob并摆脱这种持久的"错误"?
我试图验证使用正确的参数调用异步方法.但是,我得到警告:
"因为没有等待这个调用,所以当前方法的执行在调用完成之前继续.考虑将'await'运算符应用于调用的结果".此警告显示在//Assert注释下方的代码行上(下方).
我使用NSubstitute的测试如下:
[Test]
public async Task SimpleTests()
{
//Arrange
var request = CreateUpdateItemRequest();
databaseHelperSub.ExecuteProcAsync(Arg.Any<DatabaseParams>()).Returns(Task.FromResult((object)null));
//Act
await underTest.ExecuteAsync(request);
//Assert
databaseHelperSub.Received().ExecuteProcAsync(Arg.Is<DatabaseParams>(
p => p.StoredProcName == StoredProcedureName
&& p.Parameters[0].ParameterName == "Param1"
&& p.Parameters[0].Value.ToString() == "Value1"
&& p.Parameters[1].ParameterName == "Param2"
&& p.Parameters[1].Value.ToString() == "Value2"));
}
Run Code Online (Sandbox Code Playgroud)
被测单元方法underTest.ExecuteAsync(request)调用ExecuteProcedureAsync并执行await:
var ds = await DatabaseHelper.ExecuteProcAsync(dbParams);
Run Code Online (Sandbox Code Playgroud)
由于使用NSubstitute,在执行被测单元后需要Received().而在RhinoMocks中,您可以预期在执行测试单元之前进行调用.RhinoMocks可以返回Task.FromResult()而NSubstitute不能.
RhinoMocks等效的工作原理如下:
[Test]
public async Task SimpleTest()
{
// Arrange
var request = new UpdateItemRequest();
databaseHelperMock.Expect(m => m.ExecuteProcAsync(Arg<DatabaseParams>.Matches(
p => p.StoredProcName == …Run Code Online (Sandbox Code Playgroud) MS文档文章"ASP.NET Core中的日志记录简介"提供了2个构造函数注入示例
使用ILogger
private readonly ILogger _logger;
public TodoController(ILogger<TodoController> logger)
{
_logger = logger;
}
Run Code Online (Sandbox Code Playgroud)和ILoggerFactory
private readonly ILogger _logger;
public TodoController( ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger<TodoController>();
}
Run Code Online (Sandbox Code Playgroud)我的问题是我应该传递给从我的控制器调用的子类
通过ILoggerFactory我从控制器和每种类别的呼叫称为子类
LoggerFactoryExtensions.CreateLogger<MyChildClass>()或
将父控制器传递ILogger<MyController>给从控制器创建的每个子类,并具有非泛型参数ILogger.
在日志中,我更喜欢为每个类看到单独的类别"MyChildClass",而不是所有类都使用父控制器中的"MyController"类别.
但是,每个对象构造中的CreateLogger可能是一项昂贵的操作(例如,请参阅https://github.com/aspnet/Logging/issues/524)
你会推荐哪个选项?你能建议其他方法吗?
在动态语言运行时(DLR) 有表达的一些很酷的代码,其中包括一些非常漂亮的代码打印出来,我想使用,使表达式树:
int a = 1;
int b = 2;
Expression<Func<int, int>> expression = (c) => a + (b * c)
expression.Evaluate(5, stringBuilder)
Run Code Online (Sandbox Code Playgroud)
输出:
(5) => a + (b * c) = 11 Where
a = 1
b * c = 10 Where
b = 2
c = 5
Run Code Online (Sandbox Code Playgroud)
我在网上发现了一些代码,但发现只有表达式没有参数时它才有效.
然后我发现了类似方法的DLR实现.然而,DLR有自己的Expression类和许多其他标准C#类型的自定义实现,所以我有点困惑.谁知道我怎么能实现上述?
c# ×6
async-await ×3
asynchronous ×3
asp.net-core ×2
.net-4.5 ×1
.net-core ×1
http ×1
linq ×1
logging ×1
nsubstitute ×1
rest ×1
stack-trace ×1
string ×1
unit-testing ×1
web-services ×1