【问题标题】:Why does web service refuse to read the SOAP headers I'm seding its way?为什么 Web 服务拒绝读取我正在使用的 SOAP 标头?
【发布时间】:2014-05-11 13:14:49
【问题描述】:

我继承了一个在我们公司已经使用了一段时间的代码,现在我不知道它到底有什么问题。废话不多说,直接进入正题。

它是如何工作的

我们的通信系统设置如下: JavaScript Web 服务代理 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 的不同方法,但基本上都是做同样的事情(不足为奇)。除此之外,我还没有找到任何关于这种特定交流的好消息来源,所以我被困住了。

【问题讨论】:

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


    【解决方案1】:

    同意@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 直接注入到请求中。

    【讨论】:

    • 是的,@john-saunders 的回复为我指明了正确的方向。看来我的同事实际上根本没有发送 SOAP 信封,这首先让我感到困惑——我现在正在尝试构建它并将其写入 HttpWebRequest。 (这尤其令人困惑,因为 Web 服务接受了正确的参数并返回了正确的值,然后再说一次 - 我将是第一个承认我远不是这个问题的专家。血腥的继承代码。)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-21
      • 2014-07-04
      • 2014-05-12
      相关资源
      最近更新 更多