Özgür Özvarış

Bir yazılımcının kırık dökük dünyası

Unable to load DLL 'SQLite.Interop.dll'

clock Kasım 29, 2016 12:38 by author OzgurOzvaris

Merhaba,

Kaynak :

Unable to load DLL 'SQLite.Interop.dll'

System.Data.SQLite Downloads

Başlıktaki hatanın .net ile Sql lite kullandı iseniz genel olarak karşılaşacağınız bir hata olduğunu düşünüyorum. Bu sorunun çözümü ile ilgili sql lite ınresmi sitesinde yazılan açıklamada Sql.lite dll i ile birlikte x86 ve x64 klasörleri ile gelen interop dll lerininde kurmanız yönünde. Proje çalıştığında dosyaları nereye yığıyorsa (release folder or debug folder) örneğin bu "bin" klasörü olabilir x86 ve x64 folderları ve içindeki interop dll leride orada olmalı.

Resmi sitedeki açıklama şu şekilde özetlenmiş

<bin>\App.exe (optional, managed-only application executable assembly)
<bin>\App.dll (optional, managed-only application library assembly)
<bin>\System.Data.SQLite.dll (required, managed-only core assembly)
<bin>\System.Data.SQLite.Linq.dll (optional, managed-only LINQ assembly)
<bin>\System.Data.SQLite.EF6.dll (optional, managed-only EF6 assembly)
<bin>\x86\SQLite.Interop.dll (required, x86 native interop assembly)
<bin>\x64\SQLite.Interop.dll (required, x64 native interop assembly)

İyi çalışmalar. 

 



Is ambiguous in the namespace

clock Kasım 29, 2016 09:40 by author OzgurOzvaris

Merhaba Arkadaşlar,

Kaynak :

Is ambiguous in the namespace

Ambiguous in the namespace problem

Size tuhaf bir sorundan bahsedeceğim. Vb.net de olduğu söylenen, nereden çıktığı çok belli olmayan ancak basit bir müdehale ile düzeltebileceğiniz bir hata. Bu hatayı düzeltmek için yapamnız gereken tek şey. Web.config dosyasında compliation bölümüne batch="false" eklemeniz.

<compilationdebug="true"batch="false"  strict="false"explicit="true"targetFramework="4.0"batch="false">

Umarım karşılaşmazsınız :) 



Filezilla server amazon aws ayarları

clock Kasım 22, 2016 10:22 by author OzgurOzvaris

Merhaba Arkadaşlar,

Kaynak :

FileZilla FTP to AWS EC2 Windows Server 2012 Instance: Failed to retrieve directory listing

How to enable FTP Passive Mode for Amazon EC2 server with IIS

Amazon aws sanal sunucusunda Filezilla server ile ftp bağlantı yapacaksanız bir kaç aşamaya dikkat etmeniz gerekmektedir.

Not : Windows firewall'u kapatmanız yada filezilla listener'ın windows firewall da düzgün kurulduğundan emin olmanız gerekmektedir. İsterseniz bu basamakları windows firewall kapalı yapıp tekrar sonra windows firewall ayarları düzgünmü diye bakabilirsiniz.

1 - Filezilla yı service olarak kurmanız gerekmektedir.

2 - Filezilla yı settingsten pasif ayarlarına getirip sanal port aralığı belirlemeniz gerekiyor. Bağlantı yapacak client sayısına göre sanal port aralığını (port range) daha açık tutabilirsiniz. 

3- IPv4 bölümünde "Use the following IP" bölümüne makineye rdp ile erişmek için kullandığınız ip yi yazın

 

 

Aşağıdaki USe the Following IP kısmınada internette what is my ip dediğinizde çıkan ip değerini yazın...

 

4 - Windows firewall dan 21 ve ayırdığınız sanal port aralığına inbound izni verin.

 

5 - aws Security groups tan aynı portlara inbound izni verin. Ayrıca 21 nolu portuda inbound izni vermeyi unutmayın...

 

 

6 - File zilla userını ve shared folderını tanımlayın

 

Bu aşamadan sonra client toolunuzla bağlantı deneyebilirsiniz.

aws bağlantısında birde SFTP ile bağlantı ile ilgili dökümanlar mevcut ancak bir türlü bu bağlantı şeklini başaramadım. Belki bir dahaki sefere onuda başarabilirsem paylaşırım. Kendim başaramadım ancak yinede basamak olması için bir url paylaşayım.

 

Connect to Amazon EC2 file directory using Filezilla and SFTP

İyi çalışmalar.

 

 



Sql database'de tablo kolon'u arama

clock Ağustos 31, 2016 15:12 by author OzgurOzvaris

Merhaba arkadaşlar,

