小编Gar*_*ill的帖子

为什么我的ApiController方法具有可为空参数的ModelState.IsValid失败?

我有一个接受几个参数的ApiController方法,如下所示:

    // POST api/files
    public HttpResponseMessage UploadFile
    (
        FileDto fileDto,
        int? existingFileId,
        bool linkFromExistingFile,
        Guid? previousTrackingId
    )
    {
        if (!ModelState.IsValid)
            return Request.CreateResponse(HttpStatusCode.BadRequest);

        ...
    }
Run Code Online (Sandbox Code Playgroud)

当我发布POST时,我将FileDto对象放在请求的正文中,并将其他参数放在查询字符串上.

我已经发现我不能简单地省略可以为空的参数 - 我需要将它们放在带有空值的查询字符串上.所以,当我不想为可空参数指定值时,我的查询看起来像这样:

http://myserver/api/files?existingFileId=&linkFromExistingFile=true&previousTrackingId=
Run Code Online (Sandbox Code Playgroud)

这与我的控制器方法匹配,并且当执行该方法时,可以为空的参数null(正如您所期望的那样).

但是,对ModelState.IsValid返回的调用false,当我检查它们时,它正在抱怨两个可以为空的参数.(模型的其他位没有错误).消息是:

值是必需的,但请求中不存在.

为什么它认为价值是必需的/不存在的?当然(a)中的值要求可为空的,和(b)的值是(排序的)本-中的一种方式的空杂交排序?

model-binding asp.net-web-api

16
推荐指数
2
解决办法
4304
查看次数

EF:如何在交易中两次调用SaveChanges?

使用Entity Framework(在我的例子中是代码),我有一个操作,需要我调用SaveChanges来更新DB中的一个对象,然后再次SaveChanges来更新另一个对象.(我需要第一个SaveChanges来解决EF无法确定首先更新哪个对象的问题).

我试过做:

using (var transaction = new TransactionScope())
{
    // Do something

    db.SaveChanges();

    // Do something else

    db.SaveChanges();

    tramsaction.Complete();
}
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我在第二次SaveChanges调用时遇到异常,说"底层提供程序在打开时失败".内部异常表示我的机器上未启用MSDTC.

现在,我在其他地方看到了描述如何启用MSDTC的帖子,但似乎我还需要启用网络访问等.这听起来像是完全矫枉过正,因为没有涉及其他数据库,更不用说其他服务器了.我不想做一些会使我的整个应用程序不那么安全(或更慢)的东西.

当然必须有一个更轻量级的方法(理想情况下没有MSDTC)?!

msdtc entity-framework transactionscope sql-server-2012 entity-framework-5

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

从单个WebApi方法提供多个二进制文件的最佳方法是什么?

我有一个ASP.NET MVC 4 Web Api控制器方法,它传递一个文件ID列表并返回这些文件的缩略图.

因此,客户端可能会传入一个数字ID列表(例如10,303,29),并且该方法返回一个List,其中ThumbnailImage看起来有点像这样:

