小编Joh*_*dal的帖子

基于MVC的API - 如何实现OAuth?

我现在已经尝试了几个小时来让OAuth继续使用我正在研究的API,显然我的做法一定是错的,因为我经常遇到死胡同.

我得到的:
- 一个在.NET MVC中实现的API,它以XML或JSON的形式返回数据结果.
- 它需要API密钥才能使用API​​.
- 用于管理API密钥的后端网站(X).
- 另一个网站(Y),其中包含此API从中提取数据的大量数据.

我应该得到的:
- 能够让API密钥从网站(Y)访问用户的数据,如果他们通过OAuth(1.0A)自己允许的话.

我尝试过:
- 到目前为止,我的方法是使用DotNetOpenAuth库,但几乎所有关于如何实现OpenId,OAuth名称空间中的某些类甚至似乎都硬编码为OpenId功能.所以我一直试图看看使用OpenId的示例中发生了什么,看看我是否可以使用其中的一部分来实现没有OpenId的OAuth.
- 在服务器端,各种方法包括读取"UnauthorizedTokenRequest"并通过调用ServiceProvider.Channel.PrepareResponse(unauthorizedTokenRequest).AsActionResult()返回它.AsActionResult()由于某种原因尝试将两个nonce和timestamp值添加到响应崩溃,并跳过它,它仍然返回一个我无法在客户端读取的响应.

所以我想,我的问题是:

  1. 是否有指南/文档告诉您我应该在服务器端使用DotNetOpenAuth库的哪些部分,以及何时应该使用它们,以便在未硬编码到OpenId的MVC服务器上实现OAuth,因为这两个网站(X和Y)都不支持OpenId?
  2. 如果我不打算使用OpenId,我是否应该使用另一个库,因为DotNetOpenAuth似乎最关注?
  3. 任何其他更符合我需要的方法都是非常受欢迎的.

先感谢您!
- 丹麦约翰尼

api asp.net-mvc oauth dotnetopenauth

7
推荐指数
1
解决办法
1305
查看次数

如何在C#中应用Word快速风格 - 不只是简单的格式化而是整个风格?

我承认,我对使用Interop库非常陌生,但人们似乎总是给出的建议是,记录一个宏并查看vba代码.问题是,宏没有准确记录我正在做的事情:单击快速样式将其应用于当前选择.

我的任务非常简单:我需要将快速样式应用于段落(Microsoft.Office.Interop.Word.Paragraph).但是,使用set_style命令仅应用基本格式,并且段落保持原始快速样式选择(正常).

使用Remou的方法虽然对我有用,但它看起来与我自己的代码非常相似,我无法使它工作,我认为这可能是我对对象模型的理解有点过时了.

public void AddParagraph(string text, string styleName = null)
{
  Paragraph paragraph = _document.Content.Paragraphs.Add();
  if (styleName != null)
  {
    paragraph.Range.set_Style(_document.Styles[styleName]);
  }

  paragraph.Range.Text = text;
  paragraph.Range.InsertParagraphAfter();
}
Run Code Online (Sandbox Code Playgroud)

然后我用eg调用它AddParagraph("A title", "Heading 1");,但是使用上面的包装器构建我的文档的结果是,没有应用完整的样式,只有字体,颜色,大小和粗体/斜体.

我使用自己的.dotx文件,使用我自己定义和命名的样式,但只是从Remou复制代码使用我自己的模板,所以我不认为这是问题,并且使用该代码我无法弄清楚如何用自己的样式附加多个段落.

任何人都可以指出我的方法有什么问题,或者至少我如何能够让Remou为我的要求提供答案?:)

c# interop ms-word styling

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

避免在新分支上的首次构建中包含所有工作项

我们的 CI/CD 目前已建立,因此我们会在 PR 完成后不断生成安装程序。然而,这是我们的内部管道。当我们准备好发布时,我们会打开一个稳定分支(发布分支),在其中执行各种操作,例如轻按二进制文件中的开关,以便它们不再将它们呈现为内部测试二进制文件,而是常规生产二进制文件。

问题出在 WorkItem 跟踪中。发布分支上的第一个构建显示为包含自第 0 天以来包含的每个工作项,甚至将构建添加到工作项中。但我们只对标记 PR 中针对新发布分支的工作项感兴趣,而不是直到分支创建点为止的整个历史记录。

以下是我们如何拓展业务的概述。“4.9.6”仅包含 1 个 PR(2 个提交和 1 个合并提交),master 分支继续前进:

分公司概况

这是在发布分支上触发的第一个 CI 构建:

第一个 CI 构建于 4.9.6 分支

由于某种原因,它似乎只包含了最新的 50 个提交(我相信它刚刚达到上限),这也导致了一长串“链接的工作项”。然而,在“4.9.6”分支的生命周期中,唯一的 PR 中只包含 1 个工作项。

是否有可能以某种方式避免这种情况,或者只是解决该问题的一种方法?

azure-devops azure-pipelines

7
推荐指数
0
解决办法
133
查看次数

为什么方法类型推断无法推断出类型参数?

我不确定如何使这个问题可读/可理解,但听到我的意见,我希望你能在我们结束时理解我的问题(至少,它很容易重现).

我尝试调用一个用于在UnitTests中验证结果的方法.它有以下签名:

void AssertPropertyValues<TEnumerable, TElement, TProperty>(
  TEnumerable enumerable, 
  Func<TElement, TProperty> propertyPointer, 
  params TProperty[] expectedValues) 
  where TEnumerable : System.Collections.Generic.IList<TElement>
Run Code Online (Sandbox Code Playgroud)

