标签: asp.net-web-api

异步控制器方法没有返回

当我向它发出请求时,此代码挂起(不返回响应):

public class MyController : ApiController
{
    public async Task<IQueryable<int>> Get()
    {
        return await new Task<IQueryable<int>>(() => new List<int>().AsQueryable());
    }
}
Run Code Online (Sandbox Code Playgroud)

但这种方法很好:

public IQueryable<int> Get()
{
    return new List<int>().AsQueryable();
}
Run Code Online (Sandbox Code Playgroud)

我缺少什么基础知识??!

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

0
推荐指数
1
解决办法
697
查看次数

在完成之前让Web API控制器等待IAsyncResult吗?

我有一个Web API控制器.它调用一个返回IAsyncResult的方法.当我调用控制器时,我收到错误

在异步操作仍处于挂起状态时完成异步模块或处理程序.

如何让控制器等待asyncresult?

我打算使用await,但我可能还没有弄清楚这个用例的语法.

我还没有找到关于SO的现有答案.

我正在使用c#4.5

[HttpGet]
[Route("GetGridDataAsync")]
public string GetGridDataAsync()
{
        var proxy = new Proxy();
        return proxy.BeginGetDataAsync("test", ar => proxy.EndGetDataAsync(ar));             
}

public IAsyncResult BeginGetDataAsync(string r, AsyncCallback callback){}

public DataResponse[] EndGetDataAsync(IAsyncResult asyncResult){}
Run Code Online (Sandbox Code Playgroud)

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

0
推荐指数
1
解决办法
1149
查看次数

Task.Wait在MVC5中锁定控制器的流程

我们正在从MVC站点使用WebAPI.我们从这样的控制台应用程序中做了一个概念验证,使用了AddUser Method,它在我们的数据库中调节了一个新用户.