Bazen elinize uzunca bir sql geçer ve tabloların kolon adları yazmıyor olabilir bu durumda select bölümündeki kolonların hangi tabloya ait olduğunu anlamakta güçlük çekebilirsiniz. Böyle bir durumda paylaşacağım script aradığınız kolonun hangi tablolarda bulunduğunu listelemekte işinize yarayacaktır.

SELECT
    tabels.name 'Table Name',
    c.name 'Column Name',
    t.Name 'Data type',
    c.max_length 'Max Length',
    c.precision ,
    c.scale ,
    c.is_nullable,
    ISNULL(i.is_primary_key, 0) 'Primary Key'
FROM   
    sys.tables tabels
INNER JOIN    
     sys.columns c ON tabels.object_id = c.object_id
INNER JOIN
    sys.types t ON c.user_type_id = t.user_type_id
LEFT OUTER JOIN
    sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id
LEFT OUTER JOIN
    sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
WHERE
    c.name = 'PACIKLAMA'

 

 İyi çalışmalar.

 

 



Sql tablo listesi alma

clock Ağustos 31, 2016 15:01 by author OzgurOzvaris

Merhaba ,

Basit bir sorgu ile tablo listelerini alabiliryosrunuz?

Select 
   NAME 'Table Name'
from sys.tables

İyi çalışmalar.



Msql foreign key arka planı

clock Haziran 28, 2016 17:11 by author OzgurOzvaris

Merhaba ,

Bu günki yazımızda mssql de foreign key ile ilgili bir kaç script paylayacağım. Öncelikle bu konu nerden çıktı diye düşünebilirsiniz çıkış noktası entityframework (EF) te (Database First) alter table ile değişiklik yapılan bir tablonun EF foreign key (FK) bağlantıları uçtu. Neden uçtuğunu anlamak için EF kün tablo eklerken kullandığı sql cümlelerini  profiler aracalığı ile  incelemek ve süzerek boş dönen sql cümlesini tespit etmek durumuda kaldım. Baştan söyleyim çok zor bir yöntem oldu ancak sonuçta sorunu bulmamı sağladı.

Baştan başlar isek öncelilkle birbiri ile foreign key bağlantısı kuracağımız iki tablo açalım

CREATE TABLE Table_Ttmp 

(
Table_T_ID numeric(12, 0) IDENTITY(1,1),
PRIMARY KEY (Table_T_ID),


)

CREATE TABLE Table_Mtmp 

(
Table_M_ID numeric(12, 0) IDENTITY(1,1),
Table_T_ID numeric(12, 0) NOT NULL,
PRIMARY KEY (Table_M_ID),
--FOREIGN KEY (Table_T_ID) REFERENCES Table_Ttmp ,  

)

Bir foreign key constraint eklemek için standart sql cümlesini çalıştırarak devam edelim. (Yukarıdaki scriptte aslında FK oluşturma ile ilgili satır commentli. Bu satırıda aynı işlemi yapar.)

ALTER TABLE dbo.Table_Mtmp ADD CONSTRAINT
FK_Table_Mtmp_Table_Ttmp FOREIGN KEY
(
Table_M_ID
) REFERENCES dbo.Table_Ttmp
(
Table_T_ID
) ON UPDATE  NO ACTION 
 ON DELETE  NO ACTION

Üçüncü bir FK oluşturma yöntemide Sql Server Management Studio (SQLMS) aracılığı ile tabloda design diyerek ve Relations ları seçerek FK oluşturmak. Burada kaydet demeden oluşturulan scripte bakarsanız yukarıda ki scriptin aynısını oluşturduğunu görecektsiniz

Yukarıdaki üç yöntemden herhabgi biri  ile FK ilişkilsi eklediğinizde MSSQL iki tablo arasında ilişki kuruyor. Yukarıdaki tabloda anlaşıldığı üzere ilişki Table_Mtmp ile Table_Ttmp arasıdına oluşturulmuş durumda. Table_Ttmp Primary key'in olduğu tablo, Table_Mtmp foreign key'in olduğu tablo.

Buraya kadar anlattıklarımız giriş şimdi öğreneceklerimizin alt yapısını oluşturmak içinde. SQLMS ekranlarıyla geldiğimiz aşamayı görelim. 

 

 

Şimdi asıl paylaşacağım aşamalara geldik.

 

SQLMS yukarıdaki bağlantıyı göstebilmek için şimdi paylaştığım sql cümlesini kullanıyor. Bu scriptin düzgün sonuç vermesi için use ile db niniz seçmeniz gerekiyor...

