小编SB2*_*055的帖子

WebAPI PUT/POST中的部分实体更新

假设您有一个更新Document的存储库方法:

public Document UpdateDocument(Document document)
  {
  Document serverDocument = _db.Documents.Find(document.Id);
  serverDocument.Title = document.Title;
  serverDocument.Content = document.Content;
  _db.SaveChanges();
  return serverDocument;
  }
Run Code Online (Sandbox Code Playgroud)

在这种情况下,实体有两个属性.更新Document时,JSON请求中都需要这两个属性,因此请求PUT /api/folder使用

{
  "documentId" = "1",
  "title" = "Updated Title"
}
Run Code Online (Sandbox Code Playgroud)

会返回错误,因为未提供"内容".我这样做的原因是,即使对于用户不更新的可空属性和属性,强制客户端在请求中指定这些字段似乎更安全,以避免使用nulls服务器端覆盖未指定的字段.

这导致我总是要求PUT和POST请求中的每个可更新属性,即使这意味着为这些属性指定null.

这是不是很酷,或者是否有一种我还没有学到的模式/实践可能会通过只发送线路上需要的内容来促进部分更新?

web-applications asp.net-mvc-3 asp.net-web-api single-page-application

15
推荐指数
1
解决办法
8406
查看次数

不区分大小写的字符串比较不适用于C#?

根据这个问题的答案:

如何进行不区分大小写的字符串比较?

我试图在不使用Compare或ToLower的情况下进行不区分大小写的比较:

var user = db.Users.FirstOrDefault(s => String.Equals(s.Username, username, StringComparison.OrdinalIgnoreCase));
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:

为调用方法'Boolean Equals(System.String,System.String,System.StringComparison)提供的参数数量不正确

我究竟做错了什么?

c# linq asp.net linq-to-sql

15
推荐指数
1
解决办法
7699
查看次数

如何使flot响应?

在下面的小提琴:

http://jsfiddle.net/jamitzky/9x7aJ/

如果窗口宽度发生变化,如何更改图形的宽度?

码:

$(function () {
var d1 = [];
for (var i = 0; i < 14; i += 0.5)
    d1.push([i, Math.sin(i)]);

var d2 = [[0, 3], [4, 8], [8, 5], [9, 13]];

// a null signifies separate line segments
var d3 = [[0, 12], [7, 12], null, [7, 2.5], [12, 2.5]];

$.plot($("#placeholder"), [ d1, d2, d3 ]);
});
Run Code Online (Sandbox Code Playgroud)

flot

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

具有DbContext和TenantId的MultiTenancy - 拦截器,过滤器,EF代码优先

我的组织需要一个共享数据库,共享模式多租户数据库.我们将根据TenantId进行查询.我们将只有极少数租户(少于10个),并且所有租户都将共享相同的数据库架构,不支持特定于租户的更改或功能.租户元数据将存储在内存中,而不是存储在DB(静态成员)中.

这意味着所有实体现在都需要TenantId,并且DbContext需要知道默认情况下对此进行过滤.

TenantId会可能是由一个标头值或原始域来识别,除非有更明智的做法.

我已经看到各种样本利用拦截器,但没有看到TenantId实现的明确示例.


我们需要解决的问题:

  1. 我们如何修改当前架构来支持这个(简单的我认为,只需添加TenantId)
  2. 我们如何检测租户(简单 - 基于原始请求的域或标头值 - 从BaseController拉出)
  3. 我们如何将其传播到服务方法(有点棘手......我们使用DI通过构造函数进行水合...希望避免使用所有方法签名tenantId)
  4. 一旦我们有了它,我们如何修改DbContext来过滤这个tenantId(不知道)
  5. 我们如何优化性能.我们需要什么索引,我们如何确保查询缓存没有与tenantId隔离等做任何事情(不知道)
  6. 身份验证 - 使用SimpleMembership,我们如何隔离Users,以某种方式将它们与租户联系起来.

我认为最大的问题是4 - 修改DbContext.


我喜欢本文如何利用RLS,但我不知道如何以代码优先,dbContext方式处理它:

https://azure.microsoft.com/en-us/documentation/articles/web-sites-dotnet-entity-framework-row-level-security/

我要说的是我正在寻找的是一种方法 - 考虑到性能 - 使用DbContext有选择地查询tenantId隔离的资源,而不需要调用我的调用"AND TenantId = 1"等.


更新 - 我找到了一些选项,但我不确定每个选项的优缺点是什么,或者是否有一些"更好"的方法.我对选项的评估归结为:

  • 易于实施
  • 性能

方法A.

这似乎"昂贵",因为每次我们新建dbContext时,我们都必须重新初始化过滤器:

https://blogs.msdn.microsoft.com/mvpawardprogram/2016/02/09/row-level-security-in-entityframework-6-ef6/

首先,我设置了我的租户和界面:

public static class Tenant {

    public static int TenantA {
        get { return 1; }
    }
    public static int TenantB
    {
        get { return 2; }
    }

}

public interface ITenantEntity …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework multi-tenant ef-code-first azure-sql-database

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

存储用户设置 - 使用"Flags"或"Bits"而不是一堆bool有什么问题?

我正在设计我的MVC应用程序的用户设置,现在我有~20个布尔设置,用户可以切换.由于每个用户总是会进行所有设置,因此我考虑将每个设置存储为User表中的布尔值.虽然随着应用程序需求的增长,这将变得难以处理.

第一个问题 - 在这种情况下,你的桌子上有大量的柱子有什么问题吗?

然后我考虑使用Flags,并将设置存储为数组中的每一位:

