我有一个简单的WCF服务,它将json作为输入/输出参数。 它作为基于SOAP的服务正常工作,我得到了预期的结果。
我已将RESTFul端点添加到服务中。 我正在使用"基于Google的" PostMan测试服务。
我可以成功致电"获取"服务上的方法并返回JSON结果:
[OperationContract(IsOneWay = false)]
[WebGet(UriTemplate = "/Test/{calcID}",
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare)]
CalcResults GetTestResults(string calcID);
当我尝试访问我的" Put"基于方法我得到的状态: 405方法不允许
" Put"的签名方法
[OperationContract(IsOneWay = false)]
[WebInvoke(Method = "Post",
UriTemplate = "/GetCalculation",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare)]
CalcResults GetCalculation(CalcInput inputValues);
这是我在PostMan输出窗口中看到的输出:
<body>
<div id="content">
<p class="heading1">Service</p>
<p>Method not allowed.</p>
</div>
</body>
这是我的配置设置与RESTFul接口的端点相似:
<system.serviceModel>
<services>
<service name="CalcServiceLibrary.CalcService">
<endpoint address="regular" binding="wsHttpBinding" name="wsHTTPEndPoints"
contract="CalcServiceLibrary.ICalcService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="json" binding="webHttpBinding" name="wsWebHTTPEndPoint"
contract="CalcServiceLibrary.ICalcServiceRESTful"
behaviorConfiguration="RESTfulBehavior" bindingConfiguration="crossDomain">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</service>
</services>
<bindings>
<webHttpBinding>
<binding name="crossDomain" crossDomainScriptAccessEnabled="true" />
</webHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="True"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="RESTfulBehavior">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
我确定在我的配置定义中有一些不太正确的东西。 我已经研究过几个帖子,但是还没有能够提出解决方案。
新注意:: 我已将以下简单端点添加到我的服务中:
[OperationContract]
[WebInvoke(
Method = "POST",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json)]
public string TestPost(string name)
{
return "Hello " + name + "!";
}
我正在使用Postman进行测试。这是我的Postman屏幕的屏幕截图:
这感觉它必须是某种配置问题。 有人能指出我正确的方向,我做错了吗?
答案 0 :(得分:1)
看起来您在声明中指定了post而不是put作为方法,可能更改为:
[OperationContract(IsOneWay = false)]
[WebInvoke(Method = "PUT",
UriTemplate = "/GetCalculation",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare)]
CalcResults GetCalculation(CalcInput inputValues);
答案 1 :(得分:0)
在排除故障时,我尝试做的第一件事就是从基本要素开始。我建议删除UriTemplate = "/GetCalculation"
和BodyStyle = WebMessageBodyStyle.Bare)
属性参数。这就是我的工作:
[OperationContract]
[WebInvoke(
Method = "POST",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json)]
public string TestPost(string name)
{
return "Hello " + name + "!";
}
编辑: 我以为我会看看Postman,因为我还是做了很多类似的工作。你能发布Postman配置的截图吗?为了让Postman工作,我必须设置以下内容:
类型设置为POST(显然)。但我还必须将标题Content-Type
设置为application/json
。
为了发送数据,您不能使用URL参数(URL字段旁边的“Params”按钮)。这仅插入样式?name=bob
,适用于GET
但不适用POST
。此外,我无法将数据指定为JSON,因此我必须以JSON格式输入raw
数据:
然后我得到了有效的回复Hello bob!
。