小编blo*_*aak的帖子

如何配置HttpClient在收到301 HTTP状态代码时不自动重定向?

考虑重定向的ASP.NET Web API服务

public class ThisController : ApiController
{
    /* more methods */

    public override HttpResponseMessage Post()
    {
        var result = new HttpResponseMessage(HttpStatusCode.MovedPermanently);
        // Post requests should be made to "ThatController" instead.
        string uri = Url.Route("That", null);
        result.Headers.Location = new Uri(uri, UriKind.Relative);
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

试图验证POST数据到"api/this"会将你重定向到"api/that",我有以下测试方法:

[TestMethod]
public void PostRedirects()
{
    using (var client = CreateHttpClient("application/json"))
    {
        var content = CreateContent(expected, "application/json");
        using (var responseMessage = client.PostAsync("api/this", content).Result)
        {
            Assert.AreEqual(HttpStatusCode.MovedPermanently, responseMessage.StatusCode);
            Assert.AreEqual(new Uri("https://api.example.com/api/that"), responseMessage.Headers.Location);
        }
    }
}

protected HttpClient …
Run Code Online (Sandbox Code Playgroud)

c#-4.0 asp.net-web-api dotnet-httpclient

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

使用自定义类型鉴别器告诉JSON.net要反序列化的类层次结构的类型

假设我有以下类层次结构:

public abstract class Organization
{
    /* properties related to all organizations */
}

public sealed class Company : Organization
{
     /* properties related to companies */
} 

public sealed class NonProfitOrganization : Organization
{
     /* properties related to non profit organizations */
}
Run Code Online (Sandbox Code Playgroud)

是否有可能让json.net使用属性(比如"type"或"discriminator")来确定对象在反序列化组织时的类型?例如,以下内容应反序列化Company的实例.

{
   "type": "company"
   /* other properties related to companies */
}
Run Code Online (Sandbox Code Playgroud)

以下应该反序列化NonProfitOrganization的实例.

{
   "type": "non-profit"
   /* other properties related to non profit */
}
Run Code Online (Sandbox Code Playgroud)

当我打电话给以下人时:

Organization organization = JsonConvert.DeserializeObject<Organization>(payload);
Run Code Online (Sandbox Code Playgroud)

其中payload是上面的JSON片段.我看一下在属性或类上设置" TypeNameHandling ",但是它序列化了整个.NET类型,当在不同的命名空间和程序集中定义类时,它在客户端和服务器之间不是"可移植的".

我宁愿定义类型是一种中性的方式,用任何语言编写的客户端都可以用它来确定被序列化的对象类型的实际类型.

json.net c#-4.0

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

Hows会阻止密码和其他敏感信息出现在ASP.NET转储中吗?

如何防止在IIS/ASP.NET转储文件中提交和接收ASP.NET网页的密码和其他敏感数据?

重现步骤

  1. 使用Visual Studio 2010,创建ASP.NET MVC 3 Intranet应用程序.
  2. 将其配置为使用IIS 7.5.
  3. 启动它并注册一个帐户(比如bob123作为用户,Pa $$ w0Rd作为密码.我假设创建了SQL Express数据库并且网站功能完备.
  4. 使用任务管理器,右键单击w3wp进程并创建转储.
  5. 在能够以十六进制显示其内容的编辑器中打开转储,例如SlickEdit.
  6. 在十六进制转储中搜索"Pa $$ 0Rd"和"Pa%24%24w0Rd".您应该能够找到以ASCII,Unicode或编码形式存储的多个副本.

请注意,使用HTTPS无关紧要,因为它只会加密通信.ASP.NET将数据存储在内存或磁盘中.

问题

通用的智慧是加密敏感数据而不是将其存储在清晰的数据中.但是,员工可能会收到IIS/ASP.NET应用程序的转储并发现用户的密码和其他机密数据,因为此信息既未加密,也未在使用后清除ASP.NET使用的内存.

这使他们处于危险之中,因为他们可以访问它.有时会与合作伙伴(例如Microsoft)共享转储,以帮助他们诊断代码中的问题.它是在一个应用程序中诊断一些非常复杂的问题的必要部分.

我看到的东西

  1. 将SecureString用于密码和其他敏感数据.但是,ASP.NET成员资格提供程序以及其他框架(如WCF)通常接受密码作为System.String,这意味着这些副本仍将在转储中.
  2. 看看框架中是否有任何东西在不再使用时清除System.String的副本.我找不到任何东西.
  3. 调查一旦IIS完成后,是否可以将用于请求和响应的内存清零,但我无法找到任何内容.
  4. 我调查了一个可以加密IIS接收的文件(作为HttpPostFile),以便它们不会以明文形式存储.我们可能会收到极其机密的文档,并且每一步都会在服务器上加密和保护它们.但是,有人可以从IIS转储中清除它们.

我希望的是告诉IIS/ASP.NET特定请求/响应包含敏感数据,并且IIS/ASP.NET将在使用它时清除内存.

asp.net security crash-dumps iis-7.5

26
推荐指数
1
解决办法
1382
查看次数

如何正确实现MediaTypeFormatter来处理'multipart/mixed'类型的请求?

考虑使用ASP.NET Web API编写的Web服务将任何数字文件作为"multipart/mixed"请求接受.辅助方法mat看起来如下(假设_client是一个实例System.Net.Http.HttpClient):

public T Post<T>(string requestUri, T value, params Stream[] streams)
{
    var requestMessage = new HttpRequestMessage();
    var objectContent = requestMessage.CreateContent(
        value,
        MediaTypeHeaderValue.Parse("application/json"),
        new MediaTypeFormatter[] {new JsonMediaTypeFormatter()},
        new FormatterSelector());

    var content = new MultipartContent();
    content.Add(objectContent);
    foreach (var stream in streams)
    {
        var streamContent = new StreamContent(stream);
        streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
        streamContent.Headers.ContentDisposition =
            new ContentDispositionHeaderValue("form-data")
            {
                Name = "file",
                FileName = "mystream.doc"
            };
        content.Add(streamContent);
    }

    return _httpClient.PostAsync(requestUri, content)
        .ContinueWith(t => t.Result.Content.ReadAsAsync<T>()).Unwrap().Result;
}
Run Code Online (Sandbox Code Playgroud)

在ApiController的子类中接受请求的方法具有如下签名:

public HttpResponseMessage Post(HttpRequestMessage …
Run Code Online (Sandbox Code Playgroud)

c#-4.0 asp.net-web-api

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

如何使用SignalR从ASP.NET MVC 3通知Web客户端已完成MSMQ任务

如何使用SignalR在.NET 4.0系统中实现通知,该系统由ASP.NET MVC 3应用程序(使用表单身份验证),SQL Server 2008数据库和MSMQ WCF服务(托管在WAS中)来处理数据?运行时环境包含在Windows Server 2008 R2 Standard Edition上运行的IIS 7.5.

我只玩了样本,没有广泛的SignalR知识.

这是一些背景知识

Web应用程序接受来自用户的数据并将其添加到表中.然后,它调用WCF服务的单向操作(使用数据库密钥)来处理数据(任务).Web应用程序返回到一个页面,告诉用户数据已提交,并在处理完成时通知他们.用户可以查看"索引"页面,查看哪些任务已完成,失败或正在进行中.他们可以继续提交更多任务(这与以前的数据无关).他们可以关闭浏览器并稍后返回.

基于MSMQ的WCF服务从数据库中读取记录并处理数据.这可能需要几毫秒到几分钟的时间.处理完数据后,记录会以相应的状态(错误或失败)和结果进行更新.

大多数情况下,WCF服务不执行任何处理,但是当它执行时,用户通常希望尽快知道何时完成.即使用户没有要由WCF服务处理的数据,用户仍将使用Web应用程序的其他部分.

这就是我所做的

在主导航栏中,我有一个指示器(类似于Facebook或Google+),供用户在任务状态发生变化时通知他们.当他们点击它时,他们会得到已完成的内容的摘要,然后可以根据需要查看结果.

使用jQuery,我轮询服务器的更改.控制器操作检查是否存在任何已修改(已完成或失败)的进程并返回它们,否则等待几秒钟并再次检查而不返回客户端.为了避免客户端超时,如果没有更改,它将在30秒后返回.jQuery脚本等待一段时间再试一次.

问题

每个查看页面的用户的性能都会下降.他们没有必要特别做任何事情.我们注意到Firefox 7+和Safari的内存使用量会随着时间的推移而增加.

使用SignalR

我希望切换到SignalR可以减少轮询,从而减少资源需求,尤其是在数据库中没有任何改变任务的情况下.我很难通过WCF服务来通知客户端它已完成处理任务,因为它使用基于表单的身份验证.

通过提出这个问题,我希望有人能够更好地了解他们如何使用SignalR重新设计我的通知方案,如果有的话.

c# wcf msmq asp.net-mvc-3 signalr

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

使用Roslyn将自定义属性添加到C#类

考虑文件"MyClass.cs"中的以下类

using System;

public class MyClass : Entity<long>
{
    public long Id
    {
        get;
        set;
    }

    [Required]
    public string Name
    {
        get;
        set;
    }

    public string Slug
    {
        get;
        set;
    }

    public DateTime CreatedOn
    {
        get;
        private set;
    }

    public DateTime UpdatedOn
    {
        get;
        private set;
    }

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

目前我手动创建数据合同类,如下所示:

[DataContract(Namespace = "http://example.com/", Name = "MyClass")]
public sealed class MyClass
{
    [DataMember(EmitDefaultValue = false, Name = "Id")]
    public long Id
    {
        get;
        set;
    }

    [DataMember(EmitDefaultValue = false, Name …
Run Code Online (Sandbox Code Playgroud)

c# code-generation roslyn

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

如何使用git比较文件的工作副本,登台副本和提交的副本

假设我有一个名为LICENSE.txt的存储库中的文件.内容如下:

Copyright 2014 MyCompany. All Rights Reserved.
Run Code Online (Sandbox Code Playgroud)

自2015年以来,我改变了今年的2015年:

Copyright 2015 MyCompany. All Rights Reserved.
Run Code Online (Sandbox Code Playgroud)

然后上传文件

git add LICENSE.txt
Run Code Online (Sandbox Code Playgroud)

由于分心,我对LICENSE.txt做了另一个更改,以反映另一个组织的版权.

Copyright 2015 MyCompany and Affiliates. All Rights Reserved.
Copyright 2015 Other Company. All Rights Reserved.
Run Code Online (Sandbox Code Playgroud)

通过运行,我能够看到我的工作副本和分阶段副本之间的区别

git diff 
Run Code Online (Sandbox Code Playgroud)

我可以通过运行看到分阶段副本和提交副本之间的区别

git diff --cached
Run Code Online (Sandbox Code Playgroud)

如何将承诺的副本(没有更改年份的副本)与工作副本(具有附加版权的副本)进行比较?

这纯粹是一个例子.有些情况要复杂得多,我需要将我上演的内容与我随后对文件所做的更改进行比较.比较工作副本和分阶段副本的内容将决定是否应该替换分阶段副本.

我在Windows Server 2012 R2上运行git 1.9.5.

git git-diff

10
推荐指数
2
解决办法
7962
查看次数

如何在OS X Server上部署django应用程序?

如何在OS X Server 2.0上部署Django应用程序而不使用自制程序或不同于OS X 10.8.1附带的python风格的python?我在Django应用程序中使用cocoa绑定,并且无法在我的桌面计算机上运行自制程序(运行OS X 10.8.1); 因此请求在系统安装的Python版本上部署应用程序.

我有以下OS X Server环境,已安装以下内容:

  • OS X 10.8.1
  • OS X Server 2.0
  • Python 2.7.2
  • Apache 2.2.22

使用以下命令安装Django 1.4.1:

sudo easy_install django
Run Code Online (Sandbox Code Playgroud)

我的第一次尝试是部署一个空网站,一旦成功,就部署一个真正的应用程序用于生产.该项目是/Library/Server/Web/Data/WebApps/mysite/使用以下命令创建的

django-admin.py startproject mysite
Run Code Online (Sandbox Code Playgroud)

我使用以下命令运行应用程序.它只是确认应用程序已启动并正在运行.这是标准的"它奏效了!" 首次创建项目时的页面.

python manage.py runserver 8080
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个/Library/Server/Web/Config/apache2/httpd_mysite.conf包含以下内容的文件:

WSGIScriptAlias /mysite /Library/Server/Web/Data/WebApps/mysite/mysite/wsgi.py
Run Code Online (Sandbox Code Playgroud)

我进一步创建了一个/Library/Server/Web/Config/apache2/webapps/com.example.mysite.wsgi.plist包含以下内容的文件:

<?xml version="1.0" encoding="UTF-7"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>name</key>
        <string>com.example.mysite.wsgi</string>
        <key>displayName</key>
        <string>Python "My Site" app</string>
        <key>launchKeys</key>
        <array/>
        <key>proxies</key>
        <dict/>
        <key>installationIndicatorFilePath</key>
        <string>/Library/Server/Web/Data/WebApps/mysite/mysite/wsgi.py</string>
        <key>includeFiles</key>
        <array>
                <string>/Library/Server/Web/Config/apache2/httpd_mysite.conf</string>
        </array>
        <key>requiredModuleNames</key> …
Run Code Online (Sandbox Code Playgroud)

django macos mod-wsgi apache2

6
推荐指数
1
解决办法
5911
查看次数

如何使用T4将类从一个项目转换为另一个项目?

假设我有一个带有许多C#类的项目(比如ProjectA),并且这些类不引用项目外部的任何类型和System.dll程序集的类型.ProjectA中的类可能具有方法,属性,字段和自定义属性.类也可以存在于不同的名称空间中.

如何使用T4将所有这些类(包括方法,属性,字段和自定义属性)从ProjectA转换为另一个项目(例如ProjectB)中的相关集合.

c# t4 visual-studio-2010

5
推荐指数
1
解决办法
878
查看次数

通过关注正则表达式中定义的边界情况,从正则表达式生成样本数据以验证输入字符串

有几种工具如何为给定的正则表达式生成样本数据.一些包括:

但是,虽然它们可能足以为数据集设定种子,但它对测试依赖于正则表达式本身的代码(例如验证)没有太大帮助.

假设您有一个代码生成器,可以生成带有属性的模型.用户指定正则表达式来验证属性.现在假设代码生成器正在尝试生成测试以确保验证成功并且适当地失败.该工具专注于正则表达式中的边界情况以避免生成不必要的数据似乎是合理的.

例如,考虑一个正则表达式^([a-z]{3,6})$然后边界情况包括:

  • 任何只包含[az]长度等于2的字符串(失败)
  • 任何只包含[az]长度等于3的字符串(成功)
  • 任何只包含[az]长度等于4的字符串(成功)
  • 任何只包含[az]长度等于5的字符串(成功)
  • 任何只包含[az]长度等于6的字符串(成功)
  • 任何只包含[az]长度等于7的字符串(失败)
  • 任何不包含[az]的字符串(失败)
  • 任何不以[az]开头但以[az]结尾的字符串(失败)
  • 任何以[az]开头但不以[az]结尾的字符串(失败)

关注边界情况的原因是任何仅由[az]组成的长度大于6的字符串都会验证正则表达式中定义的字符串长度的上边界.因此,测试长度为7,8,9的字符串实际上只是测试相同(边界)条件.

这是一个因其简单而选择的任意正则表达式,但任何合理的正则表达式都可以作为输入.

是否存在框架/工具,代码生成器可以使用它来为正在生成的系统的不同层的测试用例生成输入字符串.当系统不再在开发周期的后期生成和修改时,测试用例就会出现.

c# regex testing code-generation

5
推荐指数
1
解决办法
1117
查看次数

将ASP.NET MVC Razor @helper函数转换为辅助类的方法

请考虑以下ASP.NET MVC razor视图片段,它定义了一个帮助器

@helper FieldFor<TModel>(Expression<Func<TModel, string>> expression)
{
    <div class="form-group">
        @Html.LabelFor(expression,
                       htmlAttributes:
                           new {@class = "control-label col-md-2"})

        <div class="col-md-10">
            @Html.EditorFor(expression,
                            new
                            {
                                htmlAttributes =
                                new {@class = "form-control"}
                            })
            @Html.ValidationMessageFor(expression, "",
                                       new {@class = "text-danger"})

        </div>
    </div>
}
Run Code Online (Sandbox Code Playgroud)

将它转换为类似于以下类的方法的模式是什么?

public static MvcHtmlString FieldFor(this HtmlHelper helper, FieldFor<TModel>(Expression<Func<TModel, string>> expression))
{
   /* Method */
}
Run Code Online (Sandbox Code Playgroud)

我发现的所有示例都专注于生成不依赖于其他HTML帮助程序的标记.

c# asp.net-mvc razor

4
推荐指数
1
解决办法
2536
查看次数