Хорошо, я прочитал несколько документов, чтобы ответить на свой вопрос.В основном, WCF REST сильно изменился.В предыдущих версиях это довольно сложно настроить, но в последних версиях (начальный комплект .NET 4 и WCF REST) издержки на конфигурацию намного меньше.
Чтобы быстро запустить WCF REST, я в основном сделал 3 вещи,
- Настройка пути к службе в global.asax.cs (мне пришлось вручную добавить / отредактировать его как global.asax и global.asax.cs)
- Настройка "контракт на обслуживание "(т. е." doThisMethod "внутри http://localhost/doThisMethod/)
- Настройка" контракта данных "(т. е. если вы размещаете любой XML / JSON через тело HTTP, это" сопоставляет "/ сериализуетмежду XML / JSON и собственными объектами C #.)
Для базовых API REST (т. е. только HTTP GET) достаточно только первых двух шагов.Пожалуйста, обратите внимание, я удалил некоторые вещи во время вставки копий, но вы должны понять ...
Step1a
global.asax
<%@ Application Codebehind="~/App_Code/Global.asax.cs" Inherits="MyBLL.Global" Language="C#" %>
Step1b
global.asax.cs
using System;
using System.Collections.Generic;
using System.ServiceModel.Activation;
using System.Web;
using System.Web.Routing;
public class Global : System.Web.HttpApplication
{
void Application_Start(object sender, EventArgs e)
{
// Code that runs on application startup
RouteTable.Routes.Add(new ServiceRoute("/", new WebServiceHostFactory(), typeof(TestService)));
}
}
Step2a
Как видите, я разделюинтерфейс (абстрактный класс) и фактическая реализация в два отдельных файла для чистого разделения.
TestInterface.cs
using System;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
[ServiceContract]
interface TestInterface
{
[OperationContract]
string TestAsXML(string extra);
[OperationContract]
string TestAsJSON(string extra);
}
Step2b TestService.cs
using System;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class TestService : TestInterface
[WebInvoke(UriTemplate = "Test/{username}", Method = "GET", ResponseFormat = WebMessageFormat.Xml)]
public string TestAsXML(string username)
{
WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml";
return String.Format("Hello {0}!", String.IsNullOrWhiteSpace(username) ? "world" : username);
}
[WebInvoke(UriTemplate = "Test/{username}?format=json", Method = "GET", ResponseFormat = WebMessageFormat.Json)]
public string TestAsJSON(string username)
{
// NOTE, if we GET this from a browsers, it will most likely have
// "Accept: text/html, application/xhtml+xml, */*" in the HTTP header
// So the framework will return XML instead. Try from Fiddler2 instead or
// write your own WCF client or from AJAX
WebOperationContext.Current.OutgoingResponse.ContentType = "application/json";
return String.Format("Hello {0}!", String.IsNullOrWhiteSpace(username) ? "world" : username);
}
Step3
В вышеприведенном примере "test" все находится над самим URI (из-за GET), поэтому вам не нужны указанные ниже данные.Практически, если вы хотите использовать POST и т. Д., Вам нужно отправить объект в теле HTTP.При обмене данными используйте «Контракт данных», чтобы использовать функции WCF, как показано ниже.
Здесь я буду отправлять один класс в теле HTTP, который, в свою очередь, имеет одну строку и один int внутри.
TestInput.cs
using System;
using System.Web;
using System.Runtime.Serialization;
// "" needed to clear out ugly xmlns namespace tags to make it plain old XML (POX)
// If you want them, ether take it out or specify on your own
[DataContract(Name = "TestInput", Namespace = "")]
public class TestInput
{
// NOTE: If Order property is skipped, the data will be serialized
// alphabetically per variable names!!
// This can kill services, so better to be explicit
[DataMember(Order = 0)]
int SomeNumber;
// NOTE: If Name property is used XML will have UserName instead of internalUserName
[DataMember(Name="UserName", Order = 1)]
string internalUserName;
}