2012-03-21 3 views
1

모바일 응용 프로그램에서 호출되는 SQL Server 데이터베이스에 연결된 WCF 서비스가 있습니다. 나는 예약을 만드는 데 도움이되는 다음과 같은 방법을 가지고있다.WCF 게시 메서드 구현

public void CreateBooking(Booking booking) 
    { 
     Booking newbooking = new Booking(); 
     sql = new SqlConnection("Data Source=comp;Initial Catalog=BookingDB;Integrated Security=True"); 
     sql.Open(); 

     string command = 
      ("INSERT INTO Bookings(BookingName, BookingStart, BookingEnd, RoomID) " + 
      "VALUES (" 
       + "'" + booking.BookingName + "'" + ", " 
       + "'" + booking.BookingStart + "'" + ", " 
       + "'" + booking.BookingEnd + "'" + ", " 
         + booking.RoomID + ")"); 

     SqlCommand cmd = new SqlCommand(command, sql);     
     cmd.ExecuteNonQuery();    
    } 

    public void Close() 
    { 
     sql.Close(); 
    } 

마크 업 :

<%@ ServiceHost Language="C#" Debug="true" Service="BookingServices.BookingService" CodeBehind="BookingService.svc.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %> 

구성 파일 :

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.web> 
    <!--<authentication mode="None"/>--> 
    <compilation debug="true" targetFramework="4.0"> 
     <assemblies> 
     <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> 
     </assemblies> 
    </compilation> 
    </system.web> 
    <system.serviceModel> 
<services> 
    <service name="RoomBookingServices.RoomBookingService" behaviorConfiguration="RoomBookingServiceBehaviour"> 
    <endpoint address="http://192.168.0.4:6321/RoomBookingServices/RoomBookingService.svc" binding="webHttpBinding" bindingConfiguration="webHttpBindingWithJsonP" contract="RoomBookingServices.IRoomBookingService" behaviorConfiguration="webHttpBehavior"> 
     <identity> 
     <servicePrincipalName value=""/> 
     </identity> 
    </endpoint> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="RoomBookingServiceBehaviour"> 
     <!-- To avoid disclosing metadata information, 
     set the value below to false and remove the metadata endpoint above before deployment --> 
     <serviceMetadata httpGetEnabled="true" /> 
     <!-- To receive exception details in faults for debugging purposes, set the value below to true. 
     Set to false before deployment to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
    </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="webHttpBehavior"> 
     <webHttp /> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 
<bindings> 
    <webHttpBinding> 
    <binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true"></binding> 
    </webHttpBinding> 
</bindings> 
<!--<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />--> 
<!--<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />--> 
    </system.serviceModel> 
    <system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
    </system.webServer> 
    <connectionStrings> 
    <add name="RoomBookingDatabaseEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=HAL;initial catalog=RoomBookingDatabase;integrated security=True;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 
    <add name="RoomBookingDatabaseEntities1" connectionString="metadata=res://*/RoomBookingDB.csdl|res://*/RoomBookingDB.ssdl|res://*/RoomBookingDB.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=HAL;initial catalog=RoomBookingDatabase;integrated security=True;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 
    </connectionStrings> 
</configuration> 

인터페이스 :

[OperationContract(Name="postmethod")] 
    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, UriTemplate = "postmethod/new")] 

    void CreateBooking(Booking booking); 
} 

예약 클래스 :

그러나 내가이 메소드를 호출 할 때마다 405 오류가 발생합니다. 내 질문은 위의 오류가 발생하는 방법입니다 또는 뭔가의 연결 끝에 무엇입니까? 감사.

+0

구성 파일과 서비스 인터페이스를 게시 할 수 있습니까? 서비스 RESTful 또는 SOAP 서비스 – Rajesh

+0

안녕하세요 Rajesh, 기본 질문에 구성 및 인터페이스를 업로드했습니다. 감사! – moikey

+0

예약 클래스의 스켈레톤도 문제가없는 경우 게시 할 수 있습니까? – Rajesh

답변

2

나는 위의 시나리오를 시도하고 다음과 같이 몇 가지 변경과 내가 작업을 가지고 : 당신은 그냥 단지 1을 가지고 당신은 WrappedRequest 설정을 제거 할 수 있습니다

