C# 从同一应用程序中的另一个WebApi调用WebApi

C# 从同一应用程序中的另一个WebApi调用WebApi,c#,asp.net-mvc,asp.net-web-api,C#,Asp.net Mvc,Asp.net Web Api,我有几个用MVC WebAPI开发的WebAPI,比如 public IHttpActionResult SendBroadcast(FinalPayload FinalPayload) 我想从这个api中调用另一个web api。我所有的API都在同一个应用程序中。第二个API的签名是 public IHttpActionResult SendMessage(Notifications) 从我尝试的第一个API开始 this.SendMessage(Notifications) 并且得到

我有几个用MVC WebAPI开发的WebAPI,比如

public IHttpActionResult SendBroadcast(FinalPayload FinalPayload)
我想从这个api中调用另一个web api。我所有的API都在同一个应用程序中。第二个API的签名是

public IHttpActionResult SendMessage(Notifications)
从我尝试的第一个API开始

this.SendMessage(Notifications)
并且得到了错误消息,比如对静态对象的引用

我想知道这种调用webAPI的方式是否被允许,或者我是否必须调用web客户端或类似的客户端


如果您在这方面有任何帮助,我们将不胜感激。

不,像往常一样,您需要创建一个新的web客户端来使用API


@Marcus H在评论中提出的建议也是可行的,只需将第二个API中的逻辑封装到一个单独的方法中(无论是实例还是静态),并从第一个API调用它就可以了。

1st approach

您必须重新设计应用程序中的代码,即解决方案

  • 创建类库项目。为不同项目使用的通用逻辑/功能创建接口
  • 在类库项目中实现接口
  • 在不同的项目(即WebAPI项目)中,使用该接口访问通用功能
第二次进近

正如您所想,您当然可以创建一个web客户端来访问另一个项目中的web API

  • 这不是一个好的设计,你的问题并没有真正解决(只是规避)
  • 效率低下,因为webclient将使用http请求访问同一解决方案中的代码
  • 为了将来的维护,您可能会创建多个web客户端
    是的,你可以。您可以在控制器方法method2中创建调用method1的webClient

    这是一个可以用来帮助您的小助手类:

    namespace Api.Helpers
    {
        public static class ApiHelpers
        {
            private static string HttpGet(string url)
            {
                WebRequest request = WebRequest.Create(url);
                request.Credentials = CredentialCache.DefaultCredentials;
                WebResponse response = request.GetResponse();
                Stream dataStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(dataStream);
                string responseFromServer = reader.ReadToEnd();
                reader.Close();
                response.Close();
                return responseFromServer;
            }
    
            public static string HttpPostJson(string url, string json)
            {
                var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
                httpWebRequest.ContentType = "application/json";
                httpWebRequest.Method = "POST";
    
                using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
                {
                    streamWriter.Write(json);
                }
    
                var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
                using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
                {
                    var result = streamReader.ReadToEnd();
                    return result;
                };
            }
        }
    }
    
    如果您想要基于Cookie的身份验证,那么只需使用RestSharp即可。 如果你使用了Chrome扩展工具Postman,那么如果你可以访问你的端点,你就可以自动生成你的C代码。 只要将webclient代码放在Controller方法中,一个API调用就会有效地链接到另一个API调用

    因此,在ApicController中,您可以编写如下内容:

    IHttpActionResult method1() {
        var result = ApiHelpers.HttpGet("http://thing.com/test");
        return Ok(result);
    }
    

    一个解决方案是将第二个web api方法中的逻辑提取到一个服务/业务类中,并调用它,而不是尝试创建一个新的请求。我通常将api调用的逻辑作为共享方法放入DLL中的其他方法中,但这是因为我的逻辑也是asp.net项目的一部分。你找到下面有用的user1144596了吗??