推荐的POST和从Web服务接收的方式,全部来自MVC Controller

时间:2012-12-11 19:55:07

标签: c# xml asp.net-mvc

我正在尝试使用带有POST方法的表单向Web服务发送一些数据,并使用XML页面对其进行响应。我让POST部分使用一个简单的表单并在我的视图中提交。但是,我不知道如何处理来自这里的响应,所以我试图将它全部移动到控制器中(似乎它应该在那里)。因此理论是让用户单击一个按钮,将模型数据发送到控制器。在控制器中我试图组建一个webrequest,看起来像这样:

    [HttpPost]
    public ActionResult SubmitToCris(NewApplicantViewModel model)
    {
        string serviceURL = "https://www.blahblah.com/XMLServer/XMLServer.cgi";

        string postData = "MaxRecords=0&UserID=skapi&Password=sk12024&Version=2.0&RequestType=searchName&FirstName=Nathan"
                                    + "&LastName=Smith&DOB=1984/2/2";

        WebRequest request = WebRequest.Create(serviceURL);
        request.Method = "POST";

        byte[] byteArray = Encoding.UTF8.GetBytes(postData);
        request.ContentLength = byteArray.Length;
        Stream dataStream = request.GetRequestStream();
        dataStream.Write(byteArray, 0, byteArray.Length);
        dataStream.Close();

        WebResponse response = request.GetResponse();
        dataStream = response.GetResponseStream();

        StreamReader reader = new StreamReader(dataStream);

        return View();

    }

我似乎没有收到回复所以我挖了一个“流不支持搜索操作”。看起来这是由无法读取字节数组的长度引起的。我将通过循环来修复它。

所以我现在正在寻找的是,这甚至是正确的方法吗?我整个上午一直在研究这个问题并提出了多种方法,我选择了这个,因为它似乎是最直接的方法。

Anywho,如果我能得到MVC或ASP特定的例子或教程,关于这一切应该如何工作,那将是很好的。感谢。

------- EDIT -------------

更改了postData变量。

以下是我在发布数据后从其他公司Web服务器收到的回复:

<?xml version="1.0" encoding="UTF-8"?>
  <HistoryResponse>
  <ResponseType>resultsList</ResponseType>
  <Matches>0</Matches>
  <SessionID>75803234r23df3de</SessionID>
  <RecStart>0</RecStart>
  <ClientCode></ClientCode>
  <Results></Results>
</HistoryResponse>

1 个答案:

答案 0 :(得分:0)

我花了几天时间研究和询问如何从MVC控制器发布一些数据,然后获取XML响应。我很惊讶在网上找不到答案,我只能假设我的搜索参数有问题,因为它似乎不是那么深奥的东西。 Anywho,我以为我会发布我的工作代码,因为它对某人有用。免责声明 - 几个月前我刚刚开始编码,所以即使这样可行,我也不保证它是最好的方法。 : - )

    [HttpPost]
    public ActionResult SubmitToCris(NewApplicantViewModel model)
    {
        // Setup my variables
        string First = model.PersonModel.FirstName;
        string Last = model.PersonModel.LastName;
        string dob = model.PersonModel.DateofBirth.ToString("yyyy-MM-dd");

        string historyURL = "https://www.nunya.com/XMLServer/XMLServer.cgi";
        //Build my data to be sent in key/value pair string 
        string postData = "MaxRecords=0&UserID=skapi&Password=sk12024&Version=2.0&RequestType=searchName&FirstName="
                                    + First + "&LastName="
                                    + Last + "&DOB="
                                    + dob;

        //Create the web request, populate the header info
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(crisURL);
        request.Method = "POST";
        request.ContentLength = postData.Length;
        request.ContentType = "application/x-www-form-urlencoded";

        // Send it
        using (Stream writeStream = request.GetRequestStream())
        {
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);
            writeStream.Write(byteArray, 0, byteArray.Length);
            writeStream.Close();
        }

        // Receive the response and do stuff with it.
        string result = string.Empty;

        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        {
            using( Stream responseStream = response.GetResponseStream() )
            {
                using( StreamReader readStream = new StreamReader(responseStream, Encoding.UTF8))
                {
                    result = readStream.ReadToEnd();
                }

            }
        }

        XDocument resultLoad = XDocument.Parse(result);
        ViewBag.XmlResponse = resultLoad.ToString();

        return View();

    }

目前,我对回复做的并不多,而且只不过是一个字符串。我个人需要存储一些信息并格式化几个视图,具体取决于返回的数据。一旦我对它进行了排序,我会发布它,但我现在想把它拿出来。