自定义soap标头,包含从SVCUTIL生成的代理代码

时间:2017-09-20 23:23:47

标签: c# header uri

我有一个程序将数据提交给第三方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;
    }
}

1 个答案:

答案 0 :(得分:0)

终于找到了解决方案。这是我之前从未发现过的这篇早期帖子,但是它起作用了。

How to add Custom HTTP Header for C# Web Service Client

按照第一个答案中的指示工作得很漂亮。