Sayfalar

21 Ekim 2019 Pazartesi

MVC LOADING TOO SLOW ISSUE


İlgili Application > Advanced Settings >
Satart mode = always Running
Proccesor Afility Enabled = True

9 Ekim 2019 Çarşamba

MVC Decimal symbols comes with "." (dot)


Float yada money değişkenler bazen 17.95 şekilden gelirken biz bunu 17,95 olarak kullanıcıda görünmesini istersek yani  kullanıcının yerel ayarlarına göre gösterilsin istenirse:

IIS Manager >  İlgili Site> .NET Globaliztion> Culter> Seçiniz > Enelable Client Based Culter> True 

8 Ekim 2019 Salı

Mvc Error: The entity type ApplicationUser is not part of the model for the current context.


Db First ile Asp Identity impementasyonu yapıldıysa Web Config Dosyasında iki adet connection string dosyası olmalıdır. İlki EF Ado.Net ile Sql'den Tabloların çekilmesine yarayan string ikincisi ise Microsoft.AspNet.Identity'nin haberleşecği connection string'dir.

Web Congif Dosyasının görüntüsü şöyle olmalıdır.



<connectionStrings>
  <!-- For Identtiy   -->
  <add name="ExpenditureIdentity" 
       connectionString="data source=.\sqlExpress;initial catalog=Expenditure;
       user id=sa;password=*****; Connect Timeout=60;" 
       providerName="System.Data.SqlClient" />
 
 
  <!-- For DB First Entity Framework   -->  
  <add name="ExpenditureEntities" 
       connectionString="metadata=res://*/Models.EF.Expenditures.csdl|res://*/Models.EF.Expenditures.ssdl|res://*/Models.EF.Expenditures.msl;
       provider=System.Data.SqlClient;
       provider connection string=&quot;
       data source=.\sqlExpress;
       initial catalog=Expenditure;
       user id=sa;password=*****;
       MultipleActiveResultSets=True;
       App=EntityFramework&quot;"
       providerName="System.Data.EntityClient" />
  
</connectionStrings>


MVC Account Identity DataBase Script

USE [master]
GO
/****** Object:  Database [TESTDB]    Script Date: 8.10.2019 23:30:05 ******/
CREATE DATABASE [TESTDB]
 CONTAINMENT = NONE
 ON  PRIMARY
