我有一个需要与另一个WCF REST服务通信的WCF REST服务。
有三个网站:
如果我在默认网站中设置这两项服务并使用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,但这里发生了什么?
由于
答案 0 :(得分:0)
我认为这与您的webservice设置有关。最好是为新服务创建GET,POST,Put,DELETE心跳调用,然后检查来自fiddler的那些。如果您获得401,则可能意味着您的应用程序池标识无法访问某些内容。
解决这个问题的步骤:
测试呼叫服务的心跳类的一部分:
[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)
我的猜测是您缺少授权标头或凭据。
检查出来: