从c#发送一个字符串到php页面&收到回应

时间:2014-06-29 16:41:45

标签: c# php string web-services wamp

[答案]
我的原始帖子的答案被标记(Kimmax的第一篇文章) 事实证明,我应该最初提到这是在Android模拟器中运行(现在)。我发现通过模拟器连接到本地主机的IP是“10.0.2.2”。拥有端口号似乎并不重要。尽可能运行与裸机相同的代码返回页面文本。这意味着它在Android中引发了这个问题。希望这篇文章能为其他人节省一些时间。

[原文]
我是网络/套接字编程的新手,所以我不知道任何特定的常见做法。 我正在尝试向php页面发送一个相当短的字符串(最多32个字符)(我控制)。那个php页面将根据需要处理该字符串并将响应字符串发送回发送者。这是客户端和服务器之间所需的连接(按时间)的范围。我在网上搜索一个简单的答案,但似乎找不到任何我希望有人在这里可以提供帮助。

例如:假设初始请求字符串是名称(“Bob”)。服务器上的php页面接收该页面,并通过处理数字输出正确的返回字符串/值(例如,年龄“31”)。然后,该字符串/值被发送到原始请求者并由其接收,以根据需要进行处理。

我只是寻找最简短和最基本的答案。现在服务器是一个wamp本地主机,我在一个子目录(localhost / subdir / test.php)中测试的php页面。

[编辑]
使用Kimmax示例后的代码示例:
C#

public String DownloadFrom(String url)
{
    string str = "";  // For debugging only
    try
    {
        using(WebClient client = new WebClient())
        {
            str = client.DownloadString(new Uri(url));
            return str; 
        }
        catch(WebException e) {
            Log.Error ("Error while receiving data from server:", e.Message);
            return null;
        }
    }
}

传递给此函数的值是“http://localhost/php/test.php?name=Bob

test.php的

<?php
include 'logging.php';

if(isset($_GET['name']) && !empty($_GET['name']))
{
    $data = $_GET['name'];
    logg("test.php: name received: " . $data);

    $download = "Test string.";

    logg("test.php: setting data for download: " . $download);

    print $download;
}
?>

logging.php文件提供了logg函数,它只是将给定的字符串附加到其他地方的文件中。 当您将该地址输入浏览器时,test.php页面将输出$download,但不会通过给定的C#代码返回任何内容。甚至日志文件也不会通过C#代码写入。经过一些调试后,我注意到WebException被抛出了。异常消息是“Error: ConnectFailure (Connection refused)”。

完整异常堆栈跟踪

e   {System.Net.WebException: Error: ConnectFailure (Connection refused) ---> System.Net.Sockets.SocketException: Connection refused
  at System.Net.Sockets.Socket.Connect (System.Net.EndPoint remoteEP) [0x00000] in <filename unknown>:0 
  at System.Net.WebConnection.Connect (System.Net.HttpWebRequest request) [0x00000] in <filename unknown>:0 
  --- End of inner exception stack trace ---
  at System.Net.HttpWebRequest.EndGetResponse (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0 
  at System.Net.HttpWebRequest.GetResponse () [0x00000] in <filename unknown>:0 
  at System.Net.WebClient.GetWebResponse (System.Net.WebRequest request) [0x00000] in <filename unknown>:0 
  at System.Net.WebClient.ReadAll (System.Net.WebRequest request, System.Object userToken) [0x00000] in <filename unknown>:0 
  at System.Net.WebClient.DownloadDataCore (System.Uri address, System.Object userToken) [0x00000] in <filename unknown>:0 }    System.Net.WebException

我能够在telnet localhost 80 GET期间返回文本,因此似乎连接应该可行。我在某个地方错过了一些权限吗?

[编辑]
完全禁用防火墙并在我的路由器上设置端口转发后没有任何改变 - 我现在不排除任何事情。我也尝试使用本地IP地址(127.0.0.1)而不是localhost。 来自 access.log 的代码段

...
192.168.1.1 - - [01/Jul/2014:11:48:18 -0500] "GET /HNAP1/ HTTP/1.1" 404 292
192.168.1.1 - - [01/Jul/2014:11:48:18 -0500] "POST /JNAP/ HTTP/1.1" 404 291
192.168.1.1 - - [01/Jul/2014:11:48:18 -0500] "GET / HTTP/1.1" 200 4821
127.0.0.1 - - [01/Jul/2014:11:50:06 -0500] "GET /php/test.php?s=Bob HTTP/1.1" 200 16
127.0.0.1 - - [01/Jul/2014:11:50:11 -0500] "GET /php/test.php?s=Foo HTTP/1.1" 200 16
127.0.0.1 - - [01/Jul/2014:11:50:15 -0500] "GET /php/test.php?s=Bar HTTP/1.1" 200 16

最后三行来自我输入浏览器(Chrome)的链接。我相信前三个来自C#代码 - 奇怪的是,我认为它们是在我停止调试之后编写的。

这些连接尝试的apache_error.log文件中似乎没有任何内容正在转储 必须有一些我忽略的细节...

1 个答案:

答案 0 :(得分:2)

如果您只是想从网站收到回复,我建议您使用WebClient类及其.DowloadString()方法。

示例

whatsmyname.php

<?php
    $name = $_GET['name'];
    echo "Your name is $name."
?>

whatsmyname.cs

private void btnSayMyName_Click(object sender, EventArgs e)
{
    string response = SendRequest("http://localhost/whatsmyname.php?name=" + txtMyName.Text);

    if(response != null)
    {
        MessageBox.Show(response, "Hey there!", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
}

private string SendRequest(string url)
{
    try
    {
        using (WebClient client = new WebClient())
        {
            return client.DownloadString(new Uri(url));
        }
    }
    catch(WebException ex)
    {
        MessageBox.Show("Error while receiving data from the server:\n" + ex.Message, "Something broke.. :(", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
        return null;
    }
}

请阅读this以了解正在发生的事情,这是非常基本的。