[Flags]
public enum Settings
{
    WantsEmail = 1,
    WantsNotifications = 2,
    SharesProfile = 4,
    EatsLasagna = 8
}
Run Code Online (Sandbox Code Playgroud)

然后每个用户在其用户行中将有一个"设置"列,如果有20个设置,则存储值为2 ^ 20.

我用这个来指导我的努力:[Flags] Enum属性在C#中意味着什么?

这比前一种做法好吗?欢迎任何建议.

c# asp.net asp.net-mvc database-design database-schema

10
推荐指数
1
解决办法
1026
查看次数

在解决方案中拆分WebApi项目和FrontEnd项目

我有一个我正在构建的移动应用程序的解决方案 - 到目前为止,它包含两个项目:

   1) WebAPI for API / DAL / SQL etc
   2) Web for single-page front-end
Run Code Online (Sandbox Code Playgroud)

Web项目调用WebAPI项目.计划是为Windows 8应用程序创建另一个项目,为WP8应用程序创建另一个项目,等等.

这在开发过程中运行良好,但在CORS,部署等方面变得相当复杂(Web是从与WebAPI不同的端点提供的 - 两个Azure Web站点).我的问题是 - 在构建一个由REST-ish API支持的解决方案时,何时将解决方案拆分为多个项目是明智/不明智的?

c# azure visual-studio asp.net-web-api windows-phone-8

10
推荐指数
1
解决办法
2424
查看次数

批量媒体通过WebApi上载到Azure Blob存储

我的网络应用程序目前允许用户使用以下方法一次一个地上传媒体:

var fd = new FormData(document.forms[0]);
fd.append("media", blob); // blob is the image/video
$.ajax({
    type: "POST",
    url: '/api/media',
    data: fd
})
Run Code Online (Sandbox Code Playgroud)

然后媒体被发布到WebApi控制器:

    [HttpPost, Route("api/media")]
    public async Task<IHttpActionResult> UploadFile()
    {
        if (!Request.Content.IsMimeMultipartContent("form-data"))
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }

        string mediaPath = await _mediaService.UploadFile(User.Identity.Name, Request.Content);

        return Ok(mediaPath);
    }
Run Code Online (Sandbox Code Playgroud)

然后,它做了一些事情:

 public async Task<string> UploadFile(string username, HttpContent content)
 {
   var storageAccount = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
   CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
   CloudBlobContainer imagesContainer = blobClient.GetContainerReference("container-" + user.UserId);
   var provider = new AzureStorageMultipartFormDataStreamProvider(imagesContainer);
   await content.ReadAsMultipartAsync(provider);
   var …
Run Code Online (Sandbox Code Playgroud)

javascript c# azure azure-storage-blobs asp.net-web-api

10
推荐指数
1
解决办法
387
查看次数

如何使用Web API中的属性路由通过URI发送数组?

我正在关注Web API 2中的属性路由文章,尝试通过URI发送数组:

[HttpPost("api/set/copy/{ids}")]
public HttpResponseMessage CopySet([FromUri]int[] ids)
Run Code Online (Sandbox Code Playgroud)

这在使用基于约定的路由时起作用:

http://localhost:24144/api/set/copy/?ids=1&ids=2&ids=3
Run Code Online (Sandbox Code Playgroud)

但是使用属性路由它不再有效 - 我找不到404.

如果我试试这个:

http://localhost:24144/api/set/copy/1
Run Code Online (Sandbox Code Playgroud)

然后它工作 - 我得到一个元素的数组.

如何以这种方式使用属性路由?

routes asp.net-web-api asp.net-web-api-routing

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

使用WebRTC MediaRecorder录制跨平台(H.264?)视频

我的MediaRecorder实现指定了以下内容:

const getMediaRecorderOptions = function () {
    var options = { mimeType: "video/webm;codecs=vp8" }; // 9 was lagggy, cpu-intensive

    if (!MediaRecorder.isTypeSupported(options.mimeType)) {
        logger.recorderLog(options.mimeType + " is not Supported");
        options = { mimeType: "video/webm;codecs=vp8" };

        if (!MediaRecorder.isTypeSupported(options.mimeType)) {
            logger.recorderLog(options.mimeType + " is not Supported");
            options = { mimeType: "video/webm" };

            if (!MediaRecorder.isTypeSupported(options.mimeType)) {
                logger.recorderLog(options.mimeType + " is not Supported");
                options = { mimeType: "" };
            }
        }
    }
    return options;
}
Run Code Online (Sandbox Code Playgroud)

显然,这仅适用于iOS Safari或MacOS不支持的webm.我试图避免加倍存储并引入编码复杂性.Chrome上的MediaRecorder是否可以任何平台直接录制跨平台容器格式?

mp4 google-chrome h.264 webm webrtc

9
推荐指数
1
解决办法
1336
查看次数

SignalR/negotiate向/ Account/Login发出请求 - 我没有帐户/登录端点

我在这个请求的日志中看到了很多条目:

/signalr/negotiate
Run Code Online (Sandbox Code Playgroud)

错误是:

The controller for path '/Account/Login' was not found or does not implement IController
Run Code Online (Sandbox Code Playgroud)

我有一个连接到AppHub需要身份验证的JS客户端:

[Authorize]
[HubName("appHub")]
public class AppHub : Hub
{
    // content
}
Run Code Online (Sandbox Code Playgroud)

发生这种情况是因为有一个'signalr`会话活着,并且过期的cookie尝试连接:

  • 我不确定为什么请求会自动搜索此页面.它没有在我的web.config,路由或其他地方指定.为什么会这样?
  • 如果用户未经身份验证,我想阻止signalR客户端尝试连接.怎么能实现这一目标?

signalr signalr.client

9
推荐指数
1
解决办法
582
查看次数