WCF到WCF通信401,HttpClient

时间:2012-04-13 12:57:13

标签: wcf iis

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

有三个网站:

  • 默认网站
  • WEBSITE1
  • WEBSITE2

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

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

我收到了例外:

  

System.ArgumentOutOfRangeException:未授权(401)不是其中之一   以下:OK(200),Created(201),Accepted(202),   NonAuthoritativeInformation(203),NoContent(204),ResetContent   (205),PartialContent(206)

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

由于

3 个答案:

答案 0 :(得分:0)

我认为这与您的webservice设置有关。最好是为新服务创建GET,POST,Put,DELETE心跳调用,然后检查来自fiddler的那些。如果您获得401,则可能意味着您的应用程序池标识无法访问某些内容。

解决这个问题的步骤:

  1. 在WCF发布文件夹中为用户提供读/写/修改/执行/ ..类似权限
  2. 在.net 4集成
  3. 中为此站点创建应用程序池
  4. 将此用户设置为应用程序池标识,启用匿名模式
  5. 启用PUt,删除动词
  6. 测试呼叫服务的心跳类的一部分:

      [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
    

答案 1 :(得分:0)

  

我收到了例外:

谁是“我”?其中一个Web服务还是其他一些客户端?

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

那就是401,这是一个授权错误,所以检查可能的ServiceAuthorizationManager和/或类似的设置,“I”没有满足,导致401响应......

... H个

答案 2 :(得分:0)

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

检查出来: