2013-11-19 6 views
5

Я пытаюсь создать службу WCF и вызывать ее методы с помощью jquery AJAX. До сих пор я не мог понять, как это сделать. Я прочитал некоторые из решений, приведенных в SO, но все еще не в состоянии его исправить. Любая помощь будет оценена по достоинству. У меня есть следующий код.Вызов службы WCF из jquery Ajax

В службе WCF.

Сервисный контракт

[ServiceContract] 
public interface IDatingService 
{ 
[WebInvoke(Method = "POST", 
RequestFormat= WebMessageFormat.Json, 
     ResponseFormat = WebMessageFormat.Json, 
     BodyStyle = WebMessageBodyStyle.Wrapped, 
     UriTemplate = "/AddUser")] 
    [OperationContract] 
    User AddUser(User user); 
} 

Реализация

public User AddUser(User user) 
{ 
    return userRepository.Add(user); 
} 

Конфигурация

<system.serviceModel> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="DatingServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
    </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
    <behavior name="DatingServiceBehavior"> 
     <webHttp/> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 
<services> 
    <service behaviorConfiguration="DatingServiceBehavior" 
      name="DatingService.Service.DatingService"> 
    <endpoint address="" binding="webHttpBinding" 
     contract="DatingService.Service.IDatingService" 
     behaviorConfiguration="DatingServiceBehavior"/> 
    <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" /> 
    </service> 
</services> 
</system.serviceModel> 

Со стороны клиента, я использую следующий код для вызова службы.

saveInfo: function() { 
    console.log('saveInfo'); 
    if ($('#terms-check').is(":checked")) { 
     if (app.validateEmail()) { 
      var input = 
       { 
        "user": 
        { 
         "LoginId": user.LoginId.text(), 
         "Password": user.Password.text(), 
         "Email": user.Email.val() 
        } 
       }; 
      $.ajax({ 
       type: "POST", 
       url: "http://localhost:36908/DatingService.svc/AddUser", 
       data: JSON.stringify(input), 
       contentType: 'application/json; charset=utf-8', 
       dataType: "json", 
       success: app.onSaveSuccess, 
       error: app.onSaveError 
      }); 
     } 
     else { 
      $('.error-label').text('Invalid email address.'); 
     } 
    } 
    else { 
     $('.error-label').text('Please check the terms and conditions.'); 
    } 
} 

Когда я звоню в службу, я получаю неверный запрос.

+0

@PSL, я попытался обертывание сообщение в «AddUser», но до сих пор не повезло. Такая же ошибка. –

+0

Вы пробовали использовать URL-адрес браузера?, Что вы получаете? – MSUH

+0

@MSUH, когда я попытался из браузера, я получаю, что Endpoint не найден. Как вы думаете, в чем проблема? Я не вижу никаких проблем в конфигурации. –

ответ

1

Проблема может быть связана с «localhost: 36908», вам необходимо убедиться, что ваша служба запущена и размещена на одном и том же порту, вы можете перейти к свойствам проекта WCF и выбрать «Использовать сервер разработчика Visual Studio», Specific Port "и напишите в нем 36908, затем запустите сервер разработки или отлаживайте решение, попробуйте снова нажать URL.

0

Вы должны построить такие объекты, как this.You получают 400 Bad запроса, потому что wcf ожидает данные в формате, который ajax не отправляет.

var obj = {}; 
obj.LoginId = user.LoginId.text(); 
obj.Password = user.Password.text(); 
obj.Email = user.Email.val(); 

var jsonObj=JSON.stringify(obj); 
var dataToSend = '{"user":'+jsonObj+'}'; 

Затем измените свою часть данных в AJAX запрос

 $.ajax({ 
       type: "POST", 
       url: "http://localhost:36908/DatingService.svc/AddUser", 
       data: JSON.stringify({user:obj}), 
    or 
       data: dataToSend, 
       contentType: 'application/json; charset=utf-8', 
       dataType: "json", 
       success: app.onSaveSuccess, 
       error: app.onSaveError 
      }); 
Смежные вопросы