【发布时间】:2012-07-15 20:01:45
【问题描述】:
我正在使用 WCF 构建 Web 服务。该服务必须支持 REST。
这是我到目前为止所做的:
我为应用配置了一个baseAddress、mex 端点和一个具有webhttpbinding 的附加端点。
这里是服务配置:
<service name="ServiceLibrary.Service" behaviorConfiguration="myServiceBehavior">
<endpoint
address=""
behaviorConfiguration="webHttp"
binding="webHttpBinding" bindingConfiguration=""
contract="ServiceLibrary.IEvalService" >
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8732/sdata/myApp/myContract/-/"/>
</baseAddresses>
</host>
</service>
这里是行为配置:
<serviceBehaviors>
<behavior name="myServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
<behavior>
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="webHttp">
<webHttp/>
</behavior>
</endpointBehaviors>
我正在建立这样的服务合同:
[ServiceContract]
public interface IEvalService
{
[OperationContract]
[WebGet(UriTemplate = "/employees('{MDNr}:{ANNr}')")]
Atom10ItemFormatter GetEmployeeByPK(string MDNr, string ANNr);
[OperationContract]
[WebGet]
string employees(string queryString);
}
我正在一个单独的类中处理操作合同:
public class Service : IEvalService
{
public Atom10ItemFormatter GetEmployeeByPK(string MDNr, string ANNr){return Employee.GetEmployeeByPK(MDNr, ANNr);}
public string employees(string queryString)
{
System.Diagnostics.Debug.WriteLine("Query: " + queryString);
return queryString;
}
这两个方法都在执行 GET 方法后被调用。
我这样称呼第一个:
http://localhost:8732/sdata/myApp/myContract/-/employees('3:37')
它工作得很好,给了我 ID 等等。
我这样称呼第二个:
http://localhost:8732/sdata/myApp/myContract/-/employees?where=name eq 'bla'
这就是麻烦的开始。方法员工被调用,但它没有收到任何字符串。我不知道为什么。这是完全相同的代码,就像在那些教程中一样,我只是更改了名称...
有人看到我明显犯的错误吗?非常感谢任何帮助。
还有一件事:我正在使用 .Net 4.0 并在调试器上运行它,这样我就可以通过 firefox rest 客户端调用 url?这是一个服务库项目。
【问题讨论】:
-
我可能遗漏了一些更基本的东西,但是您实际上没有在这里使用 WCF 数据服务有什么原因吗?示例 URL 看起来您可能正在尝试通过普通 WCF 服务执行 OData。希望这不会给人以光顾的印象,但是 WCF 数据服务与普通的旧 WCF 服务不同,它的主要功能是处理许多标准查询组合,而不需要一堆自定义代码。
-
这是我尝试设置的第一个网络服务。我按照该视频中的说明进行操作:channel9.msdn.com/Shows/Endpoint/… 我必须遵循协作协议中给出的一组规则。这就是为什么使用它,因为它到目前为止工作。你认为我走错路了吗?
-
我不确定你是不是走错路了;这对我来说是一个艰难的决定。我可以说的是,OData 和 WCF 数据服务至少适合您上面展示的示例。浏览此页面上的内容可能值得您花 10 分钟时间:odata.org/introduction。
-
mm 我不应该使用 odata...但是我使用它的方式真的有什么问题吗?到目前为止效果还不错...
-
戴上我在微软之前的帽子,我理解为什么会有一个笼统的“不要使用____,因为它来自微软”的声明,但在这种情况下,感觉就像是在重新创造轮子。 (我当然不是要冒犯,只是说明我希望是显而易见的。)我能问一下不使用 OData 的理由是什么,是“不使用 OData”还是“不使用WCF 数据服务”?不使用 OData 肯定有很多正当理由,但您的用例似乎与我所看到的非常吻合。
标签: c#-4.0 rest wcf-data-services