注意:构建了一个github仓库以证明导致这些问题的问题.
在创建WIF安全WCF服务时,MSDN文档建议使用Visual Studio的身份和访问工具.在服务项目上运行该工具后,以下节点将添加到web.config [ commit 0472287 ]:
<ws2007FederationHttpBinding>
<binding name="">
<security mode="Message">
<message>
<issuerMetadata address="https://localhost/adfs/services/trust/mex" />
</message>
</security>
</binding>
</ws2007FederationHttpBinding>
Run Code Online (Sandbox Code Playgroud)
身份工具添加了不正确的issuerMetadata地址,根本不包括issure节点.值得庆幸的是,所有引用证书指纹的节点都是正确创建的.向此服务的客户端项目添加服务引用会导致客户端上的配置无效.在如下更改消息节点的内容后,创建对服务的服务引用会留下几乎可用的客户端(请参阅第二个问题)[ commit 758052d ].
<message>
<issuer address="https://localhost:44300/issue/wstrust/mixed/username" binding="ws2007HttpBinding" bindingConfiguration="" />
<issuerMetadata address="https://localhost:44300/issue/wstrust/mex" />
</message>
Run Code Online (Sandbox Code Playgroud)
第一个问题在设置导致绑定未正确配置的身份工具时,我做错了吗?生成的地址在STS FederationMetadata.xml文件中不存在,因此我不确定它的来源.
正确配置服务后,客户端的服务引用几乎即插即用.出于某种原因,它没有为WS2007FederationHttpBinding中的颁发者指定绑定配置.添加绑定并为WIF客户端创建绑定配置以获取令牌将导致客户端处于工作状态[ commit 39a4cbc ].
第二个问题更新服务web.config允许自动生成其余的客户端配置.我是否遗漏了客户端的内容以获得绑定自动配置?
所有这些缺少的元素都可以在IdentityMetadata.xml文件中查找,该文件是身份工具所需要的,以及两个项目都知道的FederationMetadata服务.似乎应该有一些东西可以使这些配置正确,而无需人工干预.
注意:构建了一个github仓库以证明导致这些问题的问题.
我在TopShelf容器中托管了几个webapi微服务,它们接受JSON和XML格式化程序并进行回复.运行一段时间后,XML格式化程序停止将XML请求数据绑定到模型.传递JSON或Form-Data仍然有效.指定Accept: application/xml导致XML响应的标头.重新启动服务后重播失败的XML请求将返回预期的响应.
问题的根本原因是,SupportedMediaTypes在服务运行且模型绑定失败时,XmlFormatter 的属性会在某个时刻被清除.
我怎样才能找到清除的东西SupportedMediaTypes?
调查问题的注意事项如下.
我无法在任何可以连接调试器的环境中复制问题.
当我在本地调试时,其中一个服务开始失败.从我所看到的,它是选择DataContractSerializer而不是XmlSerializer进行反序列化.
Startup类按以下顺序添加格式化程序:
config.Formatters.Clear();
config.Formatters.Add(new RecordSetMediaTypeFormatter<RecordAssociation>());
config.Formatters.Add(new XmlMediaTypeFormatter { UseXmlSerializer = true });
config.Formatters.Add(new XmlMediaTypeFormatter { UseXmlSerializer = false });
config.Formatters.Add(new JsonMediaTypeFormatter());
Run Code Online (Sandbox Code Playgroud)
检查HttpConfiguration中的格式化程序顺序表明XmlSerializer格式化程序具有优先级:
> actionContext.RequestContext.Configuration.Formatters
Count = 4
[0]: {API.Formatters.RecordSetMediaTypeFormatter<API.Contract.DataObjects.RecordAssociation>}
[1]: {System.Net.Http.Formatting.XmlMediaTypeFormatter}
[2]: {System.Net.Http.Formatting.XmlMediaTypeFormatter}
[3]: {System.Net.Http.Formatting.JsonMediaTypeFormatter}
> (actionContext.RequestContext.Configuration.Formatters[1] as System.Net.Http.Formatting.XmlMediaTypeFormatter).UseXmlSerializer
true
> (actionContext.RequestContext.Configuration.Formatters[2] as System.Net.Http.Formatting.XmlMediaTypeFormatter).UseXmlSerializer
false
Run Code Online (Sandbox Code Playgroud)
该UseXmlSerializer == true格式表明,它可以读取的类型,但UseXmlSerializer == false格式是由集合选择,即使有System.Object:
> actionContext.RequestContext.Configuration.Formatters[1].CanReadType(typeof(System.Object))
true …Run Code Online (Sandbox Code Playgroud) 有人会解释为什么dateString不同的格式会给出不同的日期吗?
> new Date("04/08/1984")
<· Sun Apr 08 1984 00:00:00 GMT-0600 (Mountain Daylight Time)
> new Date("1984-04-08")
<· Sat Apr 07 1984 18:00:00 GMT-0600 (Mountain Daylight Time)
Run Code Online (Sandbox Code Playgroud) 你如何模拟使用sinon调用回调的外部方法?给出以下代码的示例,getText应该在回调函数中返回'a string'作为响应
sinon.stub(a, 'getText').returns('a string')
let cb = function(err, response) {
console.log(response)
}
a.getText('abc', cb)
Run Code Online (Sandbox Code Playgroud)
它应该产生输出'一个字符串',因为它调用回调函数cb但没有输出
我有一个自定义模型绑定器,它从MEF容器中提取接口的实现.它实现如下:
public class PetViewModelBinder : DefaultModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var petId = bindingContext.ValueProvider.GetValue("id");
var container = controllerContext.HttpContext.Application[MvcApplication.PLUGINS] as CompositionContainer;
Lazy<IPet, IPetMetadata> pet = null;
try
{
pet = container.GetExport(typeof(IPet), petId);
var petVM = new Models.PetViewModel(pet);
bindingContext.ModelMetadata.Model = petVM;
return base.BindModel(controllerContext, bindingContext);
}
catch (Exception)
{
throw;
}
finally
{
container.ReleaseExport(pet);
}
}
Run Code Online (Sandbox Code Playgroud)
当MEF具有导出petId时,这非常有效...但是当导出不存在时返回http状态500(服务器错误).应返回错误消息混淆要求,指示http状态403(禁止).
可以采取哪些措施来捕获错误,更改响应状态,以及不返回内容,还是重新路由Action以处理此情况?
http-status-codes imodelbinder defaultmodelbinder asp.net-mvc-3