static void Main()
    {
        M_Users user = new M_Users();

        var newUser = new M_Users()
        {
            Password = "123",
            FirstName = "Andrew",
            Email = "someAndrew@someplace.com",
            AdminCode = 1,
            IsDisabled = false,
            CountryId = 48,
            CityId = 149,
            DepartmentId = 3,
            CreationDate = DateTime.Now,
            CreatorUserId = 1
        };
        var star = RunAsync(newUser);
        star.Wait();

        //THIS LINE IS REACHED ALWAYS
        Console.WriteLine(star.Result.UserID);
        Console.ReadLine();
    }

    static async Task<M_Users> AddUserAsync(M_Users newUser)
    {
        M_Users user = new M_Users();
        string requestUri = "api/User/AddUser";

        using (var client = …
Run Code Online (Sandbox Code Playgroud)

c# async-await asp.net-web-api asp.net-mvc-5

0
推荐指数
1
解决办法
1028
查看次数

ASP.NET MVC API与Web API异步

我目前正在使用ASP.NET MVC和单个Controller来获得各种"API".我正在使用从每个操作方法调用的服务/存储库模式.

类似如下:

库:

    public IQueryable<Order> GetOrders()
    {
        return from sqlOrder in DB.Orders
               select new Order
               {
                   Id = sqlOrder.Id,
                   Name = sqlOrder.Name,
                   Price = sqlOrder.Price
               };
    }
Run Code Online (Sandbox Code Playgroud)

服务:

    public List<Order> GetOrders()
    {
        return Repo.GetOrders().ToList();
    }
Run Code Online (Sandbox Code Playgroud)

控制器/行动:

    public JsonResult GetOrders()
    {
        var orders = Service.GetOrders();

        return Json(orders, JsonRequestBehavior.AllowGet);
    }
Run Code Online (Sandbox Code Playgroud)

一切都很好,但我正在考虑转移到WEB API和Async/Await

类似如下:

存储库:(无变化)

    public IQueryable<Order> GetOrders()
    {
        return from sqlOrder in DB.Orders
               select new Venue
               {
                   Id = sqlOrder.Id,
                   Name = sqlOrder.Name,
                   Price = sqlOrder.Price
               };
    }
Run Code Online (Sandbox Code Playgroud)

服务:

    public …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc entity-framework async-await asp.net-web-api

0
推荐指数
1
解决办法
2463
查看次数

NancyFX性能缓慢

我有AngularJs前端Web应用程序,它与NancyFx编写的后端Web API进行通信.我和Nancy有性能问题,每当我调用我的API服务时,Nancy首先扫描我模块中的每个方法,然后输入正确的方法.
例如:
在我的Nancy模块中,我有Get,Post,Put和Delete.当我在API上调用get方法时,Nancy会扫描Get,Post,Put,Delete,然后输入Get方法.所以每当我打电话给服务时,至少需要2秒才能输入正确的方法.

据我所知,南希默认扫描模块识别正确的路线,但在我的情况下这需要太长时间.我的模块类不是很大我在模块中有大约150行代码.
这是默认的Nancy行为,是否可以在Boostrap中重写,或者如何提高性能?

.net rest nancy asp.net-web-api angularjs

0
推荐指数
1
解决办法
1878
查看次数

如何在WebAPI中将可变数量的参数传递给GET

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

public HttpResponseMessage Get( string where_name, 
                                IndexFieldsModel index_fields = null )

public class IndexFieldsModel
{
    public List<IndexFieldModel> Fields { get; set; }
}

public class IndexFieldModel
{
    public string Name { get; set; }
    public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这是我的API.我的问题是index_fields是名称值对的集合,它是可选的和可变长度.问题是我不知道将提前传递给我的GET方法的名称.一个示例电话是:
/api/workitems?where_name=workitem&foo=baz&bar=yo

IModelBinder是走这里的方式,还是有更简单的方法?如果是IModelBinder我如何遍历名称?我去这里看一个IModelBinder的例子:http: //www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api 但是我没有看到一种迭代名称的方法,并选择"foo"和"bar".

我尝试将index_fields更改为Dictionary<string, string>没有IModelBinding,但没有做任何事情:index_fields为null.当我在做IModelBinder并调试我的IModelBinder.BindModel例程时,如果我深入查看ModelBindingContext对象,我可以在其中看到"foo"和"bar"值System.Web.Http.ValueProviders.Providers.QueryStringValueProvider,但我不知道如何使用它.我尝试从头创建一个QueryStringValueProvider但它需要一个HttpActionContext.再一次,我没有看到迭代通过键获得"foo"和"bar"的方法.

顺便说一句:我正在使用VS2012

c# asp.net asp.net-web-api

0
推荐指数
1
解决办法
1953
查看次数

创建自定义HttpStatusCode

我正在开发mvc4中的webapi.我想创建一个包含自定义一个类HttpStatusCode,其inherits HttpStatusCode类.假设我有一个signupapi需要用户详细信息,如姓名,姓氏,电子邮件,密码等.假设用户输入电子邮件abc@abc.com,我检查用户是否已经存在.如果此电子邮件已存在,我想返回Custom HttpStatusCode.假设我已经创建了1001 HttpStatusCode用于电子邮件.

我试过这样的事情

return new System.Web.Http.Results.ResponseMessageResult(
            Request.CreateErrorResponse(
                (HttpStatusCode)1001,
                new HttpError("Email is already exists.")
            )
        );
Run Code Online (Sandbox Code Playgroud)

但我不知道这是不是正确的方法.当我们使用return Unauthorized();它意味着它是一个未经授权的访问,返回401错误代码.同样,我想创建一个自定义响应和状态代码.在我的情况下,假设电子邮件ID已经存在,那么我应该返回这样的 return AlreadyExists()返回1001状态代码的东西.我可以实现这样的方式吗?如果是的话,我该如何实现呢?有人可以帮帮我吗?

c# http-status-codes asp.net-mvc-4 asp.net-web-api

0
推荐指数
2
解决办法
6036
查看次数

为所有配置设置相同的输出路径会产生什么后果?

为了在Visual Studio 2013中调试Web API项目,我必须将Debug配置的输出路径设置为(意味着文件最终相对于解决方案根文件夹),这可以从这里的一些答案中看出.bin\{ProjectName}\bin

但是现在我面临的问题是我们bin\{ConfigurationName}在构建服务器设置中的几个地方使用了路径.我非常想统一Debug的设置和其他Visual Studio配置.

因此我的问题是:您是否知道统一所有配置的输出文件夹会产生任何问题bin\,导致文件夹结构{ProjectName}\bin

如果这样做,有没有办法在不更改输出文件夹的情况下调试Web API项目bin\Debug\

c# asp.net asp.net-mvc visual-studio asp.net-web-api

0
推荐指数
1
解决办法
593
查看次数

来自字符串的ApiController json

我有一个api调用,作为另一个api调用的简单passthrough(出于安全目的).我只是想返回json响应,所以我不必复制一个对象或为一个调用创建一个完整的ws客户端这可能吗?这是我得到的:

[Route("PreUpload")]
[HttpPost]
[Authorize]
public async Task<IHttpActionResult> PreUpload(PreUploadInfoModel model)
{
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri(ConfigurationManager.AppSettings["FileServerURI"].ToString());
        model.UserId = CurrentUserID;
        var response = await client.PostAsJsonAsync("api/files/PreUpload", model);

        if (response.IsSuccessStatusCode)
        {
            // response.Content.ReadAsStringAsync().Result = "{\"UploadId\":\"blah\",\"NextChunk\":0,\"ChunkSize\":123,\"Key\":\"someKey\",\"Token\":\"myToken\"}"
            return Json(response.Content.ReadAsStringAsync().Result);
        }

        return BadRequest(response.ToString());
    }
}
Run Code Online (Sandbox Code Playgroud)

应该简单吧?但这会将此返回给浏览器: undefined:2.1241246524224146e+43

c# json asp.net-web-api

0
推荐指数
1
解决办法
204
查看次数

如何在单独的项目中使用test设置ASP.NET API以使用一个IoC/DI容器

我对单元测试很陌生,我很挣扎.我想在ASP.NET MVC中创建WebAPI,测试项目包含控制器的测试方法.我已经阅读了很多关于IoC/DI的内容,我已经在其他项目中使用过它,但没有使用单元测试.作为IoC/DI的许多优点之一,经常会提到测试方法的模拟类注入,但我从来没有找到使用单独项目的方法.

那么我如何设置IoC/DI容器,使其包含生产类和模拟类,但当然模拟类不是与生产代码相互作用,而是单独定位并且只在测试项目中可见?

c# asp.net-mvc unit-testing mocking asp.net-web-api

0
推荐指数
1
解决办法
229
查看次数