[OperationContract] 
     [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, UriTemplate = "postmethod/new")] 
     Booking CreateBooking(Booking booking); 

param.

POST http://localhost/SampleApp/Service1.svc/postmethod/new HTTP/1.1 
Content-Type: application/json 
Host: localhost 
Content-Length: 144 
Expect: 100-continue 

{"BookingEnd":"\/Date(1332420656202+0000)\/","BookingID":1,"BookingName":"client sent","BookingStart":"\/Date(1332334256202+0000)\/","RoomID":2} 

당신은뿐만 아니라 OperationContract를에서 이름 속성을 제거 할 수 있습니다 내가 아래에 요청 Fidder에서 POST를 수행 할 때

나는 성공적인 응답을 얻을. IIS에서 호스팅하는 경우 IIS에서 주소를 할당하면 주소가 비어있을 수 있습니다.

+0

Rajesh, 정말 고마워,이게 나를 도와 줬어! – moikey

2

당신이 비어 있거나 상대 주소 중 하나를해야하므로 IIS에서 호스트로 address 속성이 .svc 파일 위치로부터 추론되는 IIS에서 WCF 서비스 호스팅 :

<service name="RoomBookingServices.RoomBookingService" behaviorConfiguration="RoomBookingServiceBehaviour"> 
    <endpoint 
     address="" 
     binding="webHttpBinding" 
     bindingConfiguration="webHttpBindingWithJsonP" 
     contract="RoomBookingServices.IRoomBookingService" 
     behaviorConfiguration="webHttpBehavior"> 
    </endpoint> 
</service> 

기본 주소가됩니다 IIS와 응용 프로그램을 호스팅하는 사이트에서 제공해야합니다. 따라서 IIS에서 호스트되는 파일 RoomBookingService.svc의 위치를 ​​가리 킵니다.

또한 다음 코드를 보면 :

string command = 
     ("INSERT INTO Bookings(BookingName, BookingStart, BookingEnd, RoomID) " + 
     "VALUES (" 
      + "'" + booking.BookingName + "'" + ", " 
      + "'" + booking.BookingStart + "'" + ", " 
      + "'" + booking.BookingEnd + "'" + ", " 
        + booking.RoomID + ")"); 

SqlCommand cmd = new SqlCommand(command, sql); 

내 눈을 피가 시작합니다. 그런 코드는 절대로 쓰지 말아야한다. SQL을 다룰 때 항상 매개 변수화 된 쿼리를 사용하십시오. 귀하의 코드는 SQL injection에 취약합니다.

그래서

:

public void CreateBooking(Booking booking) 
{ 
    using (var conn = new SqlConnection("Data Source=comp;Initial Catalog=BookingDB;Integrated Security=True")) 
    using (var cmd = conn.CreateCommand()) 
    { 
     conn.Open(); 
     cmd.CommandText = 
     @"INSERT INTO 
      Bookings(BookingName, BookingStart, BookingEnd, RoomID) 
      VALUES (@BookingName, @BookingStart, @BookingEnd, @RoomID)"; 

     cmd.Parameters.AddWithValue("@BookingName", booking.BookingName); 
     cmd.Parameters.AddWithValue("@BookingStart", booking.BookingStart); 
     cmd.Parameters.AddWithValue("@BookingEnd", booking.BookingEnd); 
     cmd.Parameters.AddWithValue("@RoomID", booking.RoomID); 
     cmd.ExecuteNonQuery(); 
    } 
} 

을 그리고 지금 당신은이 서비스를 호출 할 수있다. jQuery를 AJAX를 사용하여 예를 들어 :

$.ajax({ 
    url: '/RoomBookingService.svc/postmethod/new', 
    type: 'POST', 
    contentType: 'application/json', 
    data: JSON.stringify({ 
     booking: { 
      BookingID: 1, 
      BookingName: 'bn', 
      BookingStart: '/Date(1232739449000+0000)/', 
      BookingEnd: '/Date(1232776449000+0000)/', 
      RoomID: 2 
     } 
    }), 
    success: function (result) { 

    } 
}); 
+0

안녕하세요 대린, 팁 주셔서 감사합니다. 이것은 나에게 모두 새로운 것이므로 이런 것들을 배우는 것이 좋습니다! 감사. – moikey