HttpWebRequest не может получить ответ от действия MVC3 - PullRequest
1 голос
/ 22 января 2012

Я использую следующий код на Windows Phone:

        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();
        }

В основном я пытаюсь отправить упакованные в json guid и int в действие mvc3.

На стороне сервера действие обработки:

    [HttpPost]
    public JsonResult RegisterAudioThoughtUpload(string AnonymousUserId, int TotalSize)
    {
        var aUId = Guid.Parse(AnonymousUserId);

        return new JsonResult {Data = Guid.NewGuid()};
    }

Fiddler2, который регистрирует сообщение, показывает, что сервер предоставляет клиенту ожидаемый ответ:

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, хотя через прокси я вижу, что он отправляется?

1 Ответ

1 голос
/ 22 января 2012

Поскольку это приложение WP, я бы рекомендовал вам не блокировать основной поток пользовательского интерфейса. Я бы также рекомендовал вам использовать сериализатор 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, который вы показали с сервера, состоит в том, что заголовок Content-Type был установлен на application/json, и все же содержимое недопустимо JSON:

"03cc77ed-e92b-48d9-b471-ba55a6065e2f"

вместо:

{"Data":"03cc77ed-e92b-48d9-b471-ba55a6065e2f"}

Что касается ошибки тайм-аута, возможно, ответ не доходит до телефона. Проверьте свою сеть.

...