【问题标题】:HttpWebRequest Vs HttpClientHttpWebRequest 与 HttpClient
【发布时间】:2011-05-10 15:33:56
【问题描述】:

我有一大段代码可以使用 HttpWebRequestHttpWebResponse 但我想将其转换为使用 HttpClient 和 HttpResponseMessage。

这是有效的代码块......

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(serviceReq);

request.Method = "POST";
request.ContentType = "text/xml";
string xml = @"<?xml version=""1.0""?><root><login><user>flibble</user>" + 
    @"<pwd></pwd></login></root>";
request.ContentLength = xml.Length;
using (StreamWriter dataStream = new StreamWriter(request.GetRequestStream()))
{
    dataStream.Write(xml);
    dataStream.Close();
}

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

这是我想用它替换它的代码,如果我能让它工作的话。

/// <summary>
/// Validate the user credentials held as member variables
/// </summary>
/// <returns>True if the user credentials are valid, else false</returns>
public bool ValidateUser()
{
    bool valid = false;

    try
    {
        // Create the XML to be passed as the request
        XElement root = BuildRequestXML("LOGON");

        // Add the action to the service address
        Uri serviceReq = new Uri(m_ServiceAddress + "?obj=LOGON");


        // Create the client for the request to be sent from
        using (HttpClient client = new HttpClient())
        {
            // Initalise a response object
            HttpResponseMessage response = null;

            // Create a content object for the request
            HttpContent content = HttpContentExtensions.
                CreateDataContract<XElement>(root);

            // Make the request and retrieve the response
            response = client.Post(serviceReq, content);

            // Throw an exception if the response is not a 200 level response
            response.EnsureStatusIsSuccessful();

            // Retrieve the content of the response for processing
            response.Content.LoadIntoBuffer();

            // TODO: parse the response string for the required data
            XElement retElement = response.Content.ReadAsXElement();
        }
    }
    catch (Exception ex)
    {
        Log.WriteLine(Category.Serious, 
            "Unable to validate the Credentials", ex);
        valid = false;
        m_uid = string.Empty;
    }

    return valid;
}

我认为问题在于创建内容对象并且未正确附加 XML(可能)。

【问题讨论】:

  • 究竟是什么不起作用?它不会编译吗?或者你得到运行时错误?哪些错误?
  • 请求已发送,但处理入站请求的服务认为没有数据,因此返回“未授权访问”,这是该服务的默认响应。
  • 使用 Fiddler 并检查通过网络发送的内容...
  • @fretje 感谢您指导使用 Fiddler。经过很多困难,我现在设法让提琴手工作并捕获每种方法的请求/响应。有2个不同。工作代码在原始数据中有 并且内容类型是 text/xml。非工作代码不包括 并且内容类型设置为 application/xml。我的下一步是研究如何更改内容类型。

标签: c# wcf httpwebrequest httpclient


【解决方案1】:

HttpClient.Post 方法有一个带有contentType 参数的重载,试试这个:

// Make the request and retrieve the response
response = client.Post(serviceReq, "text/xml", content);

【讨论】:

  • 谢谢。正如你在下面看到的,我也有同样的想法。我遇到的问题似乎与创建内容对象的方式有关,而不是与使用的 post 方法有关。
【解决方案2】:

我很想知道一种方法不起作用而另一种方法起作用的原因,但我只是没有时间进行更多挖掘。 {:o(

不管怎样,这就是我找到的。

使用以下创建请求的内容时发生故障

HttpContent content = HttpContentExtensions.Create(root, Encoding.UTF8, "text/xml");

但是当你创建这样的内容时它可以正常工作......

HttpContent content = HttpContent.Create(root.ToString(), Encoding.UTF8, "text/xml");

最终的工作函数是这样的:

/// <summary>
/// Validate the user credentials held as member variables
/// </summary>
/// <returns>True if the user credentials are valid, else false</returns>
public bool ValidateUser()
{
    bool valid = false;

    try
    {
        // Create the XML to be passed as the request
        XElement root = BuildRequestXML("LOGON");

        // Add the action to the service address
        Uri serviceReq = new Uri(m_ServiceAddress + "?obj=LOGON");

        // Create the client for the request to be sent from
        using (HttpClient client = new HttpClient())
        {
            // Initalise a response object
            HttpResponseMessage response = null;

            #if DEBUG
            // Force the request to use fiddler
            client.TransportSettings.Proxy = new WebProxy("127.0.0.1", 8888);
            #endif

            // Create a content object for the request
            HttpContent content = HttpContent.Create(root.ToString(), Encoding.UTF8, "text/xml");

            // Make the request and retrieve the response
            response = client.Post(serviceReq, content);

            // Throw an exception if the response is not a 200 level response
            response.EnsureStatusIsSuccessful();

            // Retrieve the content of the response for processing
            response.Content.LoadIntoBuffer();

            // TODO: parse the response string for the required data
            XElement retElement = response.Content.ReadAsXElement();
        }
    }
    catch (Exception ex)
    {
        Log.WriteLine(Category.Serious, "Unable to validate the user credentials", ex);
        valid = false;
        m_uid = string.Empty;
    }

    return valid;
}

谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多