使用来自C#的POST通过https发布

Mar*_*ini 11 .net c# ssl post httpwebrequest

在用这个问题浪费了两天之后(并试图让它发挥作用),我决定退后一步并提出一个更基本的问题,因为显然有一些我不知道或者我做错了.

要求很简单,我需要在 C#上通过https发布HTTP帖子(传递几个值).

该网站(如果给出适当的值)将返回一些简单的html和响应代码.(我稍后会说明这些).

这真的简单的."webservice"有效.我有一个PHP示例,可以正常工作并成功连接到它.我也有一个Dephi"演示"应用程序(带有源代码)也可以使用.最后我有来自具有"服务"的公司的演示应用程序(二进制),当然也有效.

但我需要通过C#来做到这一点.这听起来如此简单,它无法正常工作.

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

每个方法都有效,除非 URI以"https"开头.

我得到一个webexception,说远程服务器返回404.我已经安装了Fiddler(由SO用户建议),并调查了一点流量.404是因为我传递了错误,因为正如我后面提到的,'服务'有效.我稍后会谈到提琴手的结果.

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

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

usuario = SomeUser是否&釜= SomePassword&nserie = 01234567890123456789&版本= 01010000&operacion = 220

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

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

01010000 100 BIEN
998
Run Code Online (Sandbox Code Playgroud)

这是另一个

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.
Run Code Online (Sandbox Code Playgroud)

第一个表示正常,第二个表示验证失败.

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

如何使用C#和"简单"HttpWebRequest对SSL进行POST,之后在字符串/数组中进行响应/无论处理什么?

相信我,当我说我一直在谷歌搜索和Stackoverflowing两天.我没有任何代理.连接通过我的路由器.标准端口.没有什么花哨.我的机器在VMWare虚拟机内部并且是Windows Vista,但鉴于示例应用程序(php,delphi,二进制)都没有问题,我看不出这是一个问题).

如果有人想看看它们,可以在这里找到不同的样本(没有二进制文件).

我很感激任何帮助.如果有人想尝试"真实"的用户名,我有一个演示用户,我可以通过你的用户/通行证进行测试.我只有一个演示用户(他们给我的那个),这就是为什么我不在这里粘贴它.我不想用测试来淹没用户;)

我尝试过(在样本中)使用UTF8和ASCII,但这并没有改变任何东西.

我100%肯定我有一些与SSL有关的事情,我没有这样做,因为我不知道它.

提前谢谢.

马丁.

Tom*_*röm 8

我更早地与完全相同的问题作斗争(尽管在紧凑的框架中).这是我的问题和我自己的答案: .NET Compact Framework中带有POST参数的异步WebRequest

我的版本是异步的,所以它比你想要的更复杂,但这个想法仍然存在.

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;

}
Run Code Online (Sandbox Code Playgroud)


Erv*_*ter 5

看看我对你的另一个问题的回答.我相信你的问题可能不是你的C#代码.Web服务URL确实返回了404我使用的其他几个工具,但是如果你从Web服务URL中删除了斜杠,它会返回你指示的响应,所以我建议你试试.

奇怪的是,如果不执行SSL,尾随URL是否存在似乎并不重要.我猜这个网络服务器有些奇怪.

  • 故事的寓意:总是反复检查“其他开发人员”告诉你的内容。(Web 服务器程序员坚持认为 URL 有斜线,我相信他)。:S (2认同)