【问题标题】:Httpclient Postasync not passing XML data to MVC Controller but works with API ControllerHttpclient Postasync 不将 XML 数据传递给 MVC 控制器,但可以与 API 控制器一起使用
【发布时间】:2016-04-05 06:22:55
【问题描述】:

我有两个网站 ABC 和 XYZ。我正在尝试将 xml 数据从 ABC 发送到 XYZ。

具体功能:使用 EmailID 登录后,我正在使用 ABC 应用程序。当我单击 ABC 应用程序中的按钮时,该站点应与凭据一起重定向到 XYZ 站点。我通过标头以 XML 格式将数据发送到 XYZ。

ABC 网站:

    public async Task<object> Login()
    {
        string url = "http://localhost:49669/**api**/Account/PostData";
        HttpClient httpClient = new HttpClient();
        httpClient.DefaultRequestHeaders.Add("Authorization", "Basic Auth");
        string xmlString = "";
        UserDetails userDetail = new UserDetails { UserID = 1, EmailID = "name@redblacktree.com" };
        XmlDocument xmlDoc = new XmlDocument();   //Represents an XML document, 
        //Initializes a new instance of the XmlDocument class.          
        XmlSerializer xmlSerializer = new XmlSerializer(userDetail.GetType());
        var emptyNs = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });
        XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
        namespaces.Add(string.Empty, string.Empty);
        // Creates a stream whose backing store is memory. 
        using (MemoryStream xmlStream = new MemoryStream())
        {
            xmlSerializer.Serialize(xmlStream, userDetail, emptyNs);
            xmlStream.Position = 0;
            //Loads the XML document from the specified string.
            xmlDoc.Load(xmlStream);
            xmlString = xmlDoc.InnerXml;
        }
        var stringContent = new StringContent(xmlString.ToString(), Encoding.UTF8, "application/xml");
        httpClient.DefaultRequestHeaders.Add("UserDetails", xmlString.ToString());
        var response = httpClient.PostAsync(url, stringContent).Result;
        var result = response.Content.ReadAsStringAsync().Result;
        if (response.StatusCode == HttpStatusCode.OK)
        {
            var messageContents = await response.Content.ReadAsStringAsync();
            return Content(messageContents);
        }
        return null;
    }

这里的 UserDetails 是一个模型类。

XYZ 站点

public class AccountController : ApiController
{
    [System.Web.Http.HttpPost]
    public HttpResponseMessage PostData(HttpRequestMessage request)
    {

        var someText = request.Content.ReadAsStringAsync().Result;
        var header1 = request.Headers.Authorization;
        var header2 = request.Headers.GetValues("UserDetails");
        return new HttpResponseMessage(); 
    }

如果我发布到 API 控制器,它可以工作。如果它是一个普通的 MVC 控制器,它是不工作的。谁能告诉我为什么。

我正在尝试发布到 MVC 控制器,因为我发现很难将 POST 数据从 API 控制器获取到 MVC 控制器。因此,如果我可以直接发布到 MVC 控制器,它会简化我的工作。有什么帮助吗?

【问题讨论】:

  • 究竟是什么不起作用?
  • 当前代码有效。但是,如果我尝试发布到普通控制器,即像 XYZ 站点中的“公共类 AccountController:控制器”,它不会被发布。 ABC 中的 POSTSYNC 代码正在点击 action 方法,但数据没有到来。
  • 当您发布到“普通”控制器时会发生什么?显示“普通”控制器的代码
  • 有没有类似 httpclient post async 的东西不能与 MVC 控制器一起使用?
  • 没有。它与 MVC 或 Web.API 无关。 httpclient post 将适用于处理 http post 请求的任何内容,无论它们是在何种技术或语言上实现的

标签: c# xml asp.net-mvc asp.net-web-api httpclient


【解决方案1】:

解决了!

只需提供作为 ActionResult 的返回类型即可解决我的问题。我不必要地复杂化了代码。

public class AccountController : Controller      
{    
[System.Web.Http.HttpPost]       
public ActionResult PostData()
    {
        var data = HttpContext.Request.Headers["UserDetails"];
        return null;
    }   
}  

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多