class ThumbnailImage
{
    public int Id { get; set; }
    // Some other stuff
    public byte[] RawData { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

调用者传入ID列表而不是每个项目调用一次的原因应该是显而易见的 - 可能要下载数十个或数百个项目,并且我正在尝试避免所需的所有HTTP流量单独下载它们.

目前,我正在使用RestSharp和JSON.NET,因此我的ThumbnailImage对象作为JSON通过网络传递.从简单编码的角度来看,这很好,但JSON不是表示二进制数据的有效方式.

所以,我认为我应该将原始字节作为八位字节流返回...但是,虽然我可以轻松地为单个图像执行此操作,但我不确定为多个图像执行此操作的最佳方法,特别是当我还需要为每个文件返回ID和其他其他信息时.(该ID是必需的,因为结果不一定以给定的顺序返回 - 并且某些文件可能丢失).

可以简单地将所有内容零碎地写入响应流中,以便为每个项目编写ID(适当编码),然后是图像数据的长度,然后是图像数据本身,然后是相同的内容.下一个项目等

然后,调用者将简单地继续从流中读取,直到它耗尽为止,对ID的编码(和长度!)做出假设等.

我认为这样可行,但看起来很笨 - 有更好的方法吗?

c# rest asp.net-web-api

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

在我的MVC应用程序有机会处理它之前,如何阻止IIS7推出自己的404?

我有一个ASP.NET MVC 2应用程序,它在global.asax中有一个Application_Error事件处理程序.在这里,我正在检测Exception类型是HttpException并且HTTP代码是404的情况,并重定向到我自己的404处理页面.

这在我的Cassini开发服务器上工作正常,但现在我正在尝试将其移动到具有IIS7的生产服务器(使用集成模式).

当我请求一个不存在的URL时,IIS7显示自己的404页面,据我所知,我的Application_Error方法永远不会被调用.

我该如何解决这个问题?

asp.net-mvc iis-7

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

如何在ASP.NET MVC网站中为cookie设置"安全"标志?

我在web.config中设置了以下内容:

<system.web>
  <httpCookies httpOnlyCookies="true" requireSSL="true" />
</system.web>
Run Code Online (Sandbox Code Playgroud)

当我使用HTTP连接访问网站时,它会重定向到我的登录页面(将方案指定为HTTPS).当浏览器获取此页面时,响应会设置一些cookie(ASP.NET会话cookie和我的登录表单的请求验证令牌):

Set-Cookie:__ RequestVerificationToken = IHx8a2zQU374d5CtsoEVW ... YtIc1; 路径= /; HttpOnly Set-Cookie:ASP.NET_SessionId = pfbkkxx2seqhdrxxiodxfbmh; 路径= /; 仅Http

这些有HttpOnly旗帜,这很好 - 但它们没有维基百科上secure描述的旗帜.

如果我然后登录,则会创建一个身份验证cookie,并且确实secure设置了标志:

设置Cookie:MyWebSite.Authentication = RE3UD ... BDW4; 路径= /; 安全 ; 仅Http

如何确保secure在我的所有 Cookie 上设置标志?


更新:根据要求,这是我得到的cURL输出(直接获取登录页面时):

curl https://www.mywebsite.com/Account/Login --verbose --insecure
Run Code Online (Sandbox Code Playgroud)

得到:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0 …
Run Code Online (Sandbox Code Playgroud)

asp.net security cookies asp.net-mvc owasp

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

如何在VS2017中使用TypeScript的jQuery

注意:这是关于Visual Studio 2017的问题.与早期版本相关的答案或建议可能没有帮助.谢谢.


我完全在我的智慧结束.我一直在尝试使用TypeScript(v2.3)来创建一个简单的Visual Studio 2017 Web项目,这让我感到非常沮丧,因为它让我感到疲惫和愤怒.我真的怀疑任何人都没有完成这项壮举而不放弃Visual Studio工具并在VS外面/旁边设置所有内容.

我的第一个问题是,网上有各种各样的资源,提出了不同的方法,它们都有冲突:"使用Gulp","不,使用Bower","使用NPM","不,使用WebPack".当然,很多建议都与早期版本的Visual Studio有关.

同样,对于导入模块的打字稿语法似乎与每一个版本的变化,这么多的那个建议也是出于过期,进一步取决于哪个模块加载器,等你使用.

很多选择都是"很棒的",但工具必须至少有点自以为是,我无法弄清楚阻力最小的路径是什么.我想坚持MS实际上与VS集成的东西,因为当命令和配置格式每周更改时,我真的不喜欢命令行和配置文件.

我按照TypeScript手册中的步骤创建了一个Web项目,它只是说"hello world",但是在"Add Angular 2"部分之前停止了.(我不想使用Angular,或者至少还没有使用).

所以,到目前为止,我有一些NuGet依赖项,一些NPM依赖项,以及package.json,tsconfig.jsongulpfile.json文件.

我现在要做的是将jQuery添加到我的项目中,并且能够说(在我的TypeScript文件中):

let foo: JQuery = $("p");
Run Code Online (Sandbox Code Playgroud)

所以,我显然需要jQuery库,我需要jQuery的typescript定义.这应该不难 - 但我,一个有30年历史的开发人员,无法弄清楚如何使用新工具添加这些东西.

我尝试在NPM package.json文件中添加"jquery"作为依赖项:

"dependencies": {
  "jquery": "^3.2.1"
},
Run Code Online (Sandbox Code Playgroud)

...但我无法弄清楚如何添加相应的打字稿定义.

TypeScript手册建议使用,npm import @types/jquery但我没有NPM命令行,当我尝试将它直接添加到package.json文件中的依赖项(或devDependencies)部分时,它无法识别它.

在我发现的另一个"教程"中(这个使用Bower只是为了确保它有点混乱),建议将以下内容添加到tsconfig.json文件中以启用TypeScript的自动类型获取,这听起来很棒:

"typeAcquisition": {
  "enable": true
},
Run Code Online (Sandbox Code Playgroud)

但遗憾的是,这似乎不起作用.或者至少,不是我目前的设置.[虽然当我按照其他教程中的步骤时它确实在IDE中提供了Intellisense,但我实际上从来没有能够让项目进行编译.]

所以,我在这里,求助于你.我怎样才能得到我的单行TypeScript来(a)识别JQuery类型定义,(b)实际编译和运行?

更好的是,如果有人知道任何在线资源实际上解释了当前版本的所有工具的所有这些,那么我很乐意看到这一点.否则我可能会回到VS2015.

typescript visual-studio-2017

13
推荐指数
1
解决办法
3144
查看次数

什么时候创建ApiController实例?

是为每个请求提供服务而创建的ApiController的新实例,还是以某种方式"汇集"以服务后续请求?

我问的原因是我想知道成员变量的生命周期,例如脚手架放入的DbContext成员(还有我自己的成员).

asp.net-mvc asp.net-web-api

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

如何告诉AutoFixture在实例化TBase时始终创建TDerived?

我有一个深度嵌套的对象模型,其中一些类可能看起来像这样:

class TBase { ... }

class TDerived : TBase { ... }

class Container
{
    ICollection<TBase> instances;
    ...
}

class TopLevel
{
    Container container1;
    Container container2;
    ...
}
Run Code Online (Sandbox Code Playgroud)

我想将我的顶级对象创建为测试夹具,但我希望所有TBase实例(例如instances上面的集合中)都是实例TDerived而不是TBase.

我以为我可以简单地使用以下内容来做到这一点:

var fixture = new Fixture();

fixture.Customize<TBase>(c => c.Create<TDerived>());

var model = this.fixture.Create<TopLevel>();
Run Code Online (Sandbox Code Playgroud)

...但是这不起作用,因为lambda表达式Customize是错误的.我猜测有一种方法可以做到这一点,但AutoFixture似乎缺乏文档,而不是开发人员博客上的意识流.

谁能指出我正确的方向?

c# autofixture

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

如何在DateTime中创建表示日期的XElement,类型为xs:Date

我正在使用XDocument创建XML文件,如下所示:

var d = DateTime.Now;

var xDocument = new XDocument(new XElement("ThisIsADate", d));
Run Code Online (Sandbox Code Playgroud)

但是,生成的XML表示使用xs:datetime格式的日期d(例如"2012-05-11T00:00:00").也就是说,它包括时间信息.

但是,我的XML旨在匹配我的XML Schema,它将元素定义为类型为"xs:date".因此,由于额外的时间信息,在针对模式进行验证时会拒绝该文件.

我怎样才能解决这个问题?我知道我可以使用带有格式的ToString()来自己格式化日期,但这肯定不是"正确"的方法.我不能指望如何将日期格式化为有效的XML日期 - 这是框架的XML相关部分的工作.


编辑:请注意,我知道如何格式化日期使用的ToString(),我也知道什么格式字符串会给我正确的结果.这不是我正在寻找的答案.我正在寻找一个函数/方法/类,它理解xs:date(等等)是什么,并支持那些类型的编码.

要清楚,我不是要"完成它",我希望"做得对".在我的书中重新发明XML轮并不是"做得对".

c# xml xsd

11
推荐指数
1
解决办法
4783
查看次数

如何可靠地获取Word文档中的页数?

我正在使用自动化对Word文档进行大量更改,然后运行VBA宏,其中包括检查文档不超过一定数量的页面.

我正在使用ActiveDocument.Information(wdNumberOfPagesInDocument)获取页数,但此方法返回的结果不正确.我认为这是因为Word尚未更新文档的分页以反映我所做的更改.

ActiveDocument.ComputeStatistics(wdStatisticPages) 也遇到同样的问题.

我试着坚持打电话ActiveDocument.Repaginate,但这没什么区别.

我确实有一些运气,在文档的末尾添加一个段落,然后再次删除它 - 但该黑客似乎不再有效(我最近从Word 2003迁移到Word 2010).

有什么方法可以强制Word 实际重新组合,和/或等到重新分页完成后?

vba ms-word word-vba word-2010

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