Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VersionOne:query.v1c#OAuth2获得401个未经授权的错误,但是rest-1.oauth.v1/Data/可以工作_C#_Api_Oauth 2.0_Versionone - Fatal编程技术网

VersionOne:query.v1c#OAuth2获得401个未经授权的错误,但是rest-1.oauth.v1/Data/可以工作

VersionOne:query.v1c#OAuth2获得401个未经授权的错误,但是rest-1.oauth.v1/Data/可以工作,c#,api,oauth-2.0,versionone,C#,Api,Oauth 2.0,Versionone,我可以使用OAuth2进行查询,如下所示: /rest-1.oauth.v1/Data/Story?sel=Name,Number&Accept=text/json 但是,我无法使OAuth2和新的query1.v1与Sumnmer2013版本兼容。我正在获得(401)未经授权的,并且不支持使用两个不同的URL使用指定的方法 下面是包含工作/rest-1.oauth.v1和非工作query1.v1以及非工作query.legacy.v1的代码。滚动至代码底部,查看程序主界面(代码起点)

我可以使用OAuth2进行查询,如下所示:

/rest-1.oauth.v1/Data/Story?sel=Name,Number&Accept=text/json
但是,我无法使OAuth2和新的query1.v1与Sumnmer2013版本兼容。我正在获得(401)未经授权的,并且不支持使用两个不同的URL使用指定的方法

下面是包含工作/rest-1.oauth.v1和非工作query1.v1以及非工作query.legacy.v1的代码。滚动至代码底部,查看程序主界面(代码起点) 请告诉我这里缺少什么

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;  
using System.Text;
using System.Threading.Tasks;
using OAuth2Client;

namespace ExampleMemberListCSharp
{
    class Defaults
    {
        public static string Scope = "apiv1";
        //public static string EndpointUrl = "http://localhost/VersionOne.Web";
        public static string EndpointUrl = "https://versionone-test.web.acme.com/summer13_demo";
        public static string ApiQueryWorks = "/rest-1.oauth.v1/Data/Member?Accept=text/json";
        public static string ApiQuery = "/rest-1.oauth.v1/Data/Story?sel=Name,Number&Accept=text/json";
    }


    static class WebClientExtensions
    {
        public static string DownloadStringOAuth2(this WebClient client, IStorage storage, string scope, string path)
        {
            var creds = storage.GetCredentials();
            client.AddBearer(creds);
            try
            {
                return client.DownloadString(path);
            }
            catch (WebException ex)
            {
                if (ex.Status == WebExceptionStatus.ProtocolError)
                {
                    if (((HttpWebResponse)ex.Response).StatusCode != HttpStatusCode.Unauthorized)
                        throw;
                    var secrets = storage.GetSecrets();
                    var authclient = new AuthClient(secrets, scope);
                    var newcreds = authclient.refreshAuthCode(creds);
                    var storedcreds = storage.StoreCredentials(newcreds);
                    client.AddBearer(storedcreds);
                    return client.DownloadString(path);
                }
                throw;
            }
        }
        public static string UploadStringOAuth2(this WebClient client, IStorage storage
            , string scope, string path, string pinMethod, string pinQueryBody)
        {
            var creds = storage.GetCredentials();
            client.AddBearer(creds);
            client.UseDefaultCredentials = true;
            try
            {
                return client.UploadString(path, pinMethod, pinQueryBody);
            }
            catch (WebException ex)
            {
                if (ex.Status == WebExceptionStatus.ProtocolError)
                {
                    if (((HttpWebResponse)ex.Response).StatusCode != HttpStatusCode.Unauthorized)
                        throw;
                    var secrets = storage.GetSecrets();
                    var authclient = new AuthClient(secrets, scope);
                    var newcreds = authclient.refreshAuthCode(creds);
                    var storedcreds = storage.StoreCredentials(newcreds);
                    client.AddBearer(storedcreds);
                    client.UseDefaultCredentials = true;
                    return client.UploadString(path, pinMethod, pinQueryBody);
                }
                throw;
            }
        }
    }


    class AsyncProgram
    {
        private static async Task<string> DoRequestAsync(string path)
        {
            var httpclient = HttpClientFactory.WithOAuth2("apiv1");

            var response = await httpclient.GetAsync(Defaults.EndpointUrl + Defaults.ApiQuery);
            var body = await response.Content.ReadAsStringAsync();
            return body;
        }

        public static int MainAsync(string[] args)
        {
            var t = DoRequestAsync(Defaults.EndpointUrl + Defaults.ApiQuery);
            Task.WaitAll(t);
            Console.WriteLine(t.Result);
            return 0;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            IStorage storage = Storage.JsonFileStorage.Default;
            using (var webclient = new WebClient())
            {
                // this works:
                var body = webclient.DownloadStringOAuth2(storage, "apiv1", Defaults.EndpointUrl + Defaults.ApiQuery);
                Console.WriteLine(body);
            }
            IStorage storage2 = Storage.JsonFileStorage.Default;

            using (var webclient2 = new WebClient())
            {
                // This does NOT work.  It throws an exception of  (401) Unauthorized:
                 var body2 = webclient2.UploadStringOAuth2(storage2, "apiv1", Defaults.EndpointUrl + "/query.v1", "SEARCH", QueryBody);
                // This does NOT work. It throws an exception of The remote server returned an error: (403): Forbidden."
                var body3 = webclient2.UploadStringOAuth2(storage2, "apiv1", Defaults.EndpointUrl + "/query.legacy.v1", "SEARCH", QueryBody);

                // These do NOT work.  Specified method is not supported:
                var body4 = webclient2.UploadStringOAuth2(storage2, "apiv1", Defaults.EndpointUrl + "/oauth.v1/query.legacy.v1", "SEARCH", QueryBody);
                var body5 = webclient2.UploadStringOAuth2(storage2, "apiv1", Defaults.EndpointUrl + "/oauth.v1/query.legacy.v1", "SEARCH", QueryBody);


            }
            Console.ReadLine();
            AsyncProgram.MainAsync(args);
        }

