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

时间:2017-04-20 19:39:15

标签: 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)

并收到类似于引用静态对象的错误消息....

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

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

第一种方法

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

  • 创建一个类库项目。为不同项目共同使用的逻辑/函数创建一个接口。
  • 在类库项目中实现接口。
  • 在不同的项目(即WebAPI项目)中,使用界面来访问常用功能。

第二种方法

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

  • 它不是一个好的设计,你的问题没有得到解决(只是被规避)。
  • 效率低下,因为webclient将使用http请求访问同一解决方案中的代码。
  • 为了将来的维护,您最终可能会创建多个Web客户端。

答案 1 :(得分:0)

不,像往常一样,您需要创建一个新的Web客户端才能使用API​​。

@Marcus H在评论中建议的内容也是可行的,只需将第二个API 中的逻辑包装到一个单独的方法(无论是实例还是静态)中,然后从中调用它API 可以解决问题。

答案 2 :(得分:0)

是的,你可以。您可以在调用method1的控制器方法method2中创建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。 如果您使用Postman Chrome扩展程序工具,那么如果您可以访问您的终端,则可以自动生成C#代码。 只需将webclient代码放在Controller方法中,一个API调用就会有效地链接到另一个。

所以在你的ApiController中你写的东西是:

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