我有一个使用Web API的ASP.NET MVC 4项目.在控制器上,我已使用[Authorize]属性将类设置为需要授权.对于身份验证我使用ASP.NET成员资格提供程序并将我的Web.Config设置为使用"表单"身份验证.这是我被困的地方:
一切都工作得很好,直到我完成测试API的步骤,我想用[Authorize]属性保护控制器,这样我就可以开始对我的Membership Provider中的用户进行身份验证.所以我启动Fiddler并进行相同的调用,添加Authorization:Basic属性以及来自我的会员提供者的用户名:密码,如下所示:
我得到的响应是未经授权的401,在"Auth"下,我得到"没有WWW-Authenticate Header".然后我意识到API正在寻找SHA1编码密钥.所以我从搜索中启动一个SHA1生成器并获取我的用户名的密码:password并更新我的Request Header,如下所示:
这也不起作用,我得到相同的结果.此外,我显然需要某种"共享密钥"与服务器一起使用来解码我的用户名/密码.
所以我的问题:
提前致谢!
asp.net-mvc forms-authentication asp.net-membership fiddler asp.net-web-api
我正在为Visual Studio Team Services新版本管理系统的预览做准备.我的场景是一个经典的网站(ASP.NET 4.5),在VSTS中托管了一个Git repo.构建定义是成功的,如下所示:
它被设置为发布为可由Release Manager拾取的工件,如下所示:
在发布管理器端,我将该工件正确链接,如下所示:
在这里,您可以看到我的环境以及相关的任务(所有3个都是克隆)
当我运行发布时,构建发布很好,它连接到我的订阅但是当它试图找到包文件时,它在输出日志的第101行上有以下错误:
"没有找到使用搜索模式'C:\ a\4fe43dd1a***.zip'部署的文件"
这是完整的输出:
这是我卡住的地方,因为我假设通过VSTS的工件链接应该为我解决此路径.显然我在某个地方错过了一个重要的难题,但我尽可能地遵循了可用的文档.
如果有人有解决方案或能指出我正确的方向,我将不胜感激!
---编辑---
我使用文件选择器来选择Web部署包(见下文).我尝试使用root网站以及bin文件夹.两次尝试都会导致错误,指出:"没有找到使用搜索模式部署的文件'C:\ a\4fe43dd1a\Classic Website Definition\drop\ClassicWebsite\bin'"
---编辑2 ---
我使用以下MSBuildArguments向我的BUILD进程添加了一个MSBuild任务
/p:OutDir=$(build.stagingDirectory) /p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true
在我的复制/发布工件任务中,我将输出限制为仅复制.zip文件.现在在我的RELEASE过程中,当我导航找到"Web部署包"时,"drop"文件夹为空.这是一个截图:
我想我正走在正确的道路上,我只需要帮助搞清楚我的BUILD任务,以便为我的RELEASE进程生成正确的工件.任何帮助,将不胜感激.
我有几组文档如下:
[
{
"Name": "Document1",
"Properties": {
"Property1": [
"Value1",
"Value2",
"Value3",
]
},
"Tags": null
},
{
"Name": "Document2",
"Properties": {
"Property1": [
"Value1",
]
},
"Tags": null
},
{
"Name": "Document3",
"Properties": {
"Property1": [
"Value1",
"Value2",
]
"Property2": [
"Value1",
]
},
"Tags": null
}
]
Run Code Online (Sandbox Code Playgroud)
我需要查询Property1
Properties节点中的数组有多于1个项目的任何文档.在我上面的例子我希望只拿回Document1
和Document3
.我花了很多时间尝试使用Array_Contains语法,但一直在做空.这是我最近的尝试:
SELECT * FROM Docs d WHERE ARRAY_LENGTH([d.Properties, 'Property1']) > 1
Run Code Online (Sandbox Code Playgroud)
但是根据我的语法,我会收回所有文档.
我已经使用MVC4中的新WebAPI功能创建了一个方法,并让它在Azure上运行.该方法要求您发布一个包含Username和Password属性的简单LoginModel对象.是的,一旦我超过这个减速带,我计划进一步确保这个:-)然后该方法以Json格式响应一个对象:
我可以使用Fiddler成功调用此方法,前提是我在请求标头中包含"Content-Type:application/json".它返回200,我可以进入Fiddler检查器并查看Json响应对象就好了:
然而,我在使用C#/ XAML从Windows8中的MetroUI应用程序调用此相同方法时遇到问题.我开始在C#中使用HttpClient和新的Async概念,无论我如何格式化我的Post调用(即使明确地调用我希望Content-Type为"application/json")Fiddler返回500错误并声明该尝试使用的是Content-Type:"text/html".我相信这是问题的根源:
为了发布这个方法并获取Json对象,我已经尝试了一切可能的想法,这是我最近的尝试:
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpContent content = new StringContent(@"{ ""Username"": """ + Username.Text + @", ""Password"": """ + Password.Text + @"""}");
client.PostAsync("http://myapi.com/authentication", content).ContinueWith(result =>
{
var response = result.Result;
response.EnsureSuccessStatusCode();
});
Run Code Online (Sandbox Code Playgroud)
这导致500错误,Content-Type设置为"text/html"
这是另一次失败的尝试:
HttpClient httpClient = new HttpClient();
HttpResponseMessage response = await httpClient.PostAsync("http://myapi.com/authentication", new StringContent(@"{ ""Username"": """ + Username.Text + @", ""Password"": """ + Password.Text + @"""}", Encoding.UTF8, "application/json"));
string statusCode = response.StatusCode.ToString();
Run Code Online (Sandbox Code Playgroud)
谁能指出我正确的方向?
根据Nemesv的建议,尝试了以下代码:
HttpClient httpClient = new HttpClient();
HttpContent content …
Run Code Online (Sandbox Code Playgroud) 我有一个带有名为 TabChanged 的事件操作的自定义组件。在我的 Razor 页面中,我像这样设置了对它的引用:
<TabSet @ref="tabSet">
...
</TabSet>
@code {
private TabSet tabSet;
...
}
Run Code Online (Sandbox Code Playgroud)
在OnAfterRenderAsync方法中,我为事件分配了一个处理程序:
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if(firstRender)
{
tabSet.TabChanged += TabChanged;
}
}
Run Code Online (Sandbox Code Playgroud)
页面第一次呈现时,我收到System.NullReferenceException: Object reference not set to an instance of an object错误。
如果我切换到使用后续渲染它工作正常:
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if(!firstRender)
{
tabSet.TabChanged += TabChanged;
}
}
Run Code Online (Sandbox Code Playgroud)
但当然这是草率的,我将在渲染期间触发多个事件处理程序。
如何在第一次渲染时分配参考?我正在按照此处概述的文档进行操作
编辑
这是 TabSet.razor 文件:
@using Components.Tabs
<!-- Display the tab headers -->
<CascadingValue Value="this">
<ul …
Run Code Online (Sandbox Code Playgroud) 我是KnockoutJS的新手,到目前为止我都在挖掘它,但我可能会尝试在任何地方都找不到这些信息,所以我希望社区可以提供帮助!在我的视图中,我对文件输入有以下数据绑定:
<input type="file" data-bind="value: ImageToUpload"/>
<button data-bind="click: $root.saveImage">Upload</button>
Run Code Online (Sandbox Code Playgroud)
这是"foreach"div中列表的一部分,因此变量"ImageToUpload"对应于该列表中对象的属性.
在我的ViewModel中,Upload按钮调用saveImage(),我调用Web服务并将表单数据传递给.aspx页面:
self.saveImage = function (MyObject, event) {
$.post("Service.aspx", MyObject, function (returnedData) {
});
}
Run Code Online (Sandbox Code Playgroud)
该对象传递给我的服务很好,我可以按预期访问所有表单数据,包括"ImageToUpload"变量......但这里是我被卡住的地方:
1)"ImageToUpload"只是一个字符串,表示我上传的文件的名称,而不是ByteArray.如何访问图像文件而不仅仅是名称?
2)是否有更好的方法将ByteArray作为Stream或其他格式传递给响应头?
3)我的技术完全没了?有一个更好的方法吗?我的目标是拥有一个上传到的图像"插槽"的动态列表.
提前致谢!
我一直在为受限制的DocumentDB客户端调用编写非常详细的重试逻辑.
下面的示例是10次重试尝试的常见示例.
我的问题有两个方面: 这是最好的做法,是否有一种不那么冗长的方式来处理这个问题?我看到有一个Microsoft.Azure.Documents.Client.TransientFaultHandling nuget包应该用更少的代码实现相同的结果,但我在StackOverflow或Google上找不到任何示例,似乎没有任何明确的文档可用来自微软.
int maxRetryAttempts = 10;
while (maxRetryAttempts > 0)
{
try
{
// Attempt to call DocumentDB Method
// ---[DocumentDB Method Here]---
}
catch (DocumentClientException de)
{
if (de.StatusCode.HasValue)
{
var statusCode = (int)de.StatusCode;
if (statusCode == 429 || statusCode == 503)
{
//Sleep for retry amount
Thread.Sleep(de.RetryAfter);
//Decrement max retry attempts
maxRetryAttempts--;
}
}
}
catch (AggregateException ae)
{
foreach (Exception ex in ae.InnerExceptions)
{
if (ex is DocumentClientException)
{
var documentClientException = ex …
Run Code Online (Sandbox Code Playgroud) 我有一个Service Fabric应用程序,具有多个服务,可以在Azure上配置为"Dev","Test","Stage"和"Production".
我的目标是为我的"测试"和"舞台"环境设置1个集群,为"生产"设置另一个集群.显而易见的原因是节省成本!
我正在使用Visual Studio Online Build/Release.这是我遇到问题的地方:
我可以更新"Stage"的配置设置并部署到我的集群 - 但是由于应用程序名称将与现有的"Test"应用程序相同,因此它会使用"Stage"的新配置更新覆盖该集群上的该应用程序.
显然,我可以从Service Fabric Explorer中"创建应用程序实例" - 但是我没有办法以这种方式注入新配置 - 只为该实例设置一个新名称,这将运行另一个配置与基本相同的实例.
所以我想 - 好吧,我只会上传具有不同配置的新版本并从资源管理器部署实例 - 但这不仅看起来很麻烦,它仍然会尝试升级我运行的现有应用程序.
我还需要使用每个应用程序实例重新配置每个服务的端口,以便它们都可以存在于同一个集群中并位于相同的负载均衡器后面,但似乎没有办法覆盖ServiceManifest中的节点....
所以我的问题是:使用单独的配置和服务端口管理和隔离多个应用程序实例的最佳做法是什么,以便您可以为"Test"配置一个,为"Stage"配置另一个,并且两者都存在于同一个集群中?
.net azure azure-deployment azure-service-fabric azure-devops
我有一个 MediatR 管道行为,用于使用 FluentValidation 库验证命令。我看过很多例子,你从行为中抛出 ValidationException,这对我来说很好用。但是在我的场景中,我想用验证错误更新我的响应对象。
我能够构建和运行以下代码。当我在 if 语句中设置断点时,CommandResponse 是按预期使用验证错误构造的 - 但是当原始调用者收到响应时,它为空:
public class RequestValidationBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse> where TRequest : IRequest<TResponse>
{
private readonly IEnumerable<IValidator<TRequest>> _validators;
public RequestValidationBehavior(IEnumerable<IValidator<TRequest>> validators)
{
_validators = validators;
}
public Task<TResponse> Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate<TResponse> next)
{
var context = new ValidationContext(request);
// Run the associated validator against the request
var failures = _validators
.Select(v => v.Validate(context))
.SelectMany(result => result.Errors)
.Where(f => f != null)
.ToList();
if(failures.Count != 0)
{
var commandResponse …
Run Code Online (Sandbox Code Playgroud) 我已经尝试使用多个具有 Azure/AAD 帐户的 MS 帐户进行此操作,并尝试同时使用 Visual Studio 2015 和 2017 并得到完全相同的错误/错误。
使用带有 AAD 集成的默认 ASP.NET MVC 模板(根本没有代码更改)。该应用程序已在我的 AAD 帐户中注册,并且我看到tenantId 和其他 GUID 都在 Web.Config 中。我还尽可能地跟踪了调用堆栈,并且tenantId 已正确初始化,但我仍然收到此错误:
请求的租户标识符“00000000-0000-0000-0000-000000000000”无效。租户标识符不能是空的 GUID。
这发生在权限接受屏幕之后。
这里还有一个截图:
根据要求,这里是 Web.Config:
c# ×4
azure ×3
asp.net ×2
asp.net-core ×2
azure-devops ×2
.net ×1
asp.net-mvc ×1
blazor ×1
cqrs ×1
fiddler ×1
httpclient ×1
javascript ×1
jquery ×1
knockout.js ×1
mediatr ×1
post ×1
windows-8 ×1