C# Silverlight发布的JSON数据未到达服务器

C# Silverlight发布的JSON数据未到达服务器,c#,silverlight,json,post,C#,Silverlight,Json,Post,我在Silverlight中创建了一个web客户端。我试图让它通过get和POST请求以及JSON与服务器上的web服务进行通信。GET请求工作正常,我能够在Silverlight端解析JSON。然而,帖子请求似乎不起作用。服务器读取到有POST请求,但POST数组为空 我尝试了两段代码来发送POST请求,但都得到了相同的响应——一个空数组 我尝试的第一个Silverlight代码是: public MainPage() { InitializeComponent

我在Silverlight中创建了一个web客户端。我试图让它通过get和POST请求以及JSON与服务器上的web服务进行通信。GET请求工作正常,我能够在Silverlight端解析JSON。然而,帖子请求似乎不起作用。服务器读取到有POST请求,但POST数组为空

我尝试了两段代码来发送POST请求,但都得到了相同的响应——一个空数组

我尝试的第一个Silverlight代码是:

    public MainPage()
    {
        InitializeComponent();
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri("http://www.dipzo.com/game/services.php"));
        request.Method = "POST";
        request.ContentType = "application/json";
        request.BeginGetRequestStream(new AsyncCallback(OnGetRequestStreamCompleted), request);
    }

    private void OnGetRequestStreamCompleted(IAsyncResult ar)
    {
        HttpWebRequest request = (HttpWebRequest)ar.AsyncState;
        using (StreamWriter writer = new StreamWriter(request.EndGetRequestStream(ar)))
        {
            writer.Write("name=david");
        }
        request.BeginGetResponse(new AsyncCallback(OnGetResponseCompleted), request);
    }

    private void OnGetResponseCompleted(IAsyncResult ar)
    {
        //this.GetResponseCoimpleted.Visibility = Visibility.Visible;

        // Complete the Flickr request and marshal to the UI thread
        using (HttpWebResponse response = (HttpWebResponse)((HttpWebRequest)ar.AsyncState).EndGetResponse(ar))
        {
            using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            {
                string results = reader.ReadToEnd();
            }
        }
    }
    private void WebClient_Click(object sender, RoutedEventArgs e)
    {
        Test t1 = new Test() { Name = "Civics", Marks = 100 };
        DataContractJsonSerializer jsondata = new DataContractJsonSerializer(typeof(Test));
        MemoryStream mem = new MemoryStream();
        jsondata.WriteObject(mem, t1);
        string josnserdata = Encoding.UTF8.GetString(mem.ToArray(), 0, (int)mem.Length);
        WebClient cnt = new WebClient();
        cnt.UploadStringCompleted += new UploadStringCompletedEventHandler(cnt_UploadStringCompleted);
        cnt.Headers["Content-type"] = "application/json";
        cnt.Encoding = Encoding.UTF8;
        cnt.UploadStringAsync(new Uri("http://www.dipzo.com/game/services.php"), "POST", josnserdata);
    }

    void cnt_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
    {
        var x = e;
    }
我试过的第二件是:

    public MainPage()
    {
        InitializeComponent();
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri("http://www.dipzo.com/game/services.php"));
        request.Method = "POST";
        request.ContentType = "application/json";
        request.BeginGetRequestStream(new AsyncCallback(OnGetRequestStreamCompleted), request);
    }

    private void OnGetRequestStreamCompleted(IAsyncResult ar)
    {
        HttpWebRequest request = (HttpWebRequest)ar.AsyncState;
        using (StreamWriter writer = new StreamWriter(request.EndGetRequestStream(ar)))
        {
            writer.Write("name=david");
        }
        request.BeginGetResponse(new AsyncCallback(OnGetResponseCompleted), request);
    }

    private void OnGetResponseCompleted(IAsyncResult ar)
    {
        //this.GetResponseCoimpleted.Visibility = Visibility.Visible;

        // Complete the Flickr request and marshal to the UI thread
        using (HttpWebResponse response = (HttpWebResponse)((HttpWebRequest)ar.AsyncState).EndGetResponse(ar))
        {
            using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            {
                string results = reader.ReadToEnd();
            }
        }
    }
    private void WebClient_Click(object sender, RoutedEventArgs e)
    {
        Test t1 = new Test() { Name = "Civics", Marks = 100 };
        DataContractJsonSerializer jsondata = new DataContractJsonSerializer(typeof(Test));
        MemoryStream mem = new MemoryStream();
        jsondata.WriteObject(mem, t1);
        string josnserdata = Encoding.UTF8.GetString(mem.ToArray(), 0, (int)mem.Length);
        WebClient cnt = new WebClient();
        cnt.UploadStringCompleted += new UploadStringCompletedEventHandler(cnt_UploadStringCompleted);
        cnt.Headers["Content-type"] = "application/json";
        cnt.Encoding = Encoding.UTF8;
        cnt.UploadStringAsync(new Uri("http://www.dipzo.com/game/services.php"), "POST", josnserdata);
    }

    void cnt_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
    {
        var x = e;
    }
服务器上使用服务的代码是PHP,基本上是: 变量转储($\u POST)


这将输出进入post数组的任何内容。我已经用一个简单的PHP客户端测试了它,它可以正常工作。只是不能让它在silverlight下工作。在silverlight中,我一直得到一个空数组。

您应该将内容类型更改为application/x-www-form-urlencoded,而不是application/json,它还不是一个已知的类型。

我不认为有人还在关注他的老问题,但我敢打赌,问题在于它实际上正在到达服务器,但服务器将结果路由回SL应用程序。这就是我在SL5中看到的使用WebClient.UploadStringAsync的类似情况

我将要实现/测试我昨天遇到的一种技术,它使用动态构建的、来自SL的“真实”页面帖子;我将很快报告我的发现

更新--此解决方案可用于:

我刚刚在我的应用程序(MVC内部的SL5)中对其进行了测试,效果很好。确保检查HttpContext.Request.Form[“fieldname”]以获取所需的值。我使用这种技术提交JSON,并能够为用户返回生成的Word文档

一旦我实现了这一点,我就能够摆脱以前尝试使用的不必要的WebClient