Json HttpWebRequest无法从MVC3操作获取响应
我正在Windows Phone上运行以下代码:Json HttpWebRequest无法从MVC3操作获取响应,json,asp.net-mvc-3,post,httpwebrequest,fiddler,Json,Asp.net Mvc 3,Post,Httpwebrequest,Fiddler,我正在Windows Phone上运行以下代码: string baseAddress = tcAddress + "/Api/Audio/RegisterAudioThoughtUpload/"; HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(baseAddress); request.Method = "POST"; request.ContentT
string baseAddress = tcAddress + "/Api/Audio/RegisterAudioThoughtUpload/";
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(baseAddress);
request.Method = "POST";
request.ContentType = "application/json; charset=utf-8";
int total = 1633;
using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
string json = "{ \"AnonymousUserId\":\"" + Guid.NewGuid().ToString() + "\", \"TotalSize\":\"" + total.ToString() + "\" }";
streamWriter.Write(json);
streamWriter.Close();
}
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
int statusCode = (int)response.StatusCode; \\At this point response is null
StreamReader reader = new StreamReader(response.GetResponseStream());
string results = reader.ReadToEnd();
response.Close();
}
基本上,我正在尝试向mvc3操作发送一个json压缩guid和一个int
在服务器端,处理操作是:
[HttpPost]
public JsonResult RegisterAudioThoughtUpload(string AnonymousUserId, int TotalSize)
{
var aUId = Guid.Parse(AnonymousUserId);
return new JsonResult {Data = Guid.NewGuid()};
}
记录通信的fiddler2显示服务器正在向客户端提供预期响应:
但是在客户机上,对GetResponse()
的调用只是超时,实际上从未得到响应
由于它是Windows Phone,因此GetResponse()的实现方式如下:
private const int DefaultRequestTimeout = 15000;
public static HttpWebResponse GetResponse(this HttpWebRequest request)
{
var dataReady = new AutoResetEvent(false);
HttpWebResponse response = null;
var callback = new AsyncCallback(delegate(IAsyncResult asynchronousResult)
{
response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
dataReady.Set();
});
request.BeginGetResponse(callback, request);
if (dataReady.WaitOne(DefaultRequestTimeout))
{
return response;
}
return null;
}
为什么我没有得到一个
HttpWebResponse
,即使我通过代理看到它正在被发送?由于这是一个WP应用程序,我建议您避免阻塞主UI线程。我还建议您使用JSON序列化程序,而不是手动构建JSON字符串。让我们从定义我们的模型开始:
[DataContract]
public class Request
{
[DataMember]
public string AnonymousUserId { get; set; }
[DataMember]
public int TotalSize { get; set; }
}
然后:
var dataToSend = new Request
{
AnonymousUserId = Guid.NewGuid().ToString(),
TotalSize = 123
};
var serializer = new DataContractJsonSerializer(typeof(Request));
var request = string.Empty;
using (var stream = new MemoryStream())
{
serializer.WriteObject(stream, dataToSend);
request = Encoding.Default.GetString(stream.ToArray());
}
var client = new WebClient();
client.Headers[HttpRequestHeader.ContentType] = "application/json";
client.UploadStringCompleted += (sender, e) =>
{
// make sure there's no error before trying to access the result
if (e.Error == null)
{
string result = e.Result;
// TODO: do something with the returned result here
}
else
{
// some error occurred => notify the UI
}
};
client.UploadStringAsync(new Uri(tcAddress + "/Api/Audio/RegisterAudioThoughtUpload), request);
我在服务器显示的fiddler响应中还看到另一个问题,即内容类型
标题设置为application/json
,但内容不是有效的json:
"03cc77ed-e92b-48d9-b471-ba55a6065e2f"
而不是:
{"Data":"03cc77ed-e92b-48d9-b471-ba55a6065e2f"}
就超时错误而言,可能手机没有收到响应。检查您的网络。由于这是一个WP应用程序,我建议您避免阻塞主UI线程。我还建议您使用JSON序列化程序,而不是手动构建JSON字符串。让我们从定义我们的模型开始:
[DataContract]
public class Request
{
[DataMember]
public string AnonymousUserId { get; set; }
[DataMember]
public int TotalSize { get; set; }
}
然后:
var dataToSend = new Request
{
AnonymousUserId = Guid.NewGuid().ToString(),
TotalSize = 123
};
var serializer = new DataContractJsonSerializer(typeof(Request));
var request = string.Empty;
using (var stream = new MemoryStream())
{
serializer.WriteObject(stream, dataToSend);
request = Encoding.Default.GetString(stream.ToArray());
}
var client = new WebClient();
client.Headers[HttpRequestHeader.ContentType] = "application/json";
client.UploadStringCompleted += (sender, e) =>
{
// make sure there's no error before trying to access the result
if (e.Error == null)
{
string result = e.Result;
// TODO: do something with the returned result here
}
else
{
// some error occurred => notify the UI
}
};
client.UploadStringAsync(new Uri(tcAddress + "/Api/Audio/RegisterAudioThoughtUpload), request);
我在服务器显示的fiddler响应中还看到另一个问题,即内容类型
标题设置为application/json
,但内容不是有效的json:
"03cc77ed-e92b-48d9-b471-ba55a6065e2f"
而不是:
{"Data":"03cc77ed-e92b-48d9-b471-ba55a6065e2f"}
就超时错误而言,可能手机没有收到响应。检查您的网络。应该
返回响应
是返回回调。响应
?应该返回响应
是返回回调。响应
?数据格式不是错误的原因。我处理异步BeginGetResponse的方式是。你的方法也最有可能奏效。谢谢数据格式不是错误的原因。我处理异步BeginGetResponse的方式是。你的方法也最有可能奏效。谢谢