( NAME = N'TESTDB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\TESTDB.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
 LOG ON
( NAME = N'TESTDB_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\DATA\TESTDB_log.ldf' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
GO
ALTER DATABASE [TESTDB] SET COMPATIBILITY_LEVEL = 140
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [TESTDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [TESTDB] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [TESTDB] SET ANSI_NULLS OFF
GO
ALTER DATABASE [TESTDB] SET ANSI_PADDING OFF
GO
ALTER DATABASE [TESTDB] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [TESTDB] SET ARITHABORT OFF
GO
ALTER DATABASE [TESTDB] SET AUTO_CLOSE ON
GO
ALTER DATABASE [TESTDB] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [TESTDB] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [TESTDB] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [TESTDB] SET CURSOR_DEFAULT  GLOBAL
GO
ALTER DATABASE [TESTDB] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [TESTDB] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [TESTDB] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [TESTDB] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [TESTDB] SET  ENABLE_BROKER
GO
ALTER DATABASE [TESTDB] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [TESTDB] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [TESTDB] SET TRUSTWORTHY OFF
GO
ALTER DATABASE [TESTDB] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
ALTER DATABASE [TESTDB] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [TESTDB] SET READ_COMMITTED_SNAPSHOT OFF
GO
ALTER DATABASE [TESTDB] SET HONOR_BROKER_PRIORITY OFF
GO
ALTER DATABASE [TESTDB] SET RECOVERY SIMPLE
GO
ALTER DATABASE [TESTDB] SET  MULTI_USER
GO
ALTER DATABASE [TESTDB] SET PAGE_VERIFY CHECKSUM 
GO
ALTER DATABASE [TESTDB] SET DB_CHAINING OFF
GO
ALTER DATABASE [TESTDB] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF )
GO
ALTER DATABASE [TESTDB] SET TARGET_RECOVERY_TIME = 60 SECONDS
GO
ALTER DATABASE [TESTDB] SET DELAYED_DURABILITY = DISABLED
GO
ALTER DATABASE [TESTDB] SET QUERY_STORE = OFF
GO
USE [TESTDB]
GO
ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE = ON;
GO
ALTER DATABASE SCOPED CONFIGURATION SET LEGACY_CARDINALITY_ESTIMATION = OFF;
GO
ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET LEGACY_CARDINALITY_ESTIMATION = PRIMARY;
GO
ALTER DATABASE SCOPED CONFIGURATION SET MAXDOP = 0;
GO
ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET MAXDOP = PRIMARY;
GO
ALTER DATABASE SCOPED CONFIGURATION SET PARAMETER_SNIFFING = ON;
GO
ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET PARAMETER_SNIFFING = PRIMARY;
GO
ALTER DATABASE SCOPED CONFIGURATION SET QUERY_OPTIMIZER_HOTFIXES = OFF;
GO
ALTER DATABASE SCOPED CONFIGURATION FOR SECONDARY SET QUERY_OPTIMIZER_HOTFIXES = PRIMARY;
GO
USE [TESTDB]
GO
/****** Object:  Table [dbo].[__MigrationHistory]    Script Date: 8.10.2019 23:30:05 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[__MigrationHistory](
[MigrationId] [nvarchar](150) NOT NULL,
[ContextKey] [nvarchar](300) NOT NULL,
[Model] [varbinary](max) NOT NULL,
[ProductVersion] [nvarchar](32) NOT NULL,
 CONSTRAINT [PK_dbo.__MigrationHistory] PRIMARY KEY CLUSTERED
(
[MigrationId] ASC,
[ContextKey] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
/****** Object:  Table [dbo].[AspNetRoles]    Script Date: 8.10.2019 23:30:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[AspNetRoles](
[Id] [nvarchar](128) NOT NULL,
[Name] [nvarchar](256) NOT NULL,
 CONSTRAINT [PK_dbo.AspNetRoles] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[AspNetUserClaims]    Script Date: 8.10.2019 23:30:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[AspNetUserClaims](
[Id] [int] IDENTITY(1,1) NOT NULL,
[UserId] [nvarchar](128) NOT NULL,
[ClaimType] [nvarchar](max) NULL,
[ClaimValue] [nvarchar](max) NULL,
 CONSTRAINT [PK_dbo.AspNetUserClaims] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
/****** Object:  Table [dbo].[AspNetUserLogins]    Script Date: 8.10.2019 23:30:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[AspNetUserLogins](
[LoginProvider] [nvarchar](128) NOT NULL,
[ProviderKey] [nvarchar](128) NOT NULL,
[UserId] [nvarchar](128) NOT NULL,
 CONSTRAINT [PK_dbo.AspNetUserLogins] PRIMARY KEY CLUSTERED
(
[LoginProvider] ASC,
[ProviderKey] ASC,
[UserId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[AspNetUserRoles]    Script Date: 8.10.2019 23:30:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[AspNetUserRoles](
[UserId] [nvarchar](128) NOT NULL,
[RoleId] [nvarchar](128) NOT NULL,
 CONSTRAINT [PK_dbo.AspNetUserRoles] PRIMARY KEY CLUSTERED
(
[UserId] ASC,
[RoleId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object:  Table [dbo].[AspNetUsers]    Script Date: 8.10.2019 23:30:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[AspNetUsers](
[Id] [nvarchar](128) NOT NULL,
[Email] [nvarchar](256) NULL,
[EmailConfirmed] [bit] NOT NULL,
[PasswordHash] [nvarchar](max) NULL,
[SecurityStamp] [nvarchar](max) NULL,
[PhoneNumber] [nvarchar](max) NULL,
[PhoneNumberConfirmed] [bit] NOT NULL,
[TwoFactorEnabled] [bit] NOT NULL,
[LockoutEndDateUtc] [datetime] NULL,
[LockoutEnabled] [bit] NOT NULL,
[AccessFailedCount] [int] NOT NULL,
[UserName] [nvarchar](256) NOT NULL,
 CONSTRAINT [PK_dbo.AspNetUsers] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
SET ANSI_PADDING ON
GO
/****** Object:  Index [RoleNameIndex]    Script Date: 8.10.2019 23:30:06 ******/
CREATE UNIQUE NONCLUSTERED INDEX [RoleNameIndex] ON [dbo].[AspNetRoles]
(
[Name] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
SET ANSI_PADDING ON
GO
/****** Object:  Index [IX_UserId]    Script Date: 8.10.2019 23:30:06 ******/
CREATE NONCLUSTERED INDEX [IX_UserId] ON [dbo].[AspNetUserClaims]
(
[UserId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
SET ANSI_PADDING ON
GO
/****** Object:  Index [IX_UserId]    Script Date: 8.10.2019 23:30:06 ******/
CREATE NONCLUSTERED INDEX [IX_UserId] ON [dbo].[AspNetUserLogins]
(
[UserId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
SET ANSI_PADDING ON
GO
/****** Object:  Index [IX_RoleId]    Script Date: 8.10.2019 23:30:06 ******/
CREATE NONCLUSTERED INDEX [IX_RoleId] ON [dbo].[AspNetUserRoles]
(
[RoleId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
SET ANSI_PADDING ON
GO
/****** Object:  Index [IX_UserId]    Script Date: 8.10.2019 23:30:06 ******/
CREATE NONCLUSTERED INDEX [IX_UserId] ON [dbo].[AspNetUserRoles]
(
[UserId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
SET ANSI_PADDING ON
GO
/****** Object:  Index [UserNameIndex]    Script Date: 8.10.2019 23:30:06 ******/
CREATE UNIQUE NONCLUSTERED INDEX [UserNameIndex] ON [dbo].[AspNetUsers]
(
[UserName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
ALTER TABLE [dbo].[AspNetUserClaims]  WITH CHECK ADD  CONSTRAINT [FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId] FOREIGN KEY([UserId])
REFERENCES [dbo].[AspNetUsers] ([Id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[AspNetUserClaims] CHECK CONSTRAINT [FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId]
GO
ALTER TABLE [dbo].[AspNetUserLogins]  WITH CHECK ADD  CONSTRAINT [FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId] FOREIGN KEY([UserId])
REFERENCES [dbo].[AspNetUsers] ([Id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[AspNetUserLogins] CHECK CONSTRAINT [FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId]
GO
ALTER TABLE [dbo].[AspNetUserRoles]  WITH CHECK ADD  CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId] FOREIGN KEY([RoleId])
REFERENCES [dbo].[AspNetRoles] ([Id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[AspNetUserRoles] CHECK CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId]
GO
ALTER TABLE [dbo].[AspNetUserRoles]  WITH CHECK ADD  CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId] FOREIGN KEY([UserId])
REFERENCES [dbo].[AspNetUsers] ([Id])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[AspNetUserRoles] CHECK CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId]
GO
USE [master]
GO
ALTER DATABASE [TESTDB] SET  READ_WRITE
GO

3 Ekim 2019 Perşembe

Different Ways of Binding DropDownList in Asp.Net MVC

Different Ways of Binding DropDownList in Asp.Net MVC

07-06-2017
Tagged as: Asp.Net MVC Posted By 
Asp.Net MVC has 2 HTML helper methods to bind DropDownList in input views. This little article will help you understand different ways of dynamically binding DropDownList control by fetching data from database. For simple understanding, let’s assume we have a Department table and want to bind the list of departments in a DropDownList control fetched using Entity Framework.
Assume, you have a view to edit an Employee details which has a DropDownList to change the employee’s department. Let’s see how to bind the DropDownList with Department table data for this edit view.
Using @Html.DropDownListFor()
When we use strongly typed views, we can use the @Html.DropDownListFor() method. This helper method will need the list of departments to first populate the dropdown and then set the employee’s department id passed in model object as selected item.
The below edit action method uses ViewBag.DepartmentListItems to pass the list of departments to view.
Action

public ActionResult edit(int id)
{
    Employee emp = db.Employees.Where(e => e.EmployeeId == id).FirstOrDefault();
    ViewBag.DepartmentListItems = db.Departments.Distinct().Select(i => new SelectListItem() { Text = i.DepartmentName, Value = i.DepartmentId.ToString() }).ToList();
    return View(emp);
}

The list items in view bag will be used to bind the dropddownlist and html helper will set the DepartmentId based on the Employee model passed to the view. View Code below.
View

@Html.DropDownListFor(model => model.DepartmentId, ViewBag.DepartmentListItems as IEnumerable<SelectListItem>,"Select")

Note – It is a good practice to use ViewModels to pass the Department list instead of using ViewBag for binding DropDownList. I have just used ViewBag for easy demonstration.
There are many other overloaded methods available for this helper method for adding HTML properties but all those methods too works similar to the above method.
Using @Html.DropDownList()
This is another HTML helper method to bind the DropDownList in Asp.Net MVC view. Though there are around 8 overloaded methods, the below 3 methods are the primarily used most of the time and other methods available are to just pass the HTML properties in different ways.
  1. Bind using IEnumerable<SelectListItem>
This method works similar to first approach (DropDownListFor) but only difference is we are explicitly naming the DropDownList to match the Model property name (Employee.DepartmentId).
Action

public ActionResult edit(int id)
{
    Employee emp = db.Employees.Where(e => e.EmployeeId == id).FirstOrDefault();
    ViewBag.DepartmentListItems = db.Departments.Distinct().Select(i => new SelectListItem() { Text = i.DepartmentName, Value = i.DepartmentId.ToString() }).ToList();
    return View(emp);
}
 

View

@Html.DropDownList("DepartmentId", ViewBag.DepartmentListItems as IEnumerable<SelectListItem>, "Select")

In the above method, the DropDownList selected item will be automatically set to the Employee object’s DepartmentId value though we did not set the selected item explicitly in the HTML helper.
An alternate way to set the selected item is to set the Selected property to true when adding the SelectListItem object into ViewBag.

new SelectListItem() { Text = i.DepartmentName, Value = i.DepartmentId.ToString(), Selected = true }


  1. Bind using List<T>
The above methods passed the list items as a List<SelectListItem> collection which the DropDownList HTML helpers used directly to bind the control. At times, we may also need to bind DropDownList using List<T> object, where T is our business entity. In our case, it is List<Department> object.
We can use the same overload method and use SelectList object for this.
Action

public ActionResult edit(int id)
{
    Employee emp = db.Employees.Where(e => e.EmployeeId == id).FirstOrDefault();
    ViewBag.DepartmentListItems = db.Departments.Distinct().Select(i => new SelectListItem() { Text = i.DepartmentName, Value = i.DepartmentId.ToString() }).ToList();
    return View(emp);
}

View

@Html.DropDownList("DepartmentId", new SelectList(ViewBag.DepartmentList, "DepartmentId","DepartmentName", Model.DepartmentId), "Select")

In the above method, we have set the selected item explicitly in the SelectList object ( SelectList(ViewBag.DepartmentList, "DepartmentId","DepartmentName", Model.DepartmentId)). As indicated in previous approach (i), the above code will also automatically set the selected item even if we don’t specify the selected value explicitly.

  1. Bind Using ViewBag.DropDownListId
This is another simple approach where we can use the ViewBag to supply the SelectList object from controller Action method. MVC will automatically bind the DropDownList with the ViewBag property when the name of the DropDownList matches with ViewBag property name. In our case, it is ViewBag.DepartmentId
Action

public ActionResult edit(int id)
{
    Employee emp = db.Employees.Where(e => e.EmployeeId == id).FirstOrDefault();
    if (emp != null)
        ViewBag.DepartmentId = new SelectList(db.Departments.ToList(), "DepartmentId", "DepartmentName", emp.DepartmentId);
    return View(emp);
}
 
View

@Html.DropDownList("DepartmentId","Select")

In the above method, MVC will automatically bind the SelectList object from the ViewBag property “DepartmentId“ to the DropDownList control.
Happy Coding!!

2 Ekim 2019 Çarşamba

MSSQL Server Connection Check with .UDL


Server bağlantı ayarlarını kontrol etmek ve web config vb dosyalarda kullanmak için güzel bir yöntem

  1. Create a new blank file and name it test.udl.
  2. Double click on it, and a "Data Link Properties" dialog should appear.
  3. On "Providers" tab, select "Microsoft OLE DB Provider for SQL Server" or "SQL Native Client"
  4. On "Connections" tab, try various settings and use the "Test Connection" button to test them. Click "Ok" when it works.
  5. Open the test.udl file in Notepad and copy the line that starts with "Provider=" into your Web.config "ConnectionString" value, BUT delete the little part that says "Provider=SQLNCLI.1;"

Wep Api Installation on Server Side


Visual Studio >>>

1-     Web api içerisinde Install-Package Microsoft.AspNet.WebApi.Cors nuget packets yükle

2-      App_Start\WebApiConfig.cs" file > Add " config.EnableCors();"   before config.MapHttpAttributeRoutes();

3- Eğer proje, Entity Framework ile oluşturulmuş ve özellikle DB Server uzak bir sunucuda bulunuyor ise WebConfig dosyasında connection string mutlaka şöyle olmalı:

    <add name="SunExpressEntities" connectionString="metadata=res://*/Orm.SunExEntities.csdl|res://*/Orm.SunExEntities.ssdl|res://*/Orm.SunExEntities.msl;

   provider=System.Data.SqlClient;
   provider connection string=&quot;
   data source=******;
   User ID= *****; 
   Password=******;
   initial catalog=******;
   integrated security=False;
   persist security info=True;
   MultipleActiveResultSets=True;
   App=EntityFramework&quot;" 
   providerName="System.Data.EntityClient" /> 

4-     Publish et.


Server >>>

1-     Kopyalanan klasörün Yazma ve Okuma izinlerini kontrol et.

2-     Run> inetmgr >IIS 

IIS >>>
İki seçenek mevcut. Ben ikincisini kullandım.

1-      DefaultWebSite> RightClick >Add Application > Finish
    Bu kurulumda Bindings seçeneğini bulamadım. Sadece local host çalışmakta.

2-     Site> RightClick >Add Site> Fills sections..>
Port: Kendiniz verin(*)
IP: Dış IP’yi seçin yada local için “AllAssinged bırakın(**)> Finish 

3-  AnaPanel>  İlgiliSiteİsmi> AdvancedSettings>
           ApplicationPool=DefaultAppPool yada 4.5 Classic






Hatalar ve Çözümleri>>>>

Hata: "ExceptionMessage":"The underlying provider failed on Open

Çözüm: Web config'de intagred Security:False dediğimiz için sitenin bağlı olduğu AppPool pipeline'nı Classic olarak ayarlamak gerekir. Şu ayarı yapın:
 İlgiliSiteİsmi> AdvandecSettings>ApplicationPool=DefaultAppPool yada 4.5 Classic

Uzak urlden bağlatı Hatası:
[Fiddler] The connection to '164.68.98.211' failed.
Error: TimedOut (0x274c).


Çözüm: Port numarası için Firewalldan Inbound yazarak ilgili porta izin verilmeli




* Port numarası 80 değilse Windows Firewall Advanced > Inbound yazarak ilgili porta izin verilmeli
** Default bırakıldığında local host olarak ayarlanır. Daha sonra dış IP’yide bağlamak i.in Bindings> Add



18 Eylül 2019 Çarşamba

Wep Api Error: No action was found on the controller


{"Message":"No HTTP resource was found that matches the request URI 'http://localhost:57193/api/PostFlight/GetByFlightNum/34'.","MessageDetail":"No action was found on the controller 'PostFlight' that matches the request."}


** Çözüm:
routeTemplate: "api/{controller}/{action}/{param}",

Controller içersindeki sorgu fonksiyonlarında ki verilen parametre adı ile config dosyasındaki {param} değişkeninin adı aynı olmalıdır.

Tarihi Excel Serial Number Formatına dönştürmek ?


DATE To OLE


        DateTime MyDate = new DateTime(1904, 12, 12, 1,4,1);
        double MyDouble = MyDate.ToOADate();
 
 
From OLE to DATE
 
        double MyOADate = 831.01289631332;
        DateTime MyDate = DateTime.FromOADate(MyOADate);
 
 
 
 

16 Eylül 2019 Pazartesi

Assing An IP For IIS Website And Open A Port For IIS

IIS (Internet Information Services) allows you to access your website via an IP address. To achieve this, you just have to bind your website to a non-standard port along with public IP address of your VPS. This is more helpful when you want to check your website functionality before making DNS (nameservers) changes, and you have not configured any nameservers yet. You can follow below tutorial to configure IIS to access a website via IP address.

Add a Binding in IIS

  1. Login into your Window server via Remote Desktop.
  2. Go to StartAdministrative Tools → Internet Information Services (IIS) Manager.

    Launch IIS Manager
  3. In the Connections pane of IIS, expand the Sites and select the website which you want to access via IP address.

    Select Website
  4. Click on Bindings link and you will see current bindings of that website.

    Select Bindings
  5. Click on Add button to add a new binding.

    Add Binding
  6. On the Add Site Binding window, keep website Type as http. Select an IP address from the drop-down menu upon which you want to bind the website. Since other websites (along with their Host Header Values) are already bound on port 80, you won't be able to bind this new website on port 80 without Host Header Value (Host name). So, specify a port number (other than default port 80) on which you want to bind this new website. Keep Host name as blank, click OK and then Close. Once the binding is added in IIS Manager, the next step is allowing a port in Windows Firewall.

    Add Site Binding

Open a Port in Windows Firewall


  1. Go to StartAdministrative Tools → Windows Firewall with Advanced Security.

    Windows Firewall
  2. At Windows Firewall window, click on Inbound Rules.

    Inbound Rules
  3. Under Actions pane, click on New Rule and New Inbound Rule Wizard will be opened. On this window, select the Port radio button and click on Next.

    Allow Port
  4. On the next screen, select TCP and Specific local ports radio button. Specify a port number (upon which you set binding in IIS) in Specific local ports field and click Next.

    New Inbound TCP Port Rule
  5. On the next screen, select Allow the connection and click Next.

    Allow Connection

  6. Select the profile where you want to apply this rule and click Next.

    Rule Wizard
  7. Specify Name and Description for the newly created rule & click Finish.


IIS LoginFailed


On Windows10
Error: The login failed.\r\nLogin failed for user 'IIS APPPOOL\\xxx'."

on Server 2012R2
Error: System.Data.Entity.Core.EntityClient.EntityConnection.Open(); Entity Framework Exception “The underlying provider failed on Open


For a local SQL Server:
  • Open SQL Server Management Studio (SSMS) and connect to the SQL Server.
  • Open the Security folder at the server level and not the security folder for the database.
  • Right click on the logins and select New Login.
  • For the login, type IIS APPPOOL\AppPoolName and DO NOT CLICK SEARCH and select OK (If a search is executed, it will resolve to an account with ServerName\AppPool Name and SQL will be unable to resolve the account’s SID since it is virtual)
  • User MappingPage>Select Database > Set User IIS APPPOOL\AppPoolName; setDefault Schema> dbOwner
  • Select the defaults for the account and select OK to close dialog
The same can be accomplished using T-SQL:
CREATE LOGIN [IIS APPPOOL\AuthTest] FROM WINDOWS;
CREATE USER AuthTest FOR LOGIN [IIS APPPOOL\AuthTest];
For a remote SQL Server:
  • Open SQL Server Management Studio (SSMS) and connect to the SQL Server.
  • Open the Security folder at the server level and not the security folder for the database.
  • Right click on the logins and select New Login.
  • For the login, type Domain\ServerName$ and DO NOT CLICK SEARCH
  • Select OK
  • Select the defaults for the account and select OK to close dialog
















IIS Hatası 0x80070021







HTTP Hatası 500.19 - Internal Server Error

Sayfayla ilgili yapılandırma verileri geçersiz olduğundan istenen sayfaya erişilemiyor.

Ayrıntılı Hata Bilgileri:

Modül   IIS Web Core
Bildirim   BeginRequest
İşleyici   Henüz belirlenmedi
Hata Kodu   0x80070021
Yapılandırma Hatası   Bu yapılandırma bölümü bu yolda kullanılamaz. Bu durum, bölüm üst düzeyde kilitlendiğinde oluşur. Kilitleme varsayılandır (overrideModeDefault="Deny") ya da overrideMode="Deny" veya eski allowOverride="false" olan bir konum etiketiyle özel olarak ayarlanmıştır.
Yapılandırma Dosyası   \\?\C:\SunWepApi\web.config



Programs and Features > Turn Windows features on or off > Information Information Services > World Wide Web Services > Application Development Features > Select ASP.NET 4.5

15 Eylül 2019 Pazar

Wep Api




ASP.net ve Web API

Bu makalede Web API ve SQL Server kullanarak örnek veritabanı Northwind üzerinden bir uygulama yapacağız. Bir Model ve Controller kısmımız olacak. View’i ise client olarak düşünebiliriz. Amacımız bir kategoriler controller’ı ile kategorileri görüntülemek olacak.

Web API nedir?

Web API bir web servisi teknolojisi, RESTFull bir servisdir.
ASP.net ise Microsoft’un ürettiği bir web geliştirme platformudur.
İçerisinde bir MVC yapısı barındırmaktadır.
Web API teknolojisini kullanarak kullanıcıyla anında iletişime geçebilen Real-Time applicationlar yapabilabilir.

SOA, SOAP ve RESTFull

SOA benzetecek olursak Object Oriented gibi bir yazılım geliştirme yaklaşımıdır.
Service Oriented Architecture olarak kısalttığımız bu yapı bildiğimiz web servisleri içeriyor.
Bu yapının altında SOAP ve Restfull dediğimiz yapılar var.
Gerekli yapıların birbiriyle entegrasyonunu sağlamak için kullanılıyor.
Basit bir şekilde şöyle düşünebiliriz: Projelerde kullandığımız çok katmanlı mimaride business logic katmanı ile data layer’ı ayrı bir proje yaparak bunu web ortamında sunuyoruz.
Client tarafı ise bunlardan bağımsız oluyor. Sonuç olarak client ve web servis tarafını birbirinden ayırıyoruz.
SOAP – Simple Access Object Protocol – Bu yapının belli başlı standartları var.
Güvenlik, performans. WCF .net tarafında kullanılıyor. Tamamen bir XML çıktısı üretiyor.
Bu XML ise aslında envelop tagleri arasında bir header ve body nin bulunduğu bir yapı.
Bununla belli başlı uygulamaları haberleştirebiliyoruz.
Restfull ise daha sonra ortaya çıkan bir teknoloji. Temsili durum transferi (representational state transfer) anlamına geliyor. Çok esnek ve rahat tamamen HTTP protokolüne odaklı. SOAP’da TCP HTTP tercihi yapabilirken burada tamamen HTTP üzerindeyim bunun artısı da web üzerinde çok rahat bir şekilde Web API tarafında kullanabileceğim bir yapı olması oluyor.
Restfull servislerin döndürdüğü veri tipi konusunda katı kuralları yok. İstenilen formatta geri dönüş sağlayabiliyor. Güvenlik anlamında ise birez zayıf o yüzden kendi güvenlik yapılarımızı inşa etmemiz gerekebiliyor. Günümüz teknolojilerinde bunun da daha rahat yolları var.
Servis mimarilerinde kritik nokta platform bağımsız biçimde çalışabilmek. Dönen json data Java’da,PHP’de, .Net de okunabiliyor. JSON web ortamında hızlı javascript’e entegre. Performans açısından boyut çok önemli.
XML:
JSON:
  • Burada name etiketi XML’de iki defa kullanılırken JSON gösteriminde bir defa kullanılıyor dikkat ederseniz.
  • Mobil burada bir diğer kritik noktayı oluşturuyor. Çoğu mobil uygulama servisle haberleşmek durumunda. Servis kullanıldığında Android, iOS olması fark etmiyor.
    Her işimizi JSON objeleriyle görebiliyoruz.
  • Web API performans olarak avantajları arasında caching ve asenkron yapılar yine söz konusu.
  • JSON kullanımına şöyle bir örnek verilebilir: ASP.net 4’de config yapısı XML formatındadır. Artık ASP.net 5’de bu bile JSON’a döndü.
  • Biz de projemiz içerisinde veritabanından çektiğimiz verileri JSON formatında dışarıya servisle açıp yine dışarıdan gelen JSON objelerini database’imize kaydedeceğiz.
  • Proje içerisinde NORTHWND veritabanını kullanacağız. SQL Server ve Northwindveritabanının hazır olması gerekiyor.
  • Management Studio ile veritabanımızı bir kontrol edelim. Daha sonra bu kısımda sıkıntı yaşamak istemiyoruz çünkü.
    • Örneğin servisin aşağıdaki gibi açık olması gerekiyor.

Projenin Oluşturulması

  • File > New > Project diyerek projemizi oluşturmaya başlayalım. Web altında ASP.NET Web Application seçip isim veriyorum.
  • Empty Template altından Web API‘ı açıyorum. Özellikle öğrenirken boş template üzerinden gitmek daha faydalıdır.
  • Bir MVC projesi açıldığında bunun bir tarafında da bir web servisi de host edilebilir. Ama bu çok ihtiyacımız olan bir yapı olmuyor. Ama böyle bir imkan var ihtiyaç olursa.
  • Solution Explorer‘da gördüğünüz gibi MVC’den alışkın olduğumuz Model‘lar Controller‘lar var ama gördüğünüz gibi bir View yok. View kısmı client olarak düşünülebiliriz.
  • Models içerisine Orm ve Dto klasörleri oluşturalım. Entity Framework yapısını Orm klasörünün içerisinde, Data Transfer Objelerimiz olacak Dto’ları da Dto klasörü içerisinde saklayacağız.

Database ve ORM

  • Orm içerisine Add>New Item diyerek Data sekmesi altında ADO.net Data Entity Model ekleyelim. Northwind örnek database’i ile çalışacağız.
  • Gelen pencerede EF Designer from database seçili direk Next diyoruz. New Connection dedik.
  • Server Name kısmına . yazıp Windows Authentication‘u seçelim. Database olarak NORTHWND‘ı seçip onaylayalım.
  • Entity Framework 6.x versiyonunu kullanıyoruz. Yalnızca Tables diyerek tabloları ekleyelim.
  • İşlem tamamlandığında database bağlantısı gerçekleştirilip gerekli ORM yapısı kurulmuş oldu. Artık kodumuzu yazmaya başlayabiliriz.

Controllers Sınıfı

  • Controllers klasörü içerisine yine Add>New Item diyerek bir Web API 2 Controller - Empty controller oluşturalım.
  • Bu controller kategorileri döndürecek. İsim olarak CategoryController verelim. Namespace tanımlamaları altında karşımıza gelen böyle bir yapı oldu:
  • Bunun bir Web Api olmasını sağlayan ApiController class’ının içerisindeki yapılar.
  • Entity’den instance alalım öncelikle. Web.config içerisinde <connectionstrings> altında <add name="NORTHWNDEntities"... ile NORTHWNDEntities olarak gözüküyor. Namespace’imizi ekliyoruz.
1
2
3
4
5
6
7
8
9
10
11
12
using _1110_WebApi.Models.Orm;
 
// ...
 
namespace _1110_WebApi.Controllers
{
    public class CategoryController : ApiController
    {
        NORTHWNDEntities db = new NORTHWNDEntities();
 
    }
}
 
 
 
Bu controller’a kategoriler için gerekli işlemleri yapacak metodları yazacağız. Kategorileri getirmek ile başlayalım. Fakat kategorileri getirecek metodu tanımlamadan önce yapmamız gereken bir şey var.

DTO – Data Transfer Objesi

  • Bir servis kullanıyorsak gerek güvenlik gerekse performans anlamında bir data transfer objesi kullanmalıyız. Örneğin Product class’ına baktığımız zaman çok sayıda property’si olduğunu görüyoruz. Şimdi bu noktada bir servisi dışarıya açarken ben hepsini birden dışarıya açmak istemeyebiliriz. Bu güvenlik açısından işimize gelmeyebilir. Karşı tarafın buna ihtiyacı olmayabilir. Sunucumuzun performansını buna harcamak istemeyebiliriz. Bu noktada da ben bu değerleri bir transfer objesi üzerinden bunları dışarıya açacağız.
  • Bunun için Dto klasörünün içerisine CategoryModel isimli bir class oluşturalım. İçerisine aşağıdaki gibi gerekli propertyleri giriyorum.
  • prop yazıp iki kere tab tuşuna basarsanız daha hızlı eklemeniz mümkündür. Visual Studio içerisinde bunlara snippet denir. ctrl+k ctrl+x yaparak diğer snippetleri görebilirsiniz.
  • Ne yaptık? CategoryModel adında bir Dto ve iki adet property’sini oluşturduk. Şimdi artık dışarıya açacağımız Model’in tipini CategoryModel olarak seçeceğiz.
  • ORM’nin içerisindeki Category class’ı üzerinden değil de CategoryModel class’ı üzerinden veri çıkışını gerçekleştireceğiz.
  • Artık Controller içerisine geri dönebiliriz. CategoryModel’leri barındıran bir list döndürecek aşağıdaki fonksiyonu oluşturalım.
  • Yukarıdaki tanımlanan GetAllCategories bütün kategorileri döndüren bir metod.
  • Bu metod içerisine List<CategoryModel> catlist = db.Categories.ToList(); dersek db.Categories.ToList() ile bütün kategorileri döndürmüş oluyoruz.
  • Bunun yerine ToList() demeden önce buna bir select yaparak CategoryModel tipinde bu listeyi çekeceğiz.
  • İçerisinde DTO’nun KategoriAdi ve Aciklamasi propertylerini databaseden gelen CategoryName ve Description kategorilerine eşleyeceğiz.
  • Bu liste artık bana KategoriAdi ve Aciklamasi databaseden gelen değerlerle dolu bir liste halinde sunulacak.
  • Bu listeyi de return edeceğiz.

XML Yerine JSON ve Route Ayarları

  • Bu aşamada projeyi Build edip çalıştırdığımızda karşımıza çıkan sayfada HTTP Error 403.14 - Forbidden hatası alıyoruz.
  • Fakat /api/category dediğimiz takdirde xml formatında database’imdeki bütün kategorileri dışarıya açmış oldum.

  • Peki burada iki action olsa ne olacaktı? Category altında birden fazla fonksiyon da olabilir.
  • Bu noktada da App_Start altında WebApiConfig.cs içerisinden yapacağımız rootconfig yapılandırması ile beraber action adını da istiyoruz.
  • WebApiConfig.cs içerisinde routeTemplate: "api/{controller}/{id}", satırını routeTemplate: "api/{controller}/{action}/{id}", ile değiştirelim.
  • Artık action adı olan GetAllCategories‘i de URL’e eklememiz gerekecek.
  • /api/category/GetAllCategories dediğimizde yine önceki değerleri görüntülebiliyoruz.
  • Bu noktada az önceki gibi bütün kategorilere rahatlıkla erişebiliyorum ve daha sonra yazacağım ikinci bir metoda da rahatlıkla erişebileceğim.
  • XML yerine JSON döndürmek için yine aynı dosyada // Web API configuration and services diye belirtilmiş kısmın altında,
Yukarıdaki satırı ekleyerek default olarak belirtilen XML yapısını temizlediğim takdirde bu sefer bana JSON döndürecektir.

  • Eğer id’sine göre tek bir kategori döndürmek istiyorsak GetAllCategories dışında yeni bir metod tanımlamamız gerekiyor.
  • Bunun için CategoryController.cs dosyamızı açalım. GetAllCategoriesden sonrasına GetCategoryByID fonksiyonu tanımlayalım.
  • Yeni fonksiyonumuz tek bir kategori döndüreceğinden bildirilmesi public CategoryModel GetCategoryByID(int id) şeklinde olacak.
  • Dışarıdan da parametre olarak id alıyor.
  • Dışarıdan aldığımız bu idye göre de database’den de o id’li kategoriyi yakalayacağız.
Peki bu id nasıl gelecek? Hatırlarsanız WebApiConfig içerisindeki default yapılandırmada bir id vardı:
Buradaki id sayesinde bu id atanacak.
  • Artık /api/category/getCategoryByID/2 diyerek id’si 2 olan kategoriyi döndürebilirim.
  • Burada önemli bir nokta metodun adının başındaki Get‘in request’in tipini belirten bir anahtar kelime olmasıdır.
  • O Geti sileresek metodun get requesti olduğu anlaşılmaz. Örneğin metodu CategoryByID olarak değiştirirsek çalışmayacaktır:
  • Bundan kaçınmanın bir diğer yolu ise metodun başında tipini belirtmektir:
  • Bu şekilde yazdığımızda metodun isminin başında Get yazmasa da çalışacaktır.
  • Özel bir neden yoksa ilk seferdeki gibi metodun isminde belirtmek daha doğru olacaktır.
  • Fiddler, Postman gibi toollarla GET requesti gönderip sonucu inceleyebiliriz.

  • 200 status kodu isteğin (request) başarılı olduğu anlamına gelir.

  • Yukarıda response’u yani sunucunun verdiği cevabı ham haliyle görebiliyoruz. İlk satır status code bilgisi, altındakilerin ise HTTP headerları olduğunu görüyoruz.
    Bu bilgiler gelen verinin künyesi gibi düşünülebilir.

POST Metodu ile Database Insert İşlemi

  • Bu noktaya kadar yalnızca GET metodlarıyla çalıştık. Ama HTTP yalnızca GET metodlarıyla sınırlı değil.
  • POST metodu ile gönderdiğimiz veriyi database’imize kaydetmeyi deneyelim.
  • Northwind içerisinde categories tablosuna bakacak olursak:

  • Bu tablo içerisine kategori ekleyeceğiz. Öncelikle CategoryController.cs dosyamıza bir POST metodu yazalım.
  • Metodun dönüş tipi IHttpActionResult olacak. Bu tamamen arkada asenkron çalışan bir yapıya sahip bir action result tipi.
  • Metodun ismini AddCategory yapalım. Adında bir POST anahtar kelimesi kullanmadığım için attribute olarak üstünde bunun bir POST metodu olduğunu belirtmeliyiz.
İçerisine yazacağımız return statement’da ise return Json(""); gibi bir dönüş yapabiliriz.
Ama bundan ziyade return Ok(); diyebiliriz. Burada ok dediğimiz 200 status kodlu herşey yolunda cevabı oluyor.
Buradan benzer şekilde birçok HTTP word’ünü –NotFound() veya BadRequest() gibi- döndürmek mümkündür.
Fonksiyonumuza parametre olarak ise Dto’da belirttiğimiz CategoryModel tipinde bir nesne veriyoruz.
İçerisinde database ile bağlantı kurulacak bölümü yazmadan önce nesnenin dolu geldiğini görüyor olmam gerekiyor.
Debug modunda fonksiyona breakpoint koyup çalıştırdıktan sonra. Fiddler veya Postman’den aşağıdaki adrese altındaki içeriği gönderelim.
Request’i gerçekleştirirken Content-Type:application/json header’ını da belirtmemiz gerekiyor.
İlgili url’e bir request gerçekleştiğinde uygulamamız bunu yakalayacak.

  • Yukarıda request ile gönderilen verinin başarıyla obje içerisine geçmiş olduğunu görüyoruz.
  • Şimdi gönül rahatlığıyla database’e kaydetme işlemini gerçekleştirebiliriz.
  • Tekrar aynı request’i gönderirek bu sefer veritabanına kaydedildiğini görüyoruz.
  • Böylece temel veritabanı işlemimizi gerçekleştirdik.

Cross Origin (CORS) – Başka Domainden Erişme

  • Geliştirdiğimiz API’ye client tarafından erişmek istediğimizde şöyle bir hata ile karşılaşmamız olasıdır:

  • Bu bir güvenlik mekanizması aslında. API’mize yabancı bir adresten erişilmesi durumunda browser http header’ında bunun için bir izin arıyor. Bu noktada servisten tüm client’ların veri okumasına izin verebiliriz. Böylece yalnız kendi domaininden değil internetteki başka biri de bu bilgiye erişilebilir.
  • Bunu da Web.config dosyası içerisinden <system.webServer> altına şu satırları ekleyerek yapacağız:
  • Artık servisten herhangi bir data get etmek isteyen herkese erişim izni veriyoruz.
  • Buradaki * isteyen herkesin bu dataya erişebilmesi anlamına geliyor.
  • Bu noktada server tarafında gereken işlemleri tamamladık. Artık geriye aşağıdaki gibi bir client aracılığıyla veriyi düzenlemek kalıyor.

  • Client için bir MVC projesi oluşturabilir veya basit bir web sayfası kullanarak ajax ile erişim sağlayabiliriz.
  • Client tarafı bir Android uygulaması da olabilir. Burada önemli olan web api ile bir API oluşturup araya bir katman sokarak bir soyutlama sağlamış olmaktır. Ardından ise bu katmanın güvenliğini sağlamak gerekir.
  • Client kısmını ise bir sonraki yazıda ele alacağız.
  • ASP.net’in sitesine girdiğimizde gerek Web API gerekse MVC konusunda gerekli dökümanlara ulaşabiliriz.
 

MVC LOADING TOO SLOW ISSUE