【发布时间】:2017-09-20 23:23:47
【问题描述】:
我有一个向第三方网络服务提交数据的程序。他们正在实现双因素身份验证,我必须创建一个 nonce 密钥(使用 NewGuid),他们提供了一个编码的 API 密钥,以及一个屏幕名称、URL 和时间戳。
我已经创建了随机数,然后使用 api 密钥对数据进行签名,最后,我将得到一个长字符串,例如:
2017-04-15T17:08:57Z-1265fb1e-bbc3-453a-be409e2a808cbaaeWpyp6EJnIUlSX1rB/YRJxRyp8cXxw2IIrFMnnvuB06cUBabyRLnD 5hPj+ndH8zSIhojvNgc10/az2N+hh6SaMA=
它声明它将在名为 X-WME-API-Token 的 HTTP 标头中发送。
我们有一个 MeterDataService.cs 文件,它是从创建代理客户端的 SVCUTIL 命令行工具生成的。我没有看到可以添加客户标题的任何地方。
我知道如果你有从 WebRequest 派生的东西,你可以做这样的事情:
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(urlString);
req.ContentType = "text/xml";
req.Headers["X-SPP-API-Token"] = Token;
req.Method = "POST";
但是,生成的对象都不是从 WebRequest 派生的,所以我不确定如何执行此操作。
一个对象,即 MeterDataPortClient 对象,有一个 Endpoint 属性。那是我会做的地方吗?我怎么做?我想这是我的问题。
我确实尝试通过从 WebRequest 继承来修改他们创建的 MeterDataRequest 对象,但随后出现此错误:
“PostMeterDataRequest 类型定义了 MessageContract,但也派生自未定义 MessageContract 的 System.Net.WebRequest 类型。PostMeterDataRequest 继承层次结构中的所有对象都必须定义 MessageContract。”
这是 PostMeterDataRequest 的定义,我看到 MessageContractAttribute 被应用于该类。我只是不熟悉这意味着什么。我只需要找到一种方法在将 HTTP 标头发送到 Web 服务之前将其添加到请求对象,因为接收端的服务希望令牌位于 HTTP 标头中,我不知道如何将其放入我手头的代码。
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
[System.ServiceModel.MessageContractAttribute(IsWrapped = false)]
public partial class PostMeterDataRequest : WebRequest // WebRequest added my me later on.
{
[System.ServiceModel.MessageBodyMemberAttribute(Namespace = "http://someorg.com/schema/MeterDataSchema/v2", Order = 0)]
public PostMeterDataType PostMeterData;
public PostMeterDataRequest()
{
}
public PostMeterDataRequest(PostMeterDataType PostMeterData)
{
this.PostMeterData = PostMeterData;
}
}
【问题讨论】: