c# tutorial - Wie Hinzufügen von Web-API zu einem vorhandenen ASP.NET MVC(5)Web Application-Projekt?




deutsch core (2)

Angenommen, Sie haben beim Erstellen eines neuen MVC (5) -Projekts vergessen, das Kontrollkästchen "Web-API" anzukreuzen (fügen Sie es dem Projekt hinzu). Was müssen Sie tun, um die Web-API hinzuzufügen und in Betrieb zu nehmen?

Es gibt eine Reihe von Migrationsfragen, aber keine scheint die vollständigen und aktuellen Schritte zum Hinzufügen der Web-API zu einem MVC 5-Projekt zu enthalten und scheint sich von einigen der alten Antworten geändert zu haben.

Fügen Sie Web-API zu MVC 4 hinzu

Hinzufügen von GlobalConfiguration.Configure (WebApiConfig.Register) MVC 4


Answers

Aktualisieren Sie das MVC-Projekt

Verwenden Sie Nuget , um die neueste Web-API zu erhalten.

Projekt - Rechtsklick - Nuget-Pakete verwalten - Nach Web-API (Microsoft ASP.NET-Web-API ...) suchen und in Ihrem MVC-Projekt installieren.

Dann müssen Sie noch Web-API-Routing zum funktionieren bringen. Von Microsoft Konfigurieren von ASP.NET Web API 2

Fügen Sie WebApiConfig.cs dem App_Start / -Ordner hinzu

using System.Web.Http;

namespace WebApplication1
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // TODO: Add any additional configuration code.

            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

        // WebAPI when dealing with JSON & JavaScript!
        // Setup json serialization to serialize classes to camel (std. Json format)
        var formatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
        formatter.SerializerSettings.ContractResolver =
            new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver();
        }
    }
}

Wenn Sie ein MVC-Projekt haben, wird es Global.asax.cs haben , fügen Sie die neuen Routen hinzu. Reihenfolge der Global.asax.cs-Routen ist kritisch. Beachten Sie, dass es veraltete Beispiele gibt, die WebApiConfig.Register

Fügen Sie diese Zeile zu Global.asax.cs hinzu: GlobalConfiguration.Configure(WebApiConfig.Register);

