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


浪费了两天后 这个问题 (并努力使其发挥作用),我决定退后一步并提出一个更基本的问题,因为显然有一些我不知道或者我做错了。

要求很简单, 我需要在https上发一个HTTP帖子(传递几个值) 来自C#。

该网站(如果给出适当的值)将返回一些简单的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

这是另一个

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.

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

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

如何使用C#和一个“简单的”HttpWebRequest在SSL上进行POST,然后在字符串/数组中进行响应/无论处理什么?

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

可以使用不同的样本(无二进制) 这里 如果有人想看看他们。

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

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

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

谢谢 提前

马丁。


2359
2018-04-21 17:18


起源



答案:


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

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


5
2018-04-21 18:28



Erv,就是这样!非常感谢。 (并且由于样本的其他海报,我肯定会使用所有这些的混合。你是我的英雄,正如我在另一个问题中所述。:) - Martin Marconcini
道德故事:总是试图检查“其他开发者”告诉你的内容。 (Web服务器程序员坚持认为URL有斜杠,我相信他)。 :S - Martin Marconcini


答案:


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

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


5
2018-04-21 18:28



Erv,就是这样!非常感谢。 (并且由于样本的其他海报,我肯定会使用所有这些的混合。你是我的英雄,正如我在另一个问题中所述。:) - Martin Marconcini
道德故事:总是试图检查“其他开发者”告诉你的内容。 (Web服务器程序员坚持认为URL有斜杠,我相信他)。 :S - Martin Marconcini


我早些时候正在与完全相同的问题作斗争(尽管在紧凑的框架中)。这是我的问题和我自己的答案: .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;

}

8
2018-04-21 17:29



嗨Tommi,谢谢你的样品。不幸的是,它似乎也不适合我。您的代码中有两个拼写错误(您在创建StreamReader时使用'req'并且我认为它的rqst?然后我认为streamIn是rsps(接近结束)。尽管如此,我仍然在该行中获得404: StreamReader rsps = new StreamReader(req.GetResponse()。GetResponseStream());问题:如果我不想使用凭据,我可以跳过吗?我做了但是它没有用。这项服务不需要.user / pass - Martin Marconcini
Geez,抱歉打字错误。我会马上把它们解决在答案中。如果它是404,那么问题不在代码中,你只是发送了错误的网址。在发送请求的代码中加入一些断点,并检查您提供Uri构造函数的url是否有效。是的,当然你可以跳过证书 - 部分,我会评论出来! - Tommi Forsström
哦,而且,当你发送普通的POST参数时,我需要将内容类型更改为“application / x-www-form-urlencoded”。在我的情况下,我在post params字段中发送XML,并强制要求内容类型。 - Tommi Forsström
感谢Tommi,正如您所指出的那样,URL存在问题(具有结尾斜杠)。 :)感谢您的代码:)我一定会使用它。 - Martin Marconcini
我建议检查我的答案中提供的链接中的异步版本。当发送(可能是缓慢的)Web请求时,在检索数据时使主线程变得更好并且响应更好。 - Tommi Forsström


不知道你是否已经解决了这个问题,这是一年前的帖子。我是西班牙人,我也在使用mensario。

发送和http请求:(这是在ASP,但过程是相同的)

Function enviarMsg2
   Dim oHTTP,inicio
   Dim strParametros
   Dim devolver

   Set oHTTP= server.CreateObject("Msxml2.ServerXMLHTTP")
   strParametros = "usuario="&usuario&"&clave="&clave&"&nserie="&nserie&"&     version=01010000&operacion=300&sms=1%0934635035526%0920041231233000%09Clinica+Paz%09Clinica+Paz+le+desea+Feliz+Navidad%2E&sms=2%0934612345678%0920041231233001%09Clinica+Paz%09Clinica+Paz+le+desea+Feliz+Navidad%2E"
'response.Write strParametros
'response.End
'Abrimos la conexión con el método POST, ya que estamos enviando una petición.
oHTTP.open "POST", "https://servicios.mensario.com/enviomasivo/apip", False

'Agregamos encabezados HTTP requeridos...
oHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"

'Enviamos la petición
oHTTP.send strParametros
devolver = oHTTP.responsetext

'Comprobamos si fue correcto         
inicio = Instr(devolver, "100 BIEN")
'response.Write "--->"&inicio
'response.End    
if inicio <=0 then
  enviarSMS2 = "Ha ocurrido un error en el envío del SMS."
else
  enviarSMS2 = Mid(devolver,inicio+9,len(devolver))
end if

Set oHTTP = Nothing

我没有的唯一的东西是尝试用户/密码:)

Basicaly,当响应为“100 bien”时,函数返回,否则返回错误。希望它有帮助:)


0
2018-06-28 08:04



感谢Jorge的回应,我们已经解决了这个问题。问题是,menario url最后有一个“/”,这是不正确的。 - Martin Marconcini