【问题标题】:Trouble with submitting XML to Rest Service将 XML 提交到 Rest Service 时遇到问题
【发布时间】:2012-02-01 04:34:08
【问题描述】:

我正在使用一个使用基本身份验证并返回一个 XML 字符串的 REST Web 服务。这是我用来获取数据并将其作为 XDocument 返回的方法:

        var req = (HttpWebRequest)WebRequest.Create(uri);
        String readToEnd;
        const string postData = "";
        var encoding = new ASCIIEncoding();
        byte[] byte1 = encoding.GetBytes(postData);

        req.Method = "POST";
        req.Timeout = 10000;
        req.ContentType = "text/XML";
        req.ContentLength = byte1.Length;

        string authInfo = userName + ":" + password;

        authInfo = Convert.ToBase64String(Encoding.UTF8.GetBytes(authInfo));
        req.Headers["Authorization"] = "Basic " + authInfo;

        var newStream = req.GetRequestStream();
        newStream.Write(byte1, 0, byte1.Length);
        newStream.Close();

        try
        {
            var resp = req.GetResponse();
            var answer = resp.GetResponseStream();
            var _answer = new StreamReader(answer);
            readToEnd = _answer.ReadToEnd();
            answer.Close();
        }
        catch (Exception ex)
        {
            readToEnd = null;
        }

        return readToEnd != null ? XDocument.Parse(readToEnd) : null;

现在稍后,我已经操作了那个 xml,我准备将它发布回另一个 uri。我认为这将是相同的代码,除了可能将我的新 XML 字符串放入变量“postData”中?

这是将 xml 字符串发布到 Web 服务的正确方法吗?当使用基本授权时,我已经看过但似乎无法对此有所了解。

【问题讨论】:

  • 请参阅有关签名问题的常见问题解答。
  • 您未能说明您遇到的实际问题。请详细说明。
  • 好的,希望我解决了你的两个问题。
  • 您是否有理由担心 REST 管道自己而不是使用像 RestSharp 这样可以为您解决问题的库?
  • 好吧,我不知道 RestSharp 存在。我会检查一下。但我想知道如何做管道,以防我的公司不让我使用第 3 方 dll。

标签: c# xml web-services rest


【解决方案1】:

我执行以下操作。关键是您必须在发布之前将数据写入请求流。希望对您有所帮助。

 var request = CreateBaseRequest(body);
        HttpWebResponse WebResp = (HttpWebResponse)request.GetResponse();
        Stream Answer = WebResp.GetResponseStream();
        StreamReader response = new StreamReader(Answer);
        var r = response.ReadToEnd();

 static HttpWebRequest CreateBaseRequest(string postData)
    {

        var req = (HttpWebRequest)HttpWebRequest.Create(@"https://xyz.com/");

        req.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
        req.Method = "POST";
        req.KeepAlive = true;

        byte[] buffer = Encoding.ASCII.GetBytes(postData);

        req.ContentLength = buffer.Length;
        Stream PostData = req.GetRequestStream();
        PostData.Write(buffer, 0, buffer.Length);
        PostData.Close();

        return req;

    }

【讨论】:

  • 是的,不幸的是,我没有运气。我将在我的 xml 位于 body 变量中运行此代码,而 var r 只返回我“”。我无法添加服务引用,因为该服务接受请求标头中的用户名/密码。所以我不确定服务器端发生了什么,因为我没有写那部分。但除此之外,您的代码看起来可以完成这项工作。
  • 我假设您将 ContentType 更改为“text/XML” - 我的示例是 json。但这可能不是问题。你期望 r 包含什么?这是对您帖子的回复,所以也许帖子正在运行但没有返回任何内容?我可以建议的另一件事是在提琴手中监控这一点。您的第一步是检查您的请求以确保它已形成,然后检查响应以查看是否有任何内容,并检查 http 状态代码。 fiddler2.com/fiddler2
猜你喜欢
  • 2016-03-19
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 2014-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多