我有一个我在Silverlight中创建的Web客户端。我试图通过GET和POST请求和JSON将它与我服务器上的Web服务进行通信。 GET请求工作正常,我能够在Silverlight端解析JSON。然而,POST请求似乎不起作用。服务器读取有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;
}
服务器上使用该服务的代码是PHP,基本上是: 的var_dump($ _ POST)
这应该输出进入post数组的任何内容。我用一个简单的PHP客户端测试它,它的工作原理。只是不能让它在Silverlight中工作。在Silverlight中,我只是不断得到一个空阵列。
答案 0 :(得分:1)
您应该将内容类型更改为 application / x-www-form-urlencoded ,而不是还不是已知类型的application / json。
答案 1 :(得分:0)
并不是说我认为任何人仍在关注他的旧问题,但我认为问题在于它实际上是到达服务器,而是服务器将结果路由回SL应用程序。这是我在SL5中使用WebClient.UploadStringAsync看到类似情况的行为。
我即将实施/测试我昨天遇到的一种技术,该技术使用来自SL的动态构建的“真实”页面帖子;我很快就会报告我的发现。
更新 - 此解决方案的工作原理: http://www.codeproject.com/Tips/392435/Using-HTTP-Form-POST-method-to-pass-parameters-fro
我刚刚在我的应用程序中测试了它(在MVC中的SL5)并且它工作得很好。确保检查HttpContext.Request.Form [“fieldname”]以获取所需的值。我使用这种技术提交JSON,并能够为用户返回生成的Word文档。
一旦我实现了这一点,我就可以摆脱之前尝试使用的不必要的WebClient。