为什么我不允许使用" 405方法"错误" Put"通过WCF运营Resful服务?

时间:2016-01-12 22:46:10

标签: c# .net json wcf wcf-rest

我有一个简单的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屏幕的屏幕截图: Postman Input Screenshot

这是我在输出中看到的: Postman Output Screenshot

这感觉它必须是某种配置问题。 有人能指出我正确的方向,我做错了吗?

2 个答案:

答案 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工作,我必须设置以下内容:

Postman headers and POST setting

类型设置为POST(显然)。但我还必须将标题Content-Type设置为application/json

为了发送数据,您不能使用URL参数(URL字段旁边的“Params”按钮)。这仅插入样式?name=bob,适用于GET但不适用POST。此外,我无法将数据指定为JSON,因此我必须以JSON格式输入raw数据:

Postman body text and valid response

然后我得到了有效的回复Hello bob!