gpt4 book ai didi

servicestack - 以编程方式调用 ServiceStack API

转载 作者:行者123 更新时间:2023-12-04 04:45:29 27 4
gpt4 key购买 nike

从 asp.net 网站调用 servicestack API 的最佳方法是什么。服务正在 IIS 中运行。服务堆栈中的所有方法都需要先进行身份验证。

我尝试使用 JsonServiceClient 和 HttpWebRequest。第一次进行身份验证时,服务会给我 cookiess-id 和 ss-pid 以及我存储在 cookies 集合中。现在,当我请求另一种方法时,它说,你没有被授权。

问题是,在第二个请求中没有维护 Cookie。但是,如果您从浏览器中自行测试服务。它会在授权期间首先创建 cookie,然后在第二次请求时创建 cookie,它会为您提供适当的响应。

下面是我的代码。使用 JsonServiceClient 和 HttpWebRequest

[HttpPost]
public ActionResult Index(Login loginModel)
{
#region ServiceStack Call
HttpCookie ck;
string baseUrl = "http://192.168.1.101";
var client = new JsonServiceClient(baseUrl);
var authResponse = client.Send<AuthenticateResponse>(new Authenticate
{
UserName = loginModel.UserName,
Password = loginModel.Password,
RememberMe = true
});
foreach (System.Net.Cookie cookie in client.CookieContainer.GetCookies(new Uri(baseUrl)))
{
if (cookie.Name == "ss-id")
{
ck = new HttpCookie(cookie.Name);
ck.Value = cookie.Value;
ck.Expires.AddDays(1); //Check when to expire the cookie
Response.Cookies.Add(ck);
}
}
}

在 HttpWebRequest 代码下方

protected string CallToApi(string baseUrl, bool createCookie)
{
CookieContainer cc = new CookieContainer();
System.Uri uri = new Uri(baseUrl);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.ContentType = @"application/json; charset=utf-8";
request.Timeout = 200000;
request.Accept = "application/json";
request.CookieContainer = new CookieContainer();
try
{
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (Stream responseStream = response.GetResponseStream())
{
StreamReader reader = new StreamReader(responseStream, System.Text.Encoding.UTF8);
if (reader != null)
{
if (createCookie)
{
//Create Cookies
}
}

return reader.ReadToEnd();
}
}
catch (WebException ex)
{
throw ex;
}
}

如何调用第二种方法?

http://192.168.1.101/api/teamleaders 网址

当调用这个 Url 时,我可以保留我的 cookies 吗?或者 ServiceStack 本身必须有开箱即用的。

最佳答案

JsonServiceClient 应该保留 cookie。我已成功使用以下代码(使用默认的 CredentialsAuthProvider):

var client = new JsonServiceClient(baseUri);

var authResponse = client.Post(new Auth
{
provider = CredentialsAuthProvider.Name,
UserName = "username",
Password = "password",
RememberMe = true
});

注意:这是 3.9.71 版,而不是我还没有机会升级到的新 v4 堆栈。同样的“应该”与继承自 CredentialsAuthProvider 的自定义身份验证提供程序一起使用。

关于servicestack - 以编程方式调用 ServiceStack API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23926169/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com