        public const string QueryBody = @"

from: Story
select:
- Name
";
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
Net系统;
使用System.Net.Http;
使用系统文本;
使用System.Threading.Tasks;
使用OAuth2Client;
命名空间示例MemberListCSharp
{
类默认值
{
公共静态字符串Scope=“apiv1”;
//公共静态字符串EndpointUrl=”http://localhost/VersionOne.Web";
公共静态字符串EndpointUrl=”https://versionone-test.web.acme.com/summer13_demo";
公共静态字符串ApiQueryWorks=“/rest-1.oauth.v1/Data/Member?Accept=text/json”;
公共静态字符串ApiQuery=“/rest-1.oauth.v1/Data/Story?sel=Name,Number&Accept=text/json”;
}
静态类WebClientTextensions
{
公共静态字符串下载StringOAuth2(此WebClient客户端、IStorage存储、字符串范围、字符串路径)
{
var creds=storage.GetCredentials();
客户地址持有人(creds);
尝试
{
返回client.DownloadString(路径);
}
捕获(WebException ex)
{
if(ex.Status==WebExceptionStatus.ProtocolError)
{
if(((HttpWebResponse)ex.Response).StatusCode!=HttpStatusCode.Unauthorized)
投掷;
var secrets=storage.GetSecrets();
var authclient=新的authclient(机密、范围);
var newcreds=authclient.refreshAuthCode(creds);
var storedcreds=storage.StoreCredentials(newcreds);
客户地址持有人(存储红色);
返回client.DownloadString(路径);
}
投掷;
}
}
公共静态字符串上载StringOAuth2(此WebClient客户端,IStorage存储
,字符串范围,字符串路径,字符串pinMethod,字符串pinQueryBody)
{
var creds=storage.GetCredentials();
客户地址持有人(creds);
client.UseDefaultCredentials=true;
尝试
{
返回client.UploadString(路径、pinMethod、pinQueryBody);
}
捕获(WebException ex)
{
if(ex.Status==WebExceptionStatus.ProtocolError)
{
if(((HttpWebResponse)ex.Response).StatusCode!=HttpStatusCode.Unauthorized)
投掷;
var secrets=storage.GetSecrets();
var authclient=新的authclient(机密、范围);
var newcreds=authclient.refreshAuthCode(creds);
var storedcreds=storage.StoreCredentials(newcreds);
客户地址持有人(存储红色);
client.UseDefaultCredentials=true;
返回client.UploadString(路径、pinMethod、pinQueryBody);
}
投掷;
}
}
}
类异步程序
{
专用静态异步任务DoRequestAsync(字符串路径)
{
var httpclient=HttpClientFactory.WithOAuth2(“apiv1”);
var response=wait-httpclient.GetAsync(Defaults.EndpointUrl+Defaults.ApiQuery);
var body=await response.Content.ReadAsStringAsync();
返回体;
}
公共静态int mainsync(字符串[]args)
{
var t=DoRequestAsync(Defaults.EndpointUrl+Defaults.ApiQuery);
Task.WaitAll(t);
控制台写入线(t.Result);
返回0;
}
}
班级计划
{
静态void Main(字符串[]参数)
{
IStorage storage=storage.JsonFileStorage.Default;
使用(var webclient=new webclient())
{
//这项工作:
var body=webclient.DownloadStringOAuth2(存储,“apiv1”,Defaults.EndpointUrl+Defaults.ApiQuery);
控制台。写入线(主体);
}
IStorage storage2=Storage.JsonFileStorage.Default;
使用(var webclient2=new WebClient())
{
//这不起作用。它引发(401)未经授权的异常:
var body2=webclient2.UploadStringOAuth2(storage2,“apiv1”,Defaults.EndpointUrl+“/query.v1”,“SEARCH”,QueryBody);
//这不起作用。它引发远程服务器的异常并返回错误:(403):禁止。“
var body3=webclient2.UploadStringOAuth2(storage2,“apiv1”,Defaults.EndpointUrl+“/query.legacy.v1”,“SEARCH”,QueryBody);
//这些方法无效。不支持指定的方法:
var body4=webclient2.UploadStringOAuth2(storage2,“apiv1”,Defaults.EndpointUrl+“/oauth.v1/query.legacy.v1”,“SEARCH”,QueryBody);
var body5=webclient2.UploadStringOAuth2(storage2,“apiv1”,Defaults.EndpointUrl+“/oauth.v1/query.legacy.v1”,“SEARCH”,QueryBody);
}
Console.ReadLine();
AsyncProgram.mainSync(args);
}
公共常量字符串QueryBody=@”
来源:故事
选择:
-名字
";
}
}

此时,
query.v1
端点要求授予
query-api-1.0
范围

你必须加上