通过HttpWebRequest

时间:2017-09-14 18:57:35

标签: c# web-services asp.net-web-api2 httpwebrequest

我有一个.Net服务,它将来自一个系统的更改打包并将它们发送到一个旧的Web服务,该服务接受并将更改处理到另一个系统。

.Net服务使用此代码发送请求:

    private HttpWebRequest BuildPostRequest()
    {
        byte[] bytes = Encoding.ASCII.GetBytes("USERID=username&PASSWORD=pwd&SYSTEM=system&PERDATA=");
        byte[] filebytes = File.ReadAllBytes(WORKPATH + "uploadPackage.zip");
        byte[] encodedFileBytes = System.Web.HttpUtility.UrlEncodeToBytes(filebytes);

        var section = System.Configuration.ConfigurationManager.GetSection("securitySettings") as NameValueCollection;
        string username = section["Username"].ToString();
        string password = section["Password"].ToString();
        string authString = username + ":" + password;
        authString = Convert.ToBase64String(Encoding.Default.GetBytes(authString));

        HttpWebRequest req = HttpWebRequest.Create(TARGETURL) as HttpWebRequest;
        req.KeepAlive = true;
        req.Method = "POST";
        req.ContentType = "application/x-www-form-urlencoded";
        req.Headers["Authorization"] = "Basic " + authString;
        req.PreAuthenticate = true;
        req.Timeout = 350000;
        req.ReadWriteTimeout = 350000;

        using (Stream rqStream = req.GetRequestStream())
        {
            rqStream.Write(bytes, 0, bytes.Length);
            rqStream.Write(encodedFileBytes, 0, encodedFileBytes.Length); 
        }

        return req;
    }

此部分适用于旧的Web服务。旧的Web服务能够获取PERDATA表单数据并将其还原到文件系统上的zip文件,解压缩文件并使用zip文件中的文件来更新本地数据。

我们现在正尝试用.Net编写的新Web服务替换旧的Web服务。我有以下代码尝试执行旧的Web服务所做的事情 - 获取表单数据,将数据写为文件并解压缩文件;但是,写入的zip文件不正确,我的代码在尝试解压缩时会发生炸弹。

以下是我的尝试:

public class InputModel
 {
    public string userid { get; set; }
    public string password { get; set; }
    public string system { get; set; }
    public string perdata { get; set; }
}

    [HttpPost]
    public IHttpActionResult Changes([FromBody] InputModel model)
    {
            //Write PerData to File and Unzip
            var fileoutName = path + @"\perdata.zip";
            var data = System.Web.HttpUtility.UrlDecodeToBytes(model.perdata);
            File.WriteAllBytes(fileoutName, data);

            ZipFile.ExtractToDirectory(fileoutName, path);

            ...
        });
    }

我意识到通过发送多部分表单请求可以更好地处理这个问题;但我受限于确保系统此时继续使用旧服务 - 并且它无法处理多部分请求。

然而,似乎我正在做所有将文件作为“字符串”传递所需的东西 - 但正如我所说,它只是不起作用。

您可以看到原始文件和收到的文件(写入磁盘)不一样: Image of Original zip file prior to being sent

Image of file after uploaded and saved

0 个答案:

没有答案