2012-03-21 4 views
1

У меня есть служба WCF, которая подключена к базе данных SQL Server, которая вызывается из мобильного приложения. У меня есть следующий метод, который помогает создавать заказы.реализация метода WCF post

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(); 
    } 

Markup:

<%@ 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); 
} 

Класс бронирования:

[DataContract] 
public class Booking 
{ 
    [DataMember] 
    public int BookingID { get; set; } 

    [DataMember] 
    public string BookingName { get; set; } 

    [DataMember] 
    public DateTime BookingStart { get; set; } 

    [DataMember] 
    public DateTime BookingEnd { get; set; } 

    [DataMember] 
    public int RoomID { get; set; } 

} 

Однако, когда я вызываю метод, я получаю ошибку 405. Мой вопрос в том, является ли метод выше причиной ошибки или это что-то в конце концов? Благодарю.

+0

Можете ли вы разместить свой конфигурационный файл и интерфейс службы. Является ли ваша служба RESTful или SOAP – Rajesh

+0

Привет, Раджеш, я загрузил конфигурацию и интерфейс в главный вопрос. Благодаря! – moikey

+0

Можете ли вы разместить скелет для своего класса бронирования, если это не проблема? – Rajesh

ответ

2

Я попытался выше сценарий и с некоторыми изменениями я получил это работает, как показано ниже:

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

Вы можете удалить WrappedRequest настройки, как вы только что есть только 1 пары.

Когда я выполнить POST из Fidder с ниже запроса я получить успешный ответ:

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, а также. Если вы размещаете в IIS, тогда адрес может быть пустым, поскольку адрес присваивается IIS.

+0

Раджеш, большое вам спасибо, это помогло мне! – moikey

2

Когда вы хостинг службы WCF в IIS атрибут address выводится из места в файл .svc, размещенные в IIS, так что должно быть пустым или относительный адрес:

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

Базовый адрес будет предоставляться IIS и сайтом, на котором вы размещаете свое приложение. Поэтому он укажет на местоположение файла RoomBookingService.svc, размещенного в IIS.

Кроме того, когда я смотрю на следующий код:

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

Смежные вопросы