select Fk.name, Fk.object_id, Fk.is_disabled, Fk.is_not_for_replication, Fk.delete_referential_action, Fk.update_referential_action, 
object_name(Fk.parent_object_id) as Fk_table_name, schema_name(Fk.schema_id) as Fk_table_schema, TbR.name as Pk_table_name, 
schema_name(TbR.schema_id) Pk_table_schema, col_name(Fk.parent_object_id, Fk_Cl.parent_column_id) as Fk_col_name, 
col_name(Fk.referenced_object_id, Fk_Cl.referenced_column_id) as Pk_col_name, Fk_Cl.constraint_column_id, Fk.is_not_trusted 
from sys.foreign_keys Fk 
left outer join sys.tables TbR on TbR.object_id = Fk.referenced_object_id 
inner join sys.foreign_key_columns Fk_Cl on Fk_Cl.constraint_object_id = Fk.object_id 

where	Fk.parent_object_id = object_id(N'dbo.Table_Mtmp') or Fk.referenced_object_id = object_id(N'dbo.Table_Mtmp')

 

EF ise bu ilişkiyi almak için başka bir sql script kullanıyor. EF Update Database Model dediğinizde ve yeni bir tablo eklemek istediğinizde yada bir tablodaki güncellemeyi almak için silip tekrar eklediğinizde uzunca birkaç sql cümlesi gönderiyor. Bunlardan birtanesi tablolar arasındaki ilişkiyi çekmek için. 359 satırlık bir sql cümlesi olduğu için onu dosya olarak paylaşıyorum. Bunu paylaşma nedenim bir kaynak olması için. Yoksa satır satır bu sql'in ne yaptığını bende bilmiyorum. Ancak biraz sonra açıklayacağım scriptler bu büyük scriptin içinden işlevselliklerine göre seçilerek elde edildi. 

 EFFullScript.txt (16,72 kb)

 

