c# - 通过 https 从 C# 使用 POST 发布

标签 c# .net ssl post httpwebrequest

this question 上浪费了两天时间(并试图让它发挥作用)之后,我决定退后一步,问一个更基本的问题,因为显然有些事情我不知道或者我做错了。

要求很简单,我需要通过 https 从 C# 生成一个 HTTP post(传递一些值)。

网站(如果给定适当的值)将返回一些简单的 html 和响应代码。 (我稍后会展示这些)。

真的就是简单。 “网络服务”有效。我有一个可以运行并成功连接到它的 php 示例。我还有一个 Dephi“演示”应用程序(带有源代码)也可以使用。最后,我从拥有“服务”的公司获得了演示应用程序(二进制),当然它也可以工作。

但我需要通过 C# 来完成。这听起来很简单,但行不通。

出于测试目的,我创建了一个简单的控制台应用程序和一个简单的连接方法。我已经尝试了 7 种不同的方法来创建 HTTP 请求,它们或多或少都是相同的东西,不同的实现(使用 WebClient、使用 HttpWebRequest 等)。

每种方法都有效,除非 URI 以“https”开头。

我收到一个 webexception,说远程服务器返回 404。我已经安装了 Fiddler(按照 SO 用户的建议),并调查了一些流量。 404 是因为我传递了错误的东西,因为正如我稍后提到的,“服务”有效。稍后我将讨论 fiddler 结果。

我必须发布数据的 URL 是:https://servicios.mensario.com/enviomasivo/apip/

这是 POST 数据:(值是假的)

usuario=SomeUser&clave=SomePassword&nserie=01234567890123456789&version=01010000&operacion=220

服务器可能会返回两行/三行的响应(抱歉是西类牙文,但该公司来自西类牙)。以下是可能的响应示例:

HTTP/1.1 200 OK
Content-Type: text/plain

01010000 100 BIEN
998

还有一个

HTTP/1.1 200 OK
Content-Type: text/plain

01010000 20 AUTENTIFICACION NEGATIVA
Ha habido un problema en la identificación ante el servidor. Corrija sus datos de autentificacion.

第一个表示OK,第二个表示Auth Failure。

如您所见,任务很简单,只是行不通。如果我使用 fiddler,我会看到连接中正在进行某种 SSL 操作,然后一切正常。然而,据我所知,.NET 为我们处理所有这些事情(是的,我添加了回调以始终验证无效证书)。我不明白我做错了什么。我可以发布/通过电子邮件发送代码,但我想知道的很简单:

如何使用 C# 和“简单的”HttpWebRequest 通过 SSL 进行 POST,然后在字符串/数组/任何内容中获得响应以进行处理?

请相信我,我已经用谷歌搜索和 Stackoverflowing 搜索了两天。我没有任何代理。连接通过我的路由器。标准端口。没有什么花哨。我的机器位于 VMWare 虚拟机中并且是 Windows Vista,但鉴于示例应用程序(php、delphi、二进制)都可以正常工作,我不认为这是一个问题。

如果有人想看一下不同的样本(没有二进制文件),可以在 here 上找到它们。

如果有任何帮助,我将不胜感激。如果有人想尝试使用“真实”用户名,我有一个演示用户,我可以将用户/密码传递给您以供测试。我只有 一个 演示用户(他们给我的那个),这就是为什么我不把它粘贴在这里的原因。我不想用测试淹没用户 ;)

我已经尝试(在示例中)使用 UTF8 和 ASCII,但这并没有改变任何东西。

我 100% 肯定我必须与 SSL 做一些事情,但我没有这样做是因为我不知道它。

在此提前致谢。

马丁。

最佳答案

我之前曾遇到过完全相同的问题(尽管是在紧凑的框架中)。这是我的问题和我自己的回答: Asynchronous WebRequest with POST-parameters in .NET Compact Framework

我的版本是异步的,所以它比您正在寻找的要复杂一些,但这个想法仍然存在。

private string sendRequest(string url, string method, string postdata) {
    WebRequest rqst = HttpWebRequest.Create(url);

    // only needed, if you use HTTP AUTH
    //CredentialCache creds = new CredentialCache();
    //creds.Add(new Uri(url), "Basic", new NetworkCredential(this.Uname, this.Pwd));
    //rqst.Credentials = creds;
    rqst.Method = method;
    if (!String.IsNullOrEmpty(postdata)) {
        //rqst.ContentType = "application/xml";
        rqst.ContentType = "application/x-www-form-urlencoded";

        byte[] byteData = UTF8Encoding.UTF8.GetBytes(postdata);
        rqst.ContentLength = byteData.Length;
        using (Stream postStream = rqst.GetRequestStream()) {
            postStream.Write(byteData, 0, byteData.Length);
            postStream.Close();
        }
    }
    ((HttpWebRequest)rqst).KeepAlive = false;
    StreamReader rsps = new StreamReader(rqst.GetResponse().GetResponseStream());
    string strRsps = rsps.ReadToEnd();
    return strRsps;

}

关于c# - 通过 https 从 C# 使用 POST 发布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/773638/

相关文章:

c# - NullReferenceException ldapConnection.Connect

c# - 如何从 Controller 方法访问 token 数据?

ssl - 使用 pygbag 打包 PyGame for web 导致 SSL 错误

c# - 使用 filterContext.Result 时如何重定向到 Action?

c# - 使用数据读取器使用数据库多列中的数据填充文本框

.net - Get-ChildItem 与直接使用具有 UNC 路径的 .NET Framework 的 [System.IO.Directory]::GetFiles() 方法

.net - app.config 中元素的顺序重要吗?

.net - 将项目从 .NET 3.5 移动到 .NET 4.0 : Suddenly Release Handle Failed

ssl - 代理可以更改SSL证书吗?

ssl - iOS 9 应用程序从 Amazon S3 下载 SSL 错误 : TLS 1. 2 支持