protected void Application_Start()
{
    // Default stuff
    AreaRegistration.RegisterAllAreas();

    // Manually installed WebAPI 2.2 after making an MVC project.
    GlobalConfiguration.Configure(WebApiConfig.Register); // NEW way
    //WebApiConfig.Register(GlobalConfiguration.Configuration); // DEPRECATED

    // Default stuff
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

WebAPI-Hilfe

Installieren Sie WebAPI.HelpPage, um die ( sehr ) hilfreichen WebAPI-Hilfeseiten zu erhalten. Siehe http://channel9.msdn.com/Events/Build/2014/3-644 (~ 42 Minuten in) für das, was es tut. Es sieht sehr hilfreich aus!

Nuget-Konsole: Install-Package Microsoft.AspNet.WebApi.HelpPage

Um zu überprüfen, ob WebAPI funktioniert:

Zum Controller-Ordner -> Neues Objekt hinzufügen -> Web-API-Controller-Klasse.

public class TestController : ApiController
{
    //public TestController() { }

    // GET api/<controller>
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // GET api/<controller>/5
    public string Get(int id)
    {
        return "value";
    }
    //...
}

Jetzt können Sie wie gewohnt in IE / FF / Chrome oder in den JavaScript-Konsolen für Nicht-Get-Tests testen.

(Wenn nur der Controller in der URL die Aktion GET () im neuen Web-API-Controller aufruft, wird er je nach REST automatisch den Methoden / Aktionen zugeordnet, zB PUT / POST / GET / DELETE, Sie müssen ihn nicht aufrufen sie durch Aktion wie in MVC) Die URL direkt:

http://localhost:PORT/api/CONTROLLERNAME/

Verwenden Sie alternativ jQuery, um den Controller abzufragen. Führen Sie das Projekt aus, öffnen Sie die Konsole (F12 in IE) und versuchen Sie, eine Ajax-Abfrage auszuführen. (Überprüfen Sie Ihren PORT & CONTROLLERNAME)

$.get( "http://localhost:PORT/api/CONTROLLERNAME/", function( data ) {
    //$( ".result" ).html( data );
    alert( "Get data received:" + data);
});

Randnotiz: Bei der Kombination von MVC und Web-API in einem Projekt sind einige Vor- und Nachteile zu beachten

Überprüfung der WebAPI-Hilfe: http://localhost:PORT/help


in byte[] (zB zum Speichern in DB):

using (MemoryStream ms = new MemoryStream()) {
    file.InputStream.CopyTo(ms);
    byte[] array = ms.GetBuffer();
}

Um den Eingangsstrom direkt in die Datenbank zu übertragen, ohne ihn im Speicher zu speichern, können Sie diese Klasse von here und ein bisschen geändert:

public class VarbinaryStream : Stream {
private SqlConnection _Connection;

private string _TableName;
private string _BinaryColumn;
private string _KeyColumn;
private int _KeyValue;

private long _Offset;

private SqlDataReader _SQLReader;
private long _SQLReadPosition;

private bool _AllowedToRead = false;

public VarbinaryStream(
    string ConnectionString,
    string TableName,
    string BinaryColumn,
    string KeyColumn,
    int KeyValue,
    bool AllowRead = false)
{
  // create own connection with the connection string.
  _Connection = new SqlConnection(ConnectionString);

  _TableName = TableName;
  _BinaryColumn = BinaryColumn;
  _KeyColumn = KeyColumn;
  _KeyValue = KeyValue;


  // only query the database for a result if we are going to be reading, otherwise skip.
  _AllowedToRead = AllowRead;
  if (_AllowedToRead == true)
  {
    try
    {
      if (_Connection.State != ConnectionState.Open)
        _Connection.Open();

      SqlCommand cmd = new SqlCommand(
                      @"SELECT TOP 1 [" + _BinaryColumn + @"]
                            FROM [dbo].[" + _TableName + @"]
                            WHERE [" + _KeyColumn + "] = @id",
                  _Connection);

      cmd.Parameters.Add(new SqlParameter("@id", _KeyValue));

      _SQLReader = cmd.ExecuteReader(
          CommandBehavior.SequentialAccess |
          CommandBehavior.SingleResult |
          CommandBehavior.SingleRow |
          CommandBehavior.CloseConnection);

      _SQLReader.Read();
    }
    catch (Exception e)
    {
      // log errors here
    }
  }
}

// this method will be called as part of the Stream ímplementation when we try to write to our VarbinaryStream class.
public override void Write(byte[] buffer, int index, int count)
{
  try
  {
    if (_Connection.State != ConnectionState.Open)
      _Connection.Open();

    if (_Offset == 0)
    {
      // for the first write we just send the bytes to the Column
      SqlCommand cmd = new SqlCommand(
                                  @"UPDATE [dbo].[" + _TableName + @"]
                                            SET [" + _BinaryColumn + @"] = @firstchunk 
                                        WHERE [" + _KeyColumn + "] = @id",
                              _Connection);

      cmd.Parameters.Add(new SqlParameter("@firstchunk", buffer));
      cmd.Parameters.Add(new SqlParameter("@id", _KeyValue));

      cmd.ExecuteNonQuery();

      _Offset = count;
    }
    else
    {
      // for all updates after the first one we use the TSQL command .WRITE() to append the data in the database
      SqlCommand cmd = new SqlCommand(
                              @"UPDATE [dbo].[" + _TableName + @"]
                                        SET [" + _BinaryColumn + @"].WRITE(@chunk, NULL, @length)
                                    WHERE [" + _KeyColumn + "] = @id",
                           _Connection);

      cmd.Parameters.Add(new SqlParameter("@chunk", buffer));
      cmd.Parameters.Add(new SqlParameter("@length", count));
      cmd.Parameters.Add(new SqlParameter("@id", _KeyValue));

      cmd.ExecuteNonQuery();

      _Offset += count;
    }
  }
  catch (Exception e)
  {
    // log errors here
  }
}

// this method will be called as part of the Stream ímplementation when we try to read from our VarbinaryStream class.
public override int Read(byte[] buffer, int offset, int count)
{
  try
  {
    long bytesRead = _SQLReader.GetBytes(0, _SQLReadPosition, buffer, offset, count);
    _SQLReadPosition += bytesRead;
    return (int)bytesRead;
  }
  catch (Exception e)
  {
    // log errors here
  }
  return -1;
}
public override bool CanRead
{
  get { return _AllowedToRead; }
}

protected override void Dispose(bool disposing)
{
  if (_Connection != null)
  {
    if (_Connection.State != ConnectionState.Closed)
      try { _Connection.Close();           }
      catch { }
    _Connection.Dispose();
  }
  base.Dispose(disposing);
}

#region unimplemented methods
public override bool CanSeek
{
  get { return false; }
}

public override bool CanWrite
{
  get { return true; }
}

public override void Flush()
{
  throw new NotImplementedException();
}

public override long Length
{
  get { throw new NotImplementedException(); }
}

public override long Position
{
  get
  {
    throw new NotImplementedException();
  }
  set
  {
    throw new NotImplementedException();
  }
}
public override long Seek(long offset, SeekOrigin origin)
{
  throw new NotImplementedException();
}

public override void SetLength(long value)
{
  throw new NotImplementedException();
}
#endregion unimplemented methods  }

und die Verwendung:

  using (var filestream = new VarbinaryStream(
                            "Connection_String",
                            "Table_Name",
                            "Varbinary_Column_name",
                            "Key_Column_Name",
                            keyValueId,
                            true))
  {
    postedFile.InputStream.CopyTo(filestream);
  }




c# asp.net asp.net-mvc asp.net-web-api asp.net-mvc-5