为数据库操作构建WCF服务

时间:2016-08-07 15:13:13

标签: javascript c# sql database wcf

  1. 我们在某个服务器上有一个数据库:database1.mdf位于http://someserver.com

  2. 我们需要使用控制台自动托管来构建一个WCF服务(在C#上),该服务将连接到该远程数据库并提供一些功能,例如:读取记录,插入新记录,执行“选择”查询等。

  3. 最后,我们需要编写将与该WCF服务进行通信的客户端页面(在JavaScript上),并向客户端提供信息。

  4. 我是这个问题的新手,已经发现了很多信息,但是使用了很多不同的技术,框架,参考资料等,一切似乎都太复杂了。我想要一个非常基本但强大的解决方案,可以是完成必要的MVS工具。所以任何帮助都会受到赞赏。

    这就是我已经完成的事情:

    1. 可以从URL访问数据库:http://someserver.com/database1.mdf例如,'someserver'可以是localhost。

    2. 我使用控制台自动托管构建了一个基本的WCF服务。该计划如下:

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Threading.Tasks;
      using System.ServiceModel;
      using System.ServiceModel.Description;    
      using System.Data.SqlClient;
      using System.Data;
      
      namespace hostWCF
      {
          class Program
          {
              static void Main(string[] args)
              {
                  ServiceHost myServiceHost = null;
                  try
                  {
                      Uri httpBaseAddress = new Uri("http://localhost:4321/myService");
      
                      myServiceHost = new ServiceHost(typeof(myService.myService), httpBaseAddress);
                      myServiceHost.AddServiceEndpoint(typeof(myService.ImyService), new WSHttpBinding(), "");            
      
                      ServiceMetadataBehavior serviceBehavior = new ServiceMetadataBehavior();
                      serviceBehavior.HttpGetEnabled = true;
                      myServiceHost.Description.Behaviors.Add(serviceBehavior);
      
                      myServiceHost.Open();
      
                      Console.WriteLine("myService was launched at: {0}", httpBaseAddress);
                      Console.WriteLine();        
      
                      // DO WE NEED TO MAKE A CONNECTION WITH DATABASE HERE?           
      
                      Console.ReadKey();                
                  }
      
                  catch (Exception ex)
                  {
                      myServiceHost = null;
                      Console.WriteLine("myService has faced a problem:  " + ex.Message);
                      Console.ReadKey();
                  }
              }
          }
      }
      
    3. 启动服务后如何连接到远程数据库?或者通过将连接过程放入ImyService [OperationContract]来制作像服务函数这样的连接过程更好吗? Maby最好不要及时保持连接,但只有在客户端与数据库通信时才打开它?那么,如何提供将对数据库执行查询的方法?最后,如何编写一个代理类,将JSON格式的数据发送到客户端页面?

      http://www.topwcftutorials.net/2015/04/create-wcf-data-service.html

      http://www.c-sharpcorner.com/UploadFile/rohatash/inserting-data-into-database-using-wcf-service/

      我发现两个教程非常有用(第一个数据库方法和第二个数据库方法),但我不想使用ASP.NET Web应用程序(如第一个)。所以我想知道如何将基于* .svc的WFC数据服务添加到解决方案中,就像第二个一样。可以使用代码向主机添加服务引用(因为只有在主机运行时才能找到服务。 。),MVS'添加服务参考......'看不到它。

      更新:

      我走了一步。现在,我的WCF控制台宿主应用程序看起来非常简单,只有本地数据库。

      using System;
      using System.ServiceModel;
      using System.Data;
      using System.Data.SqlClient;
      
      namespace demoWCFHost
      {
          public class Program
          {
              public static void Main()
              {
              BasicHttpBinding binding = new BasicHttpBinding();
              binding.Name = "binding1";
              Uri baseAddress = new Uri(@"http://localhost:8000/service1");
      
              ServiceHost serviceHost = new ServiceHost(typeof(Service1), baseAddress);
              serviceHost.AddServiceEndpoint(typeof(IService1), binding, baseAddress);
      
              serviceHost.Open();
      
              Console.WriteLine("The service is ready.");
              Console.WriteLine("Press <ENTER> to terminate service.");
              Console.WriteLine(); 
              Console.ReadLine();
      
              serviceHost.Close();
              }
          }
      
          [ServiceContract]
          public interface IService1
          {
              [OperationContract]
              string DoWork();
          }
      
          [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
          public class Service1 : IService1
          {
              public string DoWork()
              {
                  Console.WriteLine("DoWork() method was called");
      
                  string connectionString = @"data source=(LocalDB)\v11.0;attachdbfilename=|DataDirectory|\database1.mdf;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework";
      
                  using (SqlConnection connection = new SqlConnection(connectionString))
                  {
                      connection.Open();
      
                      Console.WriteLine("database is connected");
                      Console.WriteLine();
      
                      string response = String.Empty;
      
                      using (SqlCommand command = new SqlCommand("SELECT * FROM table", connection))
                      {
                          using (SqlDataReader reader = command.ExecuteReader())
                          {
                              while (reader.Read())
                              {
                                  for (int i = 0; i < reader.FieldCount; i++)
                                  {
                                      response += reader.GetValue(i);
                                  }
                              }
                          }
                      }
      
                      connection.Close();
      
                      Console.WriteLine("database is disconnected");
                      Console.WriteLine();
      
                      return response;
                  }
              }
          }
      }
      

      它处理一个DoWork()方法,它返回数据库中的所有记录。 现在我试图从JavaScript页面调用它:

      <html>
      <head>
          <script language="javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script>
      </head>
      <body>
          <div id="results"></div>
          <script language="javascript">
              $(
                  function () {
                      $.ajax( {
                        type: 'POST',
                        url:  'http://localhost:8000/service1',
                        data: '<'+'soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">'+
                                    '<'+'soap:Body>'+
                                      '<'+'DoWork xmlns="http://tempuri.org/">'+
                                      '<'+'/DoWork>'+
                                    '<'+'/soap:Body>'+
                                  '<'+'/soap:Envelope>',
                        success: function (data, textStatus, xhr) {
                                $('#results').html(escape(xhr.responseText));
                        },
                        dataType: 'xml'
                      });
              });
          </script>
      </body>
      </html>
      

      但它落在:

      POST http://localhost:8000/service1           jquery.min.js:140
      ajax                                  @ jquery.min.js:140
      (anonymous function)                  @ (index):52
      ready                                 @ jquery.min.js:28
      t                                     @ jquery.min.js:36
      
      (index):1 
      XMLHttpRequest cannot load http://localhost:8000/service1. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access. The response had HTTP status code 415.
      

      有关如何修复的任何想法?此外,我们仍然需要使数据库连接远程而不是本地...

0 个答案:

没有答案