gpt4 book ai didi

c# - 调用另一个具有表单例份验证的应用程序的 API

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

我有一个 MVC 应用程序托管在具有表单例份验证的内部 IIS 中。 <system.web>设置是:

  <system.web>
<compilation debug="true" targetFramework="4.8"/>
<httpRuntime targetFramework="4.8"/>
<authentication mode="Forms">
<forms loginUrl="~/Login" timeout="2880"/>
</authentication>
<authorization>
<allow users="?" verbs="OPTIONS"/>
<deny users="?"/>
</authorization>
</system.web>
因此,当用户未通过身份验证时,它会重定向到登录页面。我的登录 Controller 看起来像:
enter image description here
它有一个 API,它是 POST 方法并返回一个列表。
enter image description here
我在 UI 中使用 ajax 访问这个 api。
ajax call javascript
它在此应用程序中运行良好。现在我有另一个 MVC 应用程序,它在 azure 云中,它需要访问这个 API。
当我调用它( http://my-premise-application.com/api/customer/list )时,它返回登录页面的内容。
从第二个应用程序调用第一个应用程序的 api 的可能方法是什么?任何建议或指导都会有所帮助。

最佳答案

正如您在评论中提到的,您必须对另一个项目 Web API 进行 C# HTTP 调用。您可以通过在项目中的任何位置创建一个名为 MakeRequestService 的类来实现。和一个 static名为 MakeWebRequest 的方法,它将返回一个字符串,即您需要的 JSON。

public class MakeRequestService
{
public static string MakeWebRequest(string url, string verb, int timeout, Dictionary<string, string> headers = null, string contentType = "", string json = "")
{
string myResult = string.Empty;

try
{
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
myRequest.Method = verb;
myRequest.Timeout = timeout;

if (!string.IsNullOrEmpty(contentType))
myRequest.ContentType = contentType;

if (headers != null)
{
foreach (var header in headers)
{
if (header.Key == HttpRequestHeader.Accept.ToString())
myRequest.Accept = header.Value;
else
myRequest.Headers.Add(header.Key, header.Value);
}
}

if (!string.IsNullOrEmpty(json))
{
byte[] bytes = Encoding.UTF8.GetBytes(json);
myRequest.ContentLength = bytes.Length;

using (var streamWriter = new StreamWriter(myRequest.GetRequestStream()))
{
streamWriter.Write(json);
streamWriter.Flush();
streamWriter.Close();
}
}

using (HttpWebResponse response = myRequest.GetResponse() as HttpWebResponse)
{
StreamReader reader = new StreamReader(response.GetResponseStream());
myResult = reader.ReadToEnd();
}
}
catch (WebException ex)
{
if (ex.Status == WebExceptionStatus.ProtocolError)
{
if (ex.Response is HttpWebResponse response)
{
Stream stream = response.GetResponseStream();
StreamReader sr = new StreamReader(stream: stream);
myResult = sr.ReadToEnd();
stream.Position = 0;
}
}
else
{
myResult = ex.Message;
}
}

return myResult;
}
}
然后,您可以通过以下方式使用此方法:
string res = MakeRequestService.MakeWebRequest(
url: "The FULL URL of the first project, based on your example, e.g. http://localhost:69963/api/customer",
verb: "POST",
contentType: "application/json"
);

var outcome = JsonConvert.DeserializeObject<IEnumerable<Customer>>(res);
catch阻止在 MakeWebRequest方法只是一个示例,如果 API 调用失败,它将返回一个包含 JSON 错误正文的纯字符串。您可以根据需要修改它,例如重新抛出 WebException并按照您想要的方式处理它。 MakeWebRequest方法非常抽象,因此您也可以将其用于 API 调用。如果您制作 POST带有 JSON 正文的请求 - 只需将正文传递给 json范围。如果您制作 GET带有查询参数的请求,只需构建包含查询参数的整个 URL,然后调用该方法。

关于c# - 调用另一个具有表单例份验证的应用程序的 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64696403/

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