#wcf #iis-7.5 #wcf-binding #wcf-ria-services #wcf-client
#wcf #iis-7.5 #wcf-привязка #wcf-ria-services #wcf-клиент
Вопрос:
У меня возникают проблемы с вызовом jquery wcf. Я уже провел поиск и нашел некоторые решения, но он по-прежнему выдает мне ошибку «метод 405 не разрешен». Ниже приведен код may
-Интерфейс
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
using System.ServiceModel;
namespace WcfServiceLibrary
{
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IContactService" in both code and config file together.
[ServiceContract]
public interface IContactService
{
[WebInvoke(Method = "GET",
ResponseFormat = WebMessageFormat.Json)]
[OperationContract]
Contact GetContactInfo();
}
}
-
Мой сервис
использование системы; использование System.Коллекции.Общий; с использованием System.Linq; с использованием System.Runtime.Сериализация; с использованием System.ServiceModel; с использованием System.Text; с использованием System.ServiceModel.Активация; с использованием System.ServiceModel.Веб; использование системы.ServiceModel;
пространство имен WcfServiceLibrary { // ПРИМЕЧАНИЕ: Вы можете использовать команду «Переименовать» в меню «Рефакторинг», чтобы изменить имя класса «ContactService» как в коде, так и в файле конфигурации одновременно.
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class ContactService : IContactService { public Contact GetContactInfo() { ContactBL contactBL = new ContactBL(); return contactBL.GetContact(); } }
}
-
Мой объект
использование системы; использование System.Коллекции.Общий; с использованием System.Linq; с использованием System.Text; с использованием System.Runtime; с использованием System.Runtime.Сериализация;
namespace WcfServiceLibrary
{
[DataContract]
public class Contact
{
[DataMember]
public int Id {get;set;}
[DataMember]
public string Fullname {get; set;}
[DataMember]
public string email { get; set; }
}
}
- BL
использование системы; использование System.Коллекции.Общий; с использованием System.Linq; с использованием System.Text;
namespace WcfServiceLibrary
{
class ContactBL
{
public ContactBL() { }
public Contact GetContact()
{
return new Contact {email="thang.nguyen@saas.com.vn", Fullname="NVTThang",Id=2 };
}
}
}
А также моя конфигурация WCF:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0"/>
</system.web>
<system.serviceModel>
<bindings>
<webHttpBinding>
<binding name="webBinding">
<security mode="None" />
</binding>
</webHttpBinding>
</bindings>
<services>
<service behaviorConfiguration="myBehavior" name="WcfServiceLibrary.ContactService">
<endpoint address="ajaxEp" behaviorConfiguration="epAjaxBehavior"
binding="webHttpBinding" bindingConfiguration="webBinding" name="epWebHttp"
contract="WcfServiceLibrary.IContactService" />
<endpoint address="mex" binding="mexHttpBinding" name="epMex"
contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="epAjaxBehavior">
<webHttp />
<enableWebScript/>
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="myBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true">
<baseAddressPrefixFilters>
<add prefix="http://localhost"/>
</baseAddressPrefixFilters>
</serviceHostingEnvironment>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
Я развертываю свой wcf на IIS 7.5, затем я создал веб-клиент, используя вызов jquery ajax для моей службы.
$.ajax({
type: "GET",
url: "http://localhost/WcfTestService/Service.svc/ajaxEp/GetContactInfo",
data: '',
contentType: "application/json;charset=utf-8",
dataType: "json",
processdata: true,
success: function (msg) {
alert(msg);
//ServiceSucceeded(msg);
},
error: ServiceFailed
});
function ServiceFailed(err){
alert(err.responseText);
return;
}
когда я вызываю свой сервис, он всегда выдает мне сообщение «Метод 405 не разрешен», и я пробовал aspnet_regiis -i и ServiceModelReg -i, но это не сработало. Пожалуйста, предложите мне какие-либо решения.
Заранее спасибо!
Ответ №1:
Я вижу несколько проблем в вашем сервисе:
Для запросов «GET» вам следует использовать WebGet вместо WebInvoke в вашем контракте:
[ServiceContract]
public interface IContactService
{
[WebGet(ResponseFormat = WebMessageFormat.Json)]
[OperationContract]
Contact GetContactInfo();
}
В поведении вашей конечной точки у вас есть 2 варианта поведения для написания сценариев: webHttp и enableWebScript. Вам нужен только первый. Последний предназначен для интеграции с ASP.NET В частности, AJAX.
<endpointBehaviors>
<behavior name="epAjaxBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
Вероятно, это не вызывает никаких проблем, но в вызове $.ajax вам не нужно указывать тип содержимого, поскольку это запрос GET (поэтому содержимого нет). Кроме того, поскольку вы не передаете никаких параметров, вам также не нужен параметр data.
$.ajax({
type: "GET",
url: "http://localhost/WcfTestService/Service.svc/ajaxEp/GetContactInfo",
dataType: "json",
success: function (msg) {
alert(msg);
//ServiceSucceeded(msg);
},
error: ServiceFailed
});
Комментарии:
1. Я изменил свою конфигурацию, а также мой скрипт jquery для вызова wcf. Но он отображает мне нулевые данные. Вот мой скрипт $.get(‘ localhost/WcfTestService/Service.svc/ajaxEp/GetContactInfo ‘, функция (данные) { оповещение (данные); });
2. Можете ли вы запустить его через Fiddler (www.fiddlertool.com ) чтобы увидеть, что клиент отправляет на сервер, и что сервер возвращает?
Ответ №2:
Попробуйте это в своем сервисе:
[ScriptMethod]
public Contact GetContact(...)
Комментарии:
1. [ScriptMethod] не является необходимым для служб WCF; метод вызывается скриптами с использованием соответствующей привязки (webHttpBinding) и поведения (webHttp)
2. В его коде было несколько проблем, на которые я указал в ответе. [ScriptMethod] не решит проблему, поскольку он выполняется только в классах, производных от System.Web.Services. Веб-сервис