WCF双端点
我正在开发一个具有JSON行为的WCF服务,我想将其公开为REST和SOAPWCF双端点,wcf,Wcf,我正在开发一个具有JSON行为的WCF服务,我想将其公开为REST和SOAP [ServiceContract] public interface ITicket { [WebGet] [OperationContract] Ticket[] GetAllTickets(); [WebGet(UriTemplate = "{value}")] [OperationContract] Ticket GetTicketById(int Id);
[ServiceContract]
public interface ITicket
{
[WebGet]
[OperationContract]
Ticket[] GetAllTickets();
[WebGet(UriTemplate = "{value}")]
[OperationContract]
Ticket GetTicketById(int Id);
//[WebGet(UriTemplate = "{value}")]
[OperationContract]
Ticket[] GetTickets(string Ids);
[OperationContract ]
void AddTicket(Ticket ticket);
[OperationContract ]
void UpdateTicket(int Id);
}
我的配置设置是:
<service name="WCF_Rest_SOAP_JSON_Service.TicketService"
behaviorConfiguration="TicketServiceBehavior" >
<endpoint
address="soap"
behaviorConfiguration="SOAPEndPointBehavior"
binding="basicHttpBinding"
contract="WCF_Rest_SOAP_JSON_Service.ITicket"/>
<endpoint
address="rest"
behaviorConfiguration="RESTEndPointBehavior"
binding="webHttpBinding"
contract="WCF_Rest_SOAP_JSON_Service.ITicket"/>
</service>
<behaviors>
<serviceBehaviors>
<behavior name="TicketServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="SOAPEndPointBehavior">
<webHttp/>
</behavior>
<behavior name="RESTEndPointBehavior">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
我所做的是:
创建了一个空白解决方案
添加了WCF服务应用程序
现在我的问题是:
当我运行服务时,我直接进入IIS直接列表,单击我的服务后,我得到以下错误:
终点在'http://localhost:3505/TicketService.svc/soap'没有与None MessageVersion的绑定。'System.ServiceModel.Description.WebHttpBehavior'仅用于WebHttpBinding或类似绑定**
我还运行了WCFTestClient.exe,并在传递此url之后http://localhost:3505/TicketService.svc,我得到了以下错误:
未能添加服务。服务元数据可能无法访问。确保您的服务正在运行并公开元数据
我尝试了堆栈溢出的不同解决方案,但至今未成功。对于第一个错误,您需要从SOAP端点行为中删除,并用更合适的方法替换它,例如@Alex找不到任何兼容的选项或开始,请您进一步说明。抱歉,那我的错。如果你只是从SoapEndpoint中删除了,它会工作吗?@Alex我注释掉了接口中的所有方法,除了第一个方法,删除了,它工作了,但是现在还有2个问题1。如果我取消对第二个方法的注释并尝试运行我的服务,它会说契约“ITicket”中的错误操作“GetTicketById”有一个UriTemplate,该模板需要一个名为“VALUE”的参数,但该操作上没有具有该名称的输入参数。2.在运行第一个方法时,我如何知道我正在将服务作为SOAP或REST使用?编辑:@AlexBarac现在我也可以运行第二个方法,但第二个问题仍然存在,即不知道我是否正在将这些方法作为REST或SOAP进行测试?