Bu uzunça scriptin çıktısı yukarıda paylaştığım ekran. Burda belirtilen bilgiler Table_Ttmp diye bir tablonun Table_T_ID primary key alnı ile Table_Mtmp tablosunun Table_M_ID ( Doğru bağlantı tabiki Table_T_ID olması gerekiyordu ama test tablosu olduğu için düzeltmedim) kolonu arasında FK_Table_Mtmp2_Table_T isimli (yukarıda SQLMS da aynı isim var)  [dbo][FK_Table_Mtmp2_Table_T] id li (Bu id name'in DB tarafındaki karşılığı) bir ilişki vardır. Bu satır boş gelirse EF association Model de FK ilişkiyi kuramıyor. Bizde de aynen böyle oldu ve FK SQLMS da gözüktüğü halde EF de gözükmüyordu. Bu nedenle sorunu bulmak için bu uzunca scripti incelemeye almak durumunda kaldık. Buda bizi SQL server FK mantığının derinlerine doğru bir yolculuğa çıkardı. Merak eden buradan sonraki aşamayı takip ederek bu derinliğe bizle birlikte gelebilir.

Öncelikle kısaca fikir edinmek için bu uzun sql cümlesinden birkaç kelime edeyim. Bu sql cümlesinin aslında ilk 358 satırı sabit 359. satır yani "WHERE" ile başlayan satır modelinizdeki tablolara göre dinamik olarak tablo filitreleri oluşturuyor. Kodun daha iyi anlaşılabilmesi için 359. satırdan parametre satırını 360'a valularınıda 361'i satırdan itibaren tablo lara göre enterlı olarak yazdım. Şimdi 361. satırı paylaşıyorum.

@p0=N'K14_abc',@p1=N'dbo',@p2=N'Table_Mtmp',
@p3=N'K14_abc',@p4=N'dbo',@p5=N'Table_Ttmp',
@p6=N'K14_abc',@p7=N'dbo',@p8=N'Table_Mtmp',
@p9=N'K14_abc',@p10=N'dbo',@p11=N'Table_Ttmp'

Görüldüğü gibi burada modele eklediğim başta oluşturduğumuz  Table_Mtmp ve Table_Ttmp satırlarımıza ait tekrar etmiş 4 satır mevcut. Eğer buraya bir 3. tablo daha ekleseydik 360. satırdaki where bölümüne ve parametre value bölümüne bu tablolarda eklenmiş olacaktı ancak ana sql cümlesi değişmeyecekti.  Şimdi gelelim bizim tablolarımızdaki ilişkileri alan sql parçasına. Bu aşamadan sonra paylaşacağım sql scriptler bu 359 satırlık bölümden olacak.

Öncelikle iki tablo arasında FK yı ve FK ilişkisinin temel bilgilerini gösteren ve bu ilişkinin "id" değerini üreten parçayı gösterelim. Bu id bir sonraki script'te ilişkinin detaylarını görmemiz için kullanılacak. Son kısımdaki tablo isimleri parametrelerini değiştirerek bu sorguları istediğiniz  tablo için çalıştırabilirsiniz.

SELECT 
--[Join5].[Ordinal] AS [C1], 
--[UnionAll4].[CatalogName] AS [C2], 
--[UnionAll4].[SchemaName] AS [C3], 
--[UnionAll4].[Name] AS [C4], 
--[Join5].[Name1] AS [C5], 
[UnionAll5].[CatalogName] AS [C6], 
[UnionAll5].[SchemaName] AS [C7], 
[UnionAll5].[Name] AS [C8], 
--[Join5].[Name2] AS [C9], 
[Extent2].[Name] AS [Name], 
[Extent1].[Id] AS [Id]--, 
--CASE WHEN ([Extent1].[DeleteRule] = 'CASCADE') THEN cast(1 as bit) WHEN ([Extent1].[DeleteRule] <> 'CASCADE') THEN cast(0 as bit) END AS [C10]
FROM 

	(SELECT
			quotename(rc.CONSTRAINT_SCHEMA) + quotename(rc.CONSTRAINT_NAME) [Id]
			, CAST(rc.UPDATE_RULE as nvarchar(11)) [UpdateRule]
			, CAST(rc.DELETE_RULE as nvarchar(11)) [DeleteRule]
			FROM
			INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc
		  ) AS [Extent1]
	INNER JOIN (
			SELECT
			quotename(tc.CONSTRAINT_SCHEMA) + quotename(tc.CONSTRAINT_NAME) [Id]
			, quotename(tc.TABLE_SCHEMA) + quotename(tc.TABLE_NAME) [ParentId]
			,   tc.CONSTRAINT_NAME [Name]
			,   tc.CONSTRAINT_TYPE [ConstraintType]
			,   CAST(CASE tc.IS_DEFERRABLE WHEN 'NO' THEN 0 ELSE 1 END as bit) [IsDeferrable]
			,   CAST(CASE tc.INITIALLY_DEFERRED WHEN 'NO' THEN 0 ELSE 1 END as bit) [IsInitiallyDeferred]
			FROM
			INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
			WHERE tc.TABLE_NAME IS NOT NULL
		  ) AS [Extent2] ON [Extent1].[Id] = [Extent2].[Id]


    
	LEFT OUTER JOIN        
	(SELECT 
		3 AS [C1], 
		[Extent13].[Id] AS [Id], 
		[Extent13].[Name] AS [Name], 
		[Extent13].[CatalogName] AS [CatalogName], 
		[Extent13].[SchemaName] AS [SchemaName]
		FROM (
			SELECT
			quotename(TABLE_SCHEMA) + quotename(TABLE_NAME) [Id]
			,   TABLE_CATALOG [CatalogName]
			,   TABLE_SCHEMA [SchemaName]
			,   TABLE_NAME    [Name]
			FROM
			INFORMATION_SCHEMA.TABLES
			WHERE
			TABLE_TYPE = 'BASE TABLE'
		  ) AS [Extent13]
	UNION ALL
		SELECT 
		12 AS [C1], 
		[Extent14].[Id] AS [Id], 
		[Extent14].[Name] AS [Name], 
		[Extent14].[CatalogName] AS [CatalogName], 
		[Extent14].[SchemaName] AS [SchemaName]
		FROM (
			SELECT
			quotename(TABLE_SCHEMA) + quotename(TABLE_NAME) [Id]
			,   TABLE_CATALOG             [CatalogName]
			,   TABLE_SCHEMA              [SchemaName]
			,   TABLE_NAME                [Name]
			,   VIEW_DEFINITION           [ViewDefinition]
			,   CAST( CASE IS_UPDATABLE WHEN 'YES' THEN 1 WHEN 'NO' THEN 0 ELSE 0 END as bit) [IsUpdatable]
			FROM
			INFORMATION_SCHEMA.VIEWS
			WHERE
			NOT (TABLE_SCHEMA = 'dbo'
			AND TABLE_NAME in('syssegments', 'sysconstraints')
			AND SUBSTRING(CAST(SERVERPROPERTY('productversion') as varchar(20)),1,1) = 8)
		  ) AS [Extent14]) AS [UnionAll5] ON (3 = [UnionAll5].[C1]) AND ([Extent2].[ParentId] = [UnionAll5].[Id])
	WHERE 
	(
		
		(
			([UnionAll5].[CatalogName] LIKE '...') AND 
			([UnionAll5].[SchemaName] LIKE 'dbo') AND 
			([UnionAll5].[Name] LIKE 'Table_Mtmp')
		)

		OR 
		(
			([UnionAll5].[CatalogName] LIKE '...') AND 
			([UnionAll5].[SchemaName] LIKE 'dbo') AND 
			([UnionAll5].[Name] LIKE 'Table_Ttmp')
		)
	)

 

Bu scriptin çıktısı şu şekilde olmalı. Eğer Table_Ttmp ninde FK bağlantıları olsaydı onlarda gelecekti

 

 

Şimdi paylaşacaım script ise bu id değerine göre iki tablo arasında hangi kolonlar arasında bu ilişkinin olduğunu gösteriyor

SELECT
[Extent3].[Ordinal] AS [Ordinal], 
0 AS [C1], 
[Extent3].[ConstraintId] AS [ConstraintId], 
6 AS [C2], 
[Extent3].[FromColumnId] AS [FromColumnId], 
6 AS [C3], 
[Extent3].[ToColumnId] AS [ToColumnId]
FROM (
  SELECT
  quotename(FC.CONSTRAINT_SCHEMA) + quotename(FC.CONSTRAINT_NAME) + quotename(cast(FC.ORDINAL_POSITION as nvarchar(30))) [Id]
  ,   quotename(PC.TABLE_SCHEMA) + quotename(PC.TABLE_NAME) + quotename(PC.COLUMN_NAME) [ToColumnId]
  ,   quotename(FC.TABLE_SCHEMA) + quotename(FC.TABLE_NAME) + quotename(FC.COLUMN_NAME) [FromColumnId]
  ,   quotename(FC.CONSTRAINT_SCHEMA) + quotename(FC.CONSTRAINT_NAME) [ConstraintId]
  ,   FC.ORDINAL_POSITION [Ordinal]
  FROM 
	INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC 
	  INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS PC /* PRIMARY KEY COLS*/ ON       
		RC.UNIQUE_CONSTRAINT_SCHEMA = PC.CONSTRAINT_SCHEMA  
		AND      RC.UNIQUE_CONSTRAINT_NAME    = PC.CONSTRAINT_NAME
      INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS FC /* FOREIGN KEY COLS*/ ON       
		RC.CONSTRAINT_SCHEMA = FC.CONSTRAINT_SCHEMA         
		AND      RC.CONSTRAINT_NAME    = FC.CONSTRAINT_NAME 
		AND   PC.ORDINAL_POSITION = FC.ORDINAL_POSITION
) AS [Extent3]

where ('[dbo][FK_Table_Mtmp2_Table_T]' = [ConstraintId])

 

Çıktısı şu şekilde olmalı

 

 

Yukarıdaki çıktıdan anlaşıldığı üzere FromColumnId de gözüken Table_Mtmp tablosunun Table_M_ID kolonu ile ToColumnId de gözüken Table_Ttmp ve Table_T_ID arasında [dbo][FK_Table_Mtmp2_Table_T] idli bir bağlantı bulunmaktadır. Eğer bu satır boş gelirse EF FK ilişkisini (association) kuramıyor.

Aslında amacımıza ulaştık iki tablo arasında ilişkiyi gördük. Ama asıl çözüm sağlayan adım burada başlıyor. Burada satır boş gelirse sorunu nasıl anlayacağız. Çünkü bizde ilişki olduğu halde satır burada boş geliyordu. İşte onun tahlilinide bu script içinden aldığım son script ile paylaşarak yapacağız.

Select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where '[dbo][FK_Table_Mtmp2_Table_T]' =  quotename(CONSTRAINT_SCHEMA) + quotename(CONSTRAINT_NAME) 
Select * from INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS where CONSTRAINT_SCHEMA = 'dbo' AND CONSTRAINT_NAME = 'FK_Table_Mtmp2_Table_T'
Select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where CONSTRAINT_SCHEMA = 'dbo' AND CONSTRAINT_NAME = 'PK__Table_Tt__96E7C6DB2B803210'

Ekran Çıktısı

  

Burada artık bu FK ilişkisinin hangi Constraint Name ler ile hangi tablolar arasında kurulduğu net olarak gözüküyor. Scripteki birinci tablo FK sahibi olan Table_Mtmp tablosun ait, ikinci satır PK (Primary key) tablosu ile ilikiliyi kurulan PK ya ait contraint'in isminin saklandığı UNIQUE_CONSTRAINT_NAME kolonunu içeriyor. Üçüncü satır aslında birinci satırla aynı KEY_COLUMN_USAGE Information Schemasına bakıyor ancak artık PK ya ait olan constraint name le bakıyor.

Bizim sorun neydi bari onuda söyliyeyim :) İşte 2 Satırda aldığımız  UNIQUE_CONSTRAINT_NAME PK Contraint name i üçüncü satırda where cümlesine konulunca boş geliyordu. Sebebi meğerse aynı PK değeri üzerinde aynı özelliklere sahip bir index tanımlanmış ve bağlantı PK Contraint Key'i ile değilde bu index ile kurulmuş. O index ise  KEY_COLUMN_USAGE Information Schemasında gözükmediği için EF FK ilişkisini kuramıyordu. O index'i sildik sorun çözüldü. Artık son scriptteki 3 satırda dolu gelmeye başladı :)

 

