-1

我想用他们要求的一些参数向 API 发送一个发布请求......我最终只是创建了一个字符串,它很难看,但我不知道如何让它以不同的方式工作。然后我发现这个类有很多变化WebRequest,但不幸的是我无法让它工作。

主要问题可能是因为我并不真正理解这一切是如何组合在一起的,但基本上,我一直遵循的示例使用WebRequest方法GetResponse......即使在 MSDN 上它也有这个,所以我想知道为什么当我尝试在我的代码,我没有得到那个选择?也一样GetRequestStream

在此处输入图像描述

如何在 WebRequest 中添加参数?

        *****DBContext()
        {
            data = "grant_type=" + GRANTTYPE + "&username=" + username + "&password=" + password + "&client_id=" + CLIENTID + "&redirect_uri=" + REDIRECTURI + "&client_secret=" + CLIENTSECRET;
        }

        public bool Authenticate()
        {   
            byte[] dataStream = Encoding.UTF8.GetBytes(data);
            WebRequest webRequest = WebRequest.Create(urlPath);
            webRequest.Method = "POST";
            webRequest.ContentType = "application/json";
            webRequest.ContentLength = dataStream.Length;  
            Stream newStream = webRequest.GetRequestStream();
            // Send the data.
            newStream.Write(dataStream, 0, dataStream.Length);
            newStream.Close();
            WebResponse webResponse = webRequest.GetResponse();

            return true;
        }

我还有一个问题,当我最终让这些东西工作时,我应该在回调 uri 中放入什么。如果是电话,它是否在本地主机上运行?

4

1 回答 1

1

Windows Phone 的 .NET 编译包含一个WebRequest类的实现,它没有用于获取请求流和响应的同步方法,因为这些方法会阻塞 UI 线程上的执行,直到操作完成。您可以将现有的 Begin/End 方法直接与回调委托一起使用,或者您可以将这些调用包装在异步扩展中,这将为您提供您习惯的那种可读性和功能(或多或少)。我首选的方法是定义扩展,因此我将演示此方法,但它与回调模式相比没有性能优势。它确实具有在您需要使用WebRequest.

异步/等待模式

为 WebRequest 类定义自定义扩展:

public static class Extensions
{
    public static System.Threading.Tasks.Task<System.IO.Stream> GetRequestStreamAsync(this System.Net.WebRequest wr)
    {
        if (wr.ContentLength < 0)
        {
            throw new InvalidOperationException("The ContentLength property of the WebRequest must first be set to the length of the content to be written to the stream.");
        }

        return Task<System.IO.Stream>.Factory.FromAsync(wr.BeginGetRequestStream, wr.EndGetRequestStream, null);
    }

    public static System.Threading.Tasks.Task<System.Net.WebResponse> GetResponseAsync(this System.Net.WebRequest wr)
    {
        return Task<System.Net.WebResponse>.Factory.FromAsync(wr.BeginGetResponse, wr.EndGetResponse, null);
    }
}

使用新的扩展(确保导入定义静态扩展类的命名空间):

public async System.Threading.Tasks.Task<bool> AuthenticateAsync()
{
    byte[] dataStream = System.Text.Encoding.UTF8.GetBytes("...");
    System.Net.WebRequest webRequest = System.Net.WebRequest.Create("...");
    webRequest.Method = "POST";
    webRequest.ContentType = "application/json";
    webRequest.ContentLength = dataStream.Length;
    Stream newStream = await webRequest.GetRequestStreamAsync();
    // Send the data.
    newStream.Write(dataStream, 0, dataStream.Length);
    newStream.Close();
    var webResponse = await webRequest.GetResponseAsync();

    return true;
}

关于你的最后一点,目前我没有看到足够的信息来理解回调 URI 是什么、它的定义位置以及它如何影响你正在做的事情。

于 2013-09-16T22:10:15.453 回答