这意味着,它需要以下输入

  1. 任何可枚举的对象,包含与2的intput相同类型的对象.
  2. 一个Func(通常封装lambda表达式),它接受与1)的"contents"相同类型的对象,并返回与3)中提供的数组内容类型相同的Type类型的对象.
  3. 与2)中Func的输出相同类型的对象数组.

因此,此方法的实际执行可能如下所示:

AssertPropertyValues(
  item.ItemGroups, 
  itemGroup => itemGroup.Name, 
  "Name1", "Name2", "Name3");
Run Code Online (Sandbox Code Playgroud)

至少,这就是我希望它看起来像,但我遇到了众所周知的编译器错误:"方法'X'的类型参数不能从使用中推断出来.",这就是我不知道的了解.它应该具有我所能看到的所有信息,或者它可能是"协方差和反演"问题的另一个版本?

所以现在我不得不这样做:

AssertPropertyValues(
  item.ItemGroups, 
  (ItemGroup itemGroup) => itemGroup.Name, 
  "Name1", "Name2", "Name3");
Run Code Online (Sandbox Code Playgroud)

任何人都可以指出为什么编译器无法推断出这种情况?

c# generics lambda

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

YamlDotNet 找不到属性

我正在尝试创建一个简单的模型,用于使用YamlDotNet将 yaml 文件解析为我的域对象。需要注意的是,我希望域模型是只读的,所以我试图通过继承和内部设置器来解决这个问题。

但出于某种原因,库抛出了一个异常,说明:

在类型“ConsoleApplication1.Repositories.YamlTemplateRepository+DeserializeableTemplate”上找不到属性“?HtmlTemplate”。

我正在使用别名,但即使刮擦它,并且使用具有正确属性名称的测试类也不能正确设置。

我究竟做错了什么?我是否误解了图书馆应该如何使用?

调用 YamlDotNet 的代码如下所示:

deserializer.Deserialize<DeserializeableTemplate>(yamlContents);
Run Code Online (Sandbox Code Playgroud)

我正在反序列化的类如下所示:

private class DeserializeableTemplate : Template
{
  [YamlMember(Alias = "HtmlTemplate")]
  public string HtmlTemplateWrapper
  {
    get { return HtmlTemplate; }
    set { HtmlTemplate = value; }
  }

  // A few more properties...
}
Run Code Online (Sandbox Code Playgroud)

和我继承的课程:

public class Template
{
  public string HtmlTemplate { get; internal set; }
  // A few more properties...
}
Run Code Online (Sandbox Code Playgroud)

可以在此处找到具有相同错误的小型控制台测试应用程序

c# yamldotnet

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

“降级”MS dll 在升级时消失 - Windows Installer

我们开发了一个通过 Windows Installer 分发的应用程序,该应用程序是使用 WiX 创建的,我们的客户可以从任何旧版本升级到最新版本。

然而,我们的最新版本删除了 2 个 dll,这只能通过重新安装来纠正。

有关 NuGet 包的详细信息

Microsoft.IdentityModel.Protocol.Extensions已从Nuget 版本 1.0.2.206221351和文件版本 1.0.20622.1351 升级到Nuget 版本 1.0.4.403061554和文件版本 1.0.4.54。

System.IdentityModel.Tokens.Jwt的文件版本控制也发生了类似的变化,从Nuget 版本 4.0.2.206221351Nuget 版本 4.0.4.403061554

因此,通过更改文件版本的计算方式,MS 有效地将版本更改为之前的降级版本(从构建版本的 20622 更改为 4)。

为什么升级时 dll 被删除

有人称其为错误,有人称其为功能,但发生的情况是,MSI 有一个步骤,它会记录所有需要升级的文件,然后卸载当前版本,然后仅安装需要升级的文件。版本没有变化或升级 - 任何降级都被排除在外。

问题:我们如何解决这个问题?

我们正在将该产品运送给许多不同的客户,他们的技术技能也各不相同,因此升级效果更好,否则我们将面临大量支持问题。有什么我可以改变的,而不需要实际禁用诸如 MSI 在出现错误时回滚的功能之类的功能,我认为这是对其他解决相同问题的人的权衡。

windows-installer wix nuget

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

如何推广/ ff分支到HEAD

我有一个受保护的分支,只有在集成构建的集成构建通过后才应该提升/快速转发.

我目前试图通过集成构建对集成分支的拉取请求来解决这个问题,一旦成功,只需将发布分支快速转发到集成分支的顶端即可.

但是,当我在TFS构建系统上构建分支时,它将检查集成分支头部的提交,使构建服务器处于分离头状态.

这一切都应该没问题,但出于某种原因,如果不使用多个语句,我就不能这样做.对我来说,直观地说,应该有一个简单的命令.我只想将分支点快进到当前提交.

但就目前而言,我找到了两种方法:

使用脚本保存HEAD提交

  1. 将HEAD提交保存为当前shell脚本语言中的变量(此处保存为%HEAD_commit_id%)
  2. git checkout release
  3. git merge %HEAD_commit_id%

使用丢弃分支

  1. git branch current-head
  2. git checkout release
  3. git merge current-head
  4. git branch -d current-head

寻找更好的解决方案

上述是我能做到的"最好的"是正确的吗?我认为这个存在一条线?解决方案1和解决方案2都有其警告,所以我宁愿不同意,但我最终可能最终会使用数字2.

重现场景的步骤

要重现我所拥有的确切场景,您需要2个提交(C1和C2)和2个分支(释放和集成).

点释放到C1,集成到C2,HEAD到C2(分离头状态).

最终结果应该允许我推送发布分支,现在指向与集成相同的提交.

git tfs

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