İyi çalışmalar.



Windows 7 80 nolu port listening stop etme PID 4 problemi

clock Haziran 8, 2016 16:42 by author OzgurOzvaris

Merhaba,

kaynaklar

http://stackoverflow.com/questions/1430141/port-80-is-being-used-by-system-pid-4-what-is-that

https://www.devside.net/wamp-server/opening-up-port-80-for-apache-to-use-on-windows 

Öcelikle IIS ve Servislerde IIS Admin Servicesi kapatmanız gerekmektedir.

Daha sonra varsa skype

daha sonra Winmdows Remote management servisi

daha sonra Web Deployment Agent Service

Windows 7 de iis'i kapasanızda 80 nolu portun dinlenmeye devam ederse.

Bu portu kimin dinlediğini görmek için öncelikle bunun için aşağıdaki nestat komut setinin kullanmanız gerekiyor.

netstat -o -n -a | findstr 0.0.0.0:80 

Eğer satır geliyor son kolonda 4 gözüküyorsa

İyi çalışmalar.

 



Basit SignalR uygulaması - 2 Server to Client

clock Mart 4, 2016 17:40 by author OzgurOzvaris

Merhaba Arkadaşlar,

Geçen gün ki çalışmamızda n client'ın birbiri ile signalr ile haberleşmesini dair basit bir mvc3 uygulaması gördük

