如何从MVC控制器访问Web Api?

时间:2014-09-09 12:56:07

标签: asp.net-mvc asp.net-web-api

我创建了一个Web API 2项目,它将成为连接数据库的服务层。

现在我有两个不同的MVC 5.2应用程序:一个网站及其CMS ......

在MVC 5.2控制器中,我想访问API以获取帖子,创建帖子等等。

  1. 如何从我的MVC控制器访问api?

  2. 我可以调用API并发送一个包含一个要保存的图像的帖子吗?

    我该怎么做?我应该以哪种格式发送PostModel中集成的图像?

  3. 如何确保只有我的两个MVC应用程序才有权使用该API?

    所有应用程序都在同一台服务器上。

1 个答案:

答案 0 :(得分:6)

编辑

作者评论:我只是希望服务层(Web API)与网站分开,因为我将有3个应用程序使用相同的服务层:博客,CMS和网站。如果可能的话,我很欣赏全班。谢谢

是的,最好将它分开,不要在添加时继续作为参考。这是因为有一天您可能希望部署在单独的服务器上。或者拥有不同的部署流程,实施持续集成开发流程。

因此,从我们所有的讨论中可以清楚地看出,您将实施为:

enter image description here

您将如何从其他.Net应用程序调用WebApi?

您将要使用的简单事项是.Net Framework 4.5(?)中添加的HttpClient类。我想。

using (var client = new HttpClient())
    {
        // New code:
        client.BaseAddress = new Uri("http://localhost:9000/");
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    }
  1. 如何将图像与数据一起发送到WebApi?
  2. 您可以将我项目中的代码用作参考:

    [HttpPost]
            public async Task<IHttpActionResult> UploadFileAsync()
            {
                IHttpActionResult actionResult = null;
    
                if (Request.Content.IsMimeMultipartContent())
                {
                    // Read the file and form data.
                    MultipartFormDataMemoryStreamProvider provider = new MultipartFormDataMemoryStreamProvider();
                    await Request.Content.ReadAsMultipartAsync(provider);
    
                    // get form data from  like provider.FormData["description"];
                    if (!provider.FileStreams.Any())
                    {
                        actionResult = BadRequest(ValidationMessages.FileNotFound);
                    }
                    else
                    {
                        var ownerID = 0;
                        var ownerType = provider.FormData.Get("ownerType");
                        int.TryParse(provider.FormData.Get("ownerID"), out ownerID);
    
                        List<Document> documents = new List<Document>();
    
                        foreach (KeyValuePair<NameValueCollection, Stream> file in provider.FileStreams)
                        {
                            NameValueCollection fileHeader = file.Key;
                            string fileName = fileHeader.Get("FileName");
                            string contentType = fileHeader.Get("ContentType");
                            Stream stream = file.Value;
    
    
                            using (var reader = new BinaryReader(stream))
                            {
                                var fileBytes = reader.ReadBytes((int)stream.Length);
    
                                var document = new Document()
                                {
                                    FileName = fileName,
                                    Extension = Path.GetExtension(fileName),
                                    Binary = fileBytes,
                                    ContentType = contentType,
                                    Size = fileBytes.LongLength
                                };
    
                                if (ownerID > 0)
                                {
                                    document.RequestID = ownerID;
                                }
    
                                documents.Add(document);
                            }
                        }
    
                        if (documents.Count() > 0)
                        {
                            string exceptionMessages = string.Empty;
                            if (this.DomainService.InsertRange(documents, out exceptionMessages))
                            {
                                actionResult = Created(string.Empty, documents);
                            }
                            else
                            {
                                actionResult = BadRequest(exceptionMessages);
                            }
                        }
                        else
                        {
                            actionResult = BadRequest(ValidationMessages.FileNotFound);
                        }
                    }
                }
                else
                {
                    // The response to upload did not came with Multiple content;
                    actionResult = BadRequest(ValidationMessages.MimeNotFound);
                }
    
                return actionResult;
            }
    
    
    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.Collections.Specialized;
    using System.IO;
    using System.Linq;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using System.Threading.Tasks;
    using System.Web;
    
    namespace Webapi.Helper
    {
        public class MultipartFormDataMemoryStreamProvider : MultipartMemoryStreamProvider
        {
            private readonly Collection<bool> _isFormData = new Collection<bool>();
            private readonly NameValueCollection _formData = new NameValueCollection(StringComparer.OrdinalIgnoreCase);
            private readonly Dictionary<NameValueCollection, Stream> _fileStreams = new Dictionary<NameValueCollection, Stream>();
    
            public NameValueCollection FormData
            {
                get { return _formData; }
            }
    
            public Dictionary<NameValueCollection, Stream> FileStreams
            {
                get { return _fileStreams; }
            }
    
            public override Stream GetStream(HttpContent parent, HttpContentHeaders headers)
            {
                if (parent == null)
                {
                    throw new ArgumentNullException("parent");
                }
    
                if (headers == null)
                {
                    throw new ArgumentNullException("headers");
                }
    
    
                var contentDisposition = headers.ContentDisposition;
                if (contentDisposition == null)
                {
                    throw new InvalidOperationException("Did not find required 'Content-Disposition' header field in MIME multipart body part.");
                }
    
                _isFormData.Add(String.IsNullOrEmpty(contentDisposition.FileName));
                return base.GetStream(parent, headers);
            }
    
            public override async Task ExecutePostProcessingAsync()
            {
                for (var index = 0; index < Contents.Count; index++)
                {
                    HttpContent formContent = Contents[index];
                    if (_isFormData[index])
                    {
                        // Field
                        string formFieldName = UnquoteToken(formContent.Headers.ContentDisposition.Name) ?? string.Empty;
                        string formFieldValue = await formContent.ReadAsStringAsync();
                        FormData.Add(formFieldName, formFieldValue);
                    }
                    else
                    {
                        Stream stream = await formContent.ReadAsStreamAsync(); // File
                        /// we are not going to accept any stream that has no value!!
                        if (stream.Length > 0)
                        {
                            string fileName = UnquoteToken(formContent.Headers.ContentDisposition.FileName);
    
                            NameValueCollection fileHeader = new NameValueCollection();
                            fileHeader.Add("FileName", fileName);
                            fileHeader.Add("ContentType", UnquoteToken(formContent.Headers.ContentType.MediaType));
                            FileStreams.Add(fileHeader, stream);
                        }
                    }
                }
            }
    
            private static string UnquoteToken(string token)
            {
                if (string.IsNullOrWhiteSpace(token))
                {
                    return token;
                }
    
                if (token.StartsWith("\"", StringComparison.Ordinal) && token.EndsWith("\"", StringComparison.Ordinal) && token.Length > 1)
                {
                    return token.Substring(1, token.Length - 2);
                }
    
                return token;
            }
        }
    }
    

    我如何确保安全,以便只有我的应用程序才能与WebApi连接?

    简而言之,您可以按照此架构使用应用程序之间共享的私钥。

    enter image description here 网上有很多代码可以帮助你解决这个问题。