我有一个程序将数据提交给第三方Web服务。他们正在实现双因素身份验证,我必须创建一个随机数密钥(使用NewGuid),它们提供包含的编码API密钥,以及屏幕名称,URL和时间戳。
我创建了nonce,然后使用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;
}
}
答案 0 :(得分:0)
终于找到了解决方案。这是我之前从未发现过的这篇早期帖子,但是它起作用了。
How to add Custom HTTP Header for C# Web Service Client
按照第一个答案中的指示工作得很漂亮。