Basit SignalR uygulaması - 1 Client to Client .

Bu gün ise dışarıya açık bir webapi yazacağız ve 3. party bir uygulama be web api aracılığı ile clientlarımıza mesaj gönderecek. Biz kendi uygulamamızda santral uygulamasının web api aracılığı ile client'larımıza çalan telefona göre pencere açması için bu yöntemi kullandık. Sizlerde istediğiniz benzer amaçlar için kullanabilirsiniz.

Kaynaklar,

How to create Web API using MVC 3.0

Routing with Multiple Parameters using ASP.NET MVC

Örnek projemizin kaynak kodu SignalRSample.zip (9,18 mb) (vs 2010 mvc 3)

Öncelikle bir nuget paketi yüklemelisiniz

Install-Package Microsoft.AspNet.WebApi -Version 4.0.30506

Ardından global.asax a bir route satırı eklemek geliyor. !Beni biraz uğraştırdı. Bu route satırının diğer route satırlarının üstüne eklemenizi tavsiye ederim. Aksi taktirde çalışmayabilir. ! 

using System.Web.Http;
routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new {id = RouteParameter.Optional}
                );

Artık yazacağımız web api'ye http://sitename/api/ApiName?paramaters şeklinde erişebiliriz. 

Şimdi geçen uygulamamızda geliştirdirdiğimiz uygulamamızdaki client lara mesaj gönderen bir örnek api uygulaması yazalım.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;

namespace SignalRSample.Controllers
{
    /// <summary>
    /// http://stackoverflow.com/questions/11472920/send-signalr-message-from-server-to-all-clients
    /// http://stackoverflow.com/questions/21519911/how-to-create-web-api-using-mvc-3-0
    /// http://stackoverflow.com/questions/2246481/routing-with-multiple-parameters-using-asp-net-mvc
    /// 3. nolu global.asax route basamağını diğer routların üstüne yazmayınca çalışmadı
    /// </summary>
    public class ValuesController : ApiController
    {

        public string Get(string id, string Message)
        {
            SignalRHost.OpenPopUp(id, Message);
            return "1";
        }

    }
}

Şimdi uygulamamızı çalıştıralım.ve client id olarak 1 Set edelim

test apimizi adres bardan çağıralım.

http://localhost:50995/api/Values?id=1&message=Merhaba%20D%C3%BCnya

Eğer sorunsuz bir şekilde basamakları uyguladı iseniz. Ekranda merhaba dünya mesajını görmüş olmanız gerekiyor.

 

Örnek projemizin kaynak kodu SignalRSample.zip (9,18 mb) (vs 2010 mvc 3)

İyi çalışmalar.

 

 



Basit SignalR uygulaması - 1 Client to Client

clock Mart 4, 2016 11:37 by author OzgurOzvaris

Merhaba,

Web yazılımlarında bazen client'lar ın birbiri ile etkileşim içinde olması yada serverdan bazı clientlara yada tamamına mesajlar göndermeniz gerekebilir. Bir çok benzer senearyado signalR güzel bir mesajlaşma imkanı sağlıyor.

