我想要的是响应我的根 URL 的“常规”WCF 服务调用以及常规的 RIA 内容。看起来很简单,但结果有点痛苦。RIA 的东西可以工作,包括 ODATA JSON 和 SOAP,但传统的 Web 服务不想运行根 URL。
请参阅以下代码:
using System;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.ServiceModel.DomainServices.Hosting;
using System.ServiceModel.DomainServices.Server;
using System.ServiceModel.Web;
using Microsoft.ServiceModel.DomainServices.Hosting;
namespace ConsoleApplication1
{
public partial class Program
{
[EnableClientAccess, ServiceContract]
public class TestDomainService : DomainService
{
[Query(IsDefault = true)]
public IQueryable<Foo> GetAllFoos()
{
return new Foo[] { new Foo { Id = 1, Name = "Jonathan" } }.AsQueryable();
}
[WebInvoke(Method="GET"), OperationContract]
public Message Test()
{
return WebOperationContext.Current.CreateTextResponse("Test");
}
}
public class Foo
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
}
static void Main(string[] args)
{
var baseUri = new Uri("http://localhost:999");
var svc = new DomainServiceHost(typeof(TestDomainService), new Uri[] { baseUri });
svc.Description.Behaviors.RemoveAll<AspNetCompatibilityRequirementsAttribute>();
svc.Description.Behaviors.OfType<ServiceMetadataBehavior>().First().HttpGetEnabled = true;
var svcDescription = DomainServiceDescription.GetDescription(typeof(TestDomainService));
var odataEndpoints = new ODataEndpointFactory().CreateEndpoints(svcDescription, svc);
var soapEndpoints = new SoapXmlEndpointFactory().CreateEndpoints(svcDescription, svc);
var jsonEndpoints = new JsonEndpointFactory().CreateEndpoints(svcDescription, svc);
var odata = odataEndpoints.First();
odata.Contract.Namespace = new Uri(baseUri, "ODATA").ToString();
odata.Address = new System.ServiceModel.EndpointAddress(new Uri(baseUri, "ODATA"));
var soap = soapEndpoints.First();
soap.Contract.Namespace = new Uri(baseUri, "SOAP").ToString();
soap.Address = new System.ServiceModel.EndpointAddress(new Uri(baseUri, "SOAP"));
var json = jsonEndpoints.First();
json.Contract.Namespace = new Uri(baseUri, "JSON").ToString();
json.Address = new System.ServiceModel.EndpointAddress(new Uri(baseUri, "JSON"));
var ep = new ServiceEndpoint(svc.Description.Endpoints[0].Contract, new WebHttpBinding(), new EndpointAddress(baseUri));
ep.Behaviors.Add(new WebHttpBehavior());
var cd = ContractDescription.GetContract(typeof(TestDomainService));
foreach (var op in cd.Operations)
{
if (ep.Contract.Operations.Any(o => o.Name == op.Name) == false)
{
ep.Contract.Operations.Add(op);
}
}
svc.Description.Endpoints.Add(ep);
svc.Description.Endpoints.Add(odata);
svc.Description.Endpoints.Add(soap);
svc.Description.Endpoints.Add(json);
svc.Open();
foreach (var endpoint in svc.Description.Endpoints)
{
Console.WriteLine("Domain service started on: {0}", endpoint.Address.Uri);
}
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
}
访问http://localhost:999/Test应该只显示测试,但我得到:
<Fault xmlns="http://schemas.microsoft.com/ws/2005/05/envelope/none">
<Code>
<Value>Sender</Value>
<Subcode>
<Value xmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none">a:ActionNotSupported</Value>
</Subcode>
</Code>
<Reason>
<Text xml:lang="en-US">The message with Action '' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).</Text>
</Reason>
</Fault>
谁能看到我错过了什么?
提前致谢!