0

我有一个需要与另一个 WCF REST 服务通信的 WCF REST 服务。

共有三个网站:

  • 默认网站
  • 网站1
  • 网站2

如果我在默认网站中设置这两个服务并HttpClient使用 URI http://localhost/service连接到另一个(使用),那么一切都很好。

所需的设置是将这两个服务移动到不同的网站,而不是使用 URI http://localhost/service,通过http://website1.domain.com/service访问服务仍然使用HttpClient.

我收到了异常:

System.ArgumentOutOfRangeException:未经授权 (401) 不是以下之一:OK (200)、已创建 (201)、已接受 (202)、NonAuthoritativeInformation (203)、NoContent (204)、ResetContent (205)、PartialContent (206)

我可以看到这是一个 401,但是这里发生了什么?

谢谢

4

3 回答 3

0

我收到了异常:

“我”是谁?Web 服务之一或其他客户端?

如果我理解正确,那么接收端似乎期待一系列响应,401不是其中之一。它可能是一些错误检查代码,需要“这个范围”的响应并且 X (并且 401 不是其中之一,或者没有“默认”方法来解释 x 响应?)。

也就是说,401 是一个授权错误,因此请检查可能的ServiceAuthorizationManager和/或“我”未满足的类似设置首先导致 401 响应......

嗯...

于 2012-04-21T15:09:42.500 回答
0

我的猜测是您缺少授权标头或凭据。

看一下这个 :

于 2012-04-22T10:50:51.047 回答
0

我认为这与您的网络服务设置有关。最好只为新服务创建 GET、POST、Put、DELETE 心跳调用,然后从 fiddler 中检查这些调用。如果您收到 401,则可能意味着您的应用程序池身份无法访问某些内容。

解决该问题的步骤:

  1. 在您的 WCF 发布文件夹中授予用户读/写/修改/执行/..similar 权限
  2. 在集成的 .net 4 中为此站点创建应用程序池
  3. 将此用户设置为应用程序池标识,启用匿名模式
  4. 启用 PUt,同时删除动词

服务中用于测试调用的心跳类的一部分:

  [DataContract]
public class StatusInfo
{
    [DataMember]
    public string MachineName { get; set; }

    [DataMember]
    public string IpAddress{ get; set; }

    [DataMember]
    public string Methodname { get; set; }

    public override string ToString()
    {
        return "Machinename:" + MachineName + " ;IP:" + IpAddress + "; Method:" + Methodname;
    }
}

private void ResolveStatus(StatusInfo statusInfo,string methodname)
    {
        try
        {
            var context = System.ServiceModel.OperationContext.Current;

            RemoteEndpointMessageProperty property =
                (RemoteEndpointMessageProperty)
                context.IncomingMessageProperties[RemoteEndpointMessageProperty.Name];


            statusInfo.IpAddress = property.Address;
            statusInfo.MachineName = Environment.MachineName;
            statusInfo.Methodname = methodname;

        }catch(Exception ex)
        {

        }
    }
/// <summary>
    /// create task
    /// </summary>
    /// <param name="taskwrapped"></param>
    [WebInvoke(Method = "POST", UriTemplate = "", RequestFormat = WebMessageFormat.Json,
        ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
    public StatusInfo postcall()
    {
        StatusInfo statusInfo = new StatusInfo();
        logger.Trace(Tagname + "postcall");
        ResolveStatus(statusInfo, "POST");
        return statusInfo;

    }


    /// <summary>
    /// edit task
    /// </summary>
    [WebInvoke(Method = "PUT", UriTemplate = "", RequestFormat = WebMessageFormat.Json,
              ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
    public StatusInfo Edit()
    {
        StatusInfo statusInfo = new StatusInfo();
        logger.Trace(Tagname + "Edit");
        ResolveStatus(statusInfo, "PUT");
        return statusInfo;

    }

    //delete request with taskid
    [WebInvoke(Method = "DELETE", UriTemplate = "", RequestFormat = WebMessageFormat.Json,
     ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
    public StatusInfo DeleteCall()
    {
        StatusInfo statusInfo = new StatusInfo();
        logger.Trace(Tagname + "Edit");
        ResolveStatus(statusInfo, "DELETE");
        return statusInfo;

    }


    //delete request with taskid
    [WebInvoke(Method = "DELETE", UriTemplate = "/{recordid}", RequestFormat = WebMessageFormat.Json,
     ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
    public StatusInfo DeleteCallWithParam(string recordid)

    {
        StatusInfo statusInfo = new StatusInfo();
        logger.Trace(Tagname + "Edit");
        ResolveStatus(statusInfo, "DELETE/"+recordid);
        return statusInfo;

    }



enter code here
于 2012-04-16T03:39:02.980 回答