Burada örneklerde paylaşacağım signalR uygulaması signalR 1.0 örnekleridir. yinede 2.0 için size yol gösterecektir.

Kaynaklar 

ASP.NET SignalR

Örnek projemizin kaynak kodu SignalRSample.zip (9,18 mb) (vs 2010 mvc 3)

Öncelikle SignalR yi sisteme kurmanız gerekiyor bunun için iki yol var.

1. Yol : Nuget Console üzerinden Install-Package Microsoft.AspNet.SignalR

2. Yol : Manuel kurulum

SignalR sayfasından indiriyoruz.

Dll lerini referans'a ekliyoruz.

 

global.asax Application_Start'a 

RouteTable.Routes.MapHubs() satırını ekliyoruz (bu satır eklenmezse biraz sonra javascript bölümüne ekleyeceğimiz otomatik oluşan signalr/hubs scripti oluşturulmuyor)

Web.config

<validation validateIntegratedModeConfiguration="false" />

<modules runAllManagedModulesForAllRequests="true"/>

satırları olmalı. (Zaten default olarak bu şekilde...)

Javascript

SignalR çalıştırmak istediğiniz sayfaya

<script type="text/javascript" src="@Url.Content("~/Scripts/jquery-ui-1.9.2.blue/js/jquery-1.8.3.js")" ></script>

<script type="text/javascript" src="@Url.Content("~/Scripts/jquery.signalR-1.0.0-rc2.min.js")"></script>

<!--Reference the autogenerated SignalR hub script. -->

<script type="text/javascript" src="/signalr/hubs"></script>

javascript dosyalarını referans göstermeniz gerekiyor. jquery daha yüksek olabilir ancak 1.5 gibi versiyonlarda hata alıyorsunuz. Buna dikkat edin.

Şimdi yapmamız gereken basit mvc tabanlı bir SinalR uygulaması. Boş mv3 projesi oluşturalım.

Önce mesaj alıp vermede kullanmak için bir SignalRHost Class'ı oluşturuyoruz.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.AspNet.SignalR.Hubs;
using Microsoft.AspNet.SignalR.Transports;
using Microsoft.AspNet.SignalR.Infrastructure;
using Microsoft.AspNet.SignalR;
using System.Threading.Tasks;
using System.Timers;

namespace CCMWeb1_0
{
    [HubName("CCMainSRHub")]
    public class SignalRHost : Hub
    {

        /// <summary>
        /// http://stackoverflow.com/questions/14439389/sending-json-with-signalr
        /// </summary>
        /// <param name="name"></param>
        /// <param name="message"></param>
        public void Send(string ClientID, string MessageType, string Message)
        {
            // Call the broadcastMessage method to update clients.
            Clients.All.broadcastMessage(ClientID, MessageType, Message);

        }

        public static void OpenPopUp(string ClientID)
        {
            IHubContext context = GlobalHost.ConnectionManager.GetHubContext<SignalRHost>();
            context.Clients.All.broadcastMessage(ClientID, "OpenPopUp", "OK");
        }
    }
}

 Views->Home->Index.chtml içine bir kaç java script fonksyonu ekliyoruz.

@{
    ViewBag.Title = "Home Page";
}
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery-ui-1.9.2.blue/js/jquery-1.8.3.js")" ></script>
<script type="text/javascript" src="@Url.Content("~/Scripts/jquery.signalR-1.0.0-rc2.min.js")"></script>
<!--Reference the autogenerated SignalR hub script. -->
<script type="text/javascript" src="/signalr/hubs"></script>
<script type="text/javascript">
    var $lib = {};
</script>
<script type="text/javascript">
    $(document).ready(function() {

    });

    //Client'ın kendine özel id'sini set ediyor
    function SetID() {



        $("#hdnConnectionID").val($("#txtConnectionID").val());

        $("#lblConnection_ID").text($("#txtConnectionID").val());

        $lib.ClientID = $("#txtConnectionID").val();

        //alert($("#hdnConnectionID").val());

    }

    $(function () {
        // Declare a proxy to reference the hub. 
        //var CCMainSR = $.connection.CCMainSRHub;


        // Create a function that the hub can call to broadcast messages.
        //Serverdan gelen mesajları alıp yönetiyor
        $.connection.CCMainSRHub.client.broadcastMessage =
        function (pClientID, MessageType, Message) {



            if (pClientID == $lib.ClientID || pClientID == "All" || pClientID == "all") {
                //alert(pClientID);
                //alert(Message);
                $('#txtReceivedMessage').val($('#txtReceivedMessage').val() + Message + "\n");

            }

        };


        //Bu satır önemli...
        $.connection.hub.start().done(function () { });
    });

    //Server'a clientlara gönderilmek üzere mesaj gönderiyor
    function SendSignalR(ClientID, MessageType, Message) {
        if (ClientID == "") {
            alert("Have to Enter Receiver ID");
            return;

        }

        
        
        $.connection.CCMainSRHub.server.send(ClientID, MessageType, Message);
    }

