为什么Web服务拒绝阅读我正在寻找的SOAP标头?

时间:2014-05-11 13:14:50

标签: c# asp.net web-services soap asmx

我已经继承了一段已在我们公司工作了一段时间的代码,现在我对它到底出了什么问题毫无头绪。不用多说,让我们来解决这个问题。

如何运作

我们有一套通讯系统如下: JavaScript< -Ajax-> Web服务代理< - >网页服务 基本上,JavaScript会发送要调用的服务,使用哪个方法代理代理,代理然后构造Http请求,然后将其发送到我们的Web服务之一。

问题是什么?

现在发生的新事情是我正在尝试将SOAP标头附加到Http请求。 Rigt现在,JavaScript代码无关紧要 - 我相当确定问题出在代理和Web服务之间。构建HTTP请求的代码如下所示:

HttpWebRequest basicRequest = (HttpWebRequest)WebRequest.Create(this.url);
basicRequest.ContentType = "application/json; charset=\"utf-8\""; 
basicRequest.Method = "POST";
basicRequest.AllowWriteStreamBuffering = false;

if (Ticket != string.Empty && Ticket != null)
{
    basicRequest.Headers["UserAuthenticationHeader"] = Ticket;
}

现在我在调用

之前检查请求
this.HttpResponse = (HttpWebResponse)HttpRequest.GetResponse();

方法,调试器告诉我标题就在那里。更确切地说,这些是Headers属性的内容:

{Content-Type: application/json; charset="utf-8"
 UserAuthenticationHeader: user;ticket
 Host: localhost:25691
 Content-Length: 55
 Expect: 100-continue}

现在,调用了Web服务中的相应方法。现在我希望这段代码:

public class UserAuthenticationHeader : SoapHeader
{
    public string Ticket { get; set; }
}

[WebService(Namespace = "http:*****", Description = "")]
[System.Web.Script.Services.ScriptService]
public class DataGetService : System.Web.Services.WebService
{
    public virtual UserAuthenticationHeader UserAuthenticationHeader { get; set; }

    [WebMethod(Description = "Gets all modules")]
    [SoapHeader("UserAuthenticationHeader")]
    public ModulesDS GetMetadataModules(Guid GlobalUserId)
    {
       Authentication.Authenticate(UserAuthenticationHeader);

       return Sql.GetMetadataModules(GlobalUserId);
    }
}

将基于一些MSDN文章填充UserAuthenticationHeader的内容,这将插入" UserAuthenticationHeader"的值。进入UserAuthenticationHeader属性。但它并没有。当我到达这里时,它是空的。所以是的,我做错了什么?我过去5个小时一直在努力解决这个问题而且无法弄清楚任何事情。我通常无法传输任何标题,我甚至试图通过SoapUnknownHeader解析无效。

我已经尝试过关于如何通过soap标头发送的几个教程,但我大多只是编写了应用程序中已经存在的相同代码。我尝试了将标头插入HttpWebRequest的不同方法,但所有基本上都做同样的事情(并不奇怪)。除此之外,我还没有找到任何关于这个特定通信的好消息来源,所以我只是卡住了。

2 个答案:

答案 0 :(得分:2)

同意@ john-saunders。 http://msdn.microsoft.com/en-us/library/8728chd5%28v=vs.100%29.aspx是SOAP标头的一个很好的例子。请注意,它们是在SOAP XML有效内容中序列化的:

<soap:Header>
    <UserAuthenticationHeader>
        <user>uservalue</user>
        <ticket>tickevalue</ticket>
    </UserAuthenticationHeader>
</soap:Header>

有些工具可以使用WCF.Message向SOAP消息添加元素,或者如果您正在使用服务代理。 HttpWebRequest对SOAP消息内容一无所知,因此您始终可以将XML直接注入请求中。

答案 1 :(得分:1)

SOAP标头不驻留在HTTP标头中。它们驻留在SOAP消息本身中。