</script>

<h2>@ViewBag.Message</h2>
<p>
    <input type="hidden" id="hdnConnectionID"/>
    <table>
        <tr>
            <td>
                <span >Connection ID</span>
            </td>
            <td>
                <span id="lblConnection_ID">0</span>
            </td>
        </tr>
        <tr>
            <td>
                <span >Set Connection ID</span>
            </td>
            <td>
                <input type="text" id="txtConnectionID"/>
            </td> 
            <td> <input type="button" onclick="SetID();" value="SetID"/></td>
        </tr> 
        <tr>
            <td>
                <span >Receivers ID (multiple user sperate with comma , )</span>
            </td>
            <td>
                <input type="text" id="txtReceiver"/>  <span >Set value "All" to send all user</span>
            </td> 
            <td> </td>
        </tr>
        <tr>
            <td>
                <span >Message</span>
            </td>
            <td>
                <input type="text" id="txtMessage"/>
            </td> 
            <td> <input type="button" onclick="SendSignalR($('#txtReceiver').val(),'Test',$('#txtMessage').val());" value="Send Message"/></td>
        </tr>
        
        <tr>
            <td>
                <span >Recived Messages</span>
            </td>
            <td colspan="3">
                <textarea id="txtReceivedMessage" cols="40" rows="5" style="width:500px; height:250px;" ></textarea>    
                
            </td> 
            
        </tr>
    </table>
    
    
</p>

Afiyetle artık basit bir chat signalR uygulamanız oldu.

Set Client ID diyerek istediğiniz kadar client ekranı browserda açabilirsiniz. Mesaj göndermek istediğini client'ın id sini yazarak yada All diyerek bütün client lara mesaj gönderebilirsiniz.

Örnek projemizin kaynak kodu SignalRSample.zip (9,18 mb) (vs 2010 mvc 3)

İsterseniz bu yapıya bir de web api ekleyerek bir sonraki projede bağımsız bir merkezden clientlarımıza mesaj gönderelim ne dersiniz?

Görüşmek üzere.

 

 

 



Google chrome browser faydalı/useful add on lar

clock Mart 2, 2016 12:10 by author OzgurOzvaris

Merhaba Arkadaşlar,

Bu gün sizlerle soap ve json view da ta kullandığım bir kaç tool'u paylaşacağım.

1 - Wizdler : erişmek istediğiniz ve test etmek istediğiniz web servis metodları için web servisin wsdl dökümanını çağırıyorsuz. Örneğin : http://xxx.asmx?wsdl diyorsuzu ve adres barın sağ tarafında heme iconu beliriyor tıkladığınızda bu wsdl içindeki metodları listeliyor ve seçtiğiniz metod ile ilgili bir template soap xml üretiyor. İsterseniz bu template xml'in içinde veri girerek test edebileceğiniz gibi isterseniz hazır soap xml'iniz buraya kopyalayıp kullanabilirsiniz. Sonra go buttonuna basmanız yeterli soap cümlenizin cevabı response tabına dolacaktır.

Not : bazen soap xml lerinizin yazılması birbirine girmiş olabilir bunu temizleme işlemine internette xml cleaner deniyor. Size bu temizleme işlemi için  http://www.freeformatter.com/'ı tavsiye edebilirim. Bu sitede arar ara ihtiyaç olan xml decode encode işlemi yapan http://www.freeformatter.com/xml-escape.html paylaştığım linkide kullanabilirsiniz. 

2 - ModHeader : Bazen karşı tarafa göndermek istediğiniz soapların header'ına bazı özel taglar yamak isteyebilirizsiniz. Örneğin sıkıştırılmış olarak cevabımı ver gibi. Bu durumda ModHeader sizin requestlerinize header eklemenize yardımcı olacaktır.

3 - JSONView : internet üzerinde json veri dönen bir web servisin json'unu hiyerarşik olarak görmenizi sağlar

4 - Save my Tabs : bu addon teknik amaçlı değil ama faydalı bulduğum için yazıyorum. Mevcut Tablarınızı düzgün olarak kayıt etmenizi sağlıyor.

 

Herkese İyi çalışmalar.



Hakkımızda  AboneOl 

Blog Yayınımıza Hoşgeldiniz.

Month List

RecentPosts

Sign In