个位达人, 麻烦帮小弟看看. 这个问题, 环境: vs 2008 使用 frame 2.0/3.5 都试了, wse 3.0
iis 6.0 : 开启匿名, 集成windows 认证.
1 建立一个 web service 已经 配置 wse 3.0 的环境 + policy + 采用 none 的方式认证
代码 :using Microsoft.Web.Services3.Design; -- 已经添加了引用
using Microsoft.Web.Services3;[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[Policy("CustomServicePolicy")]public class Service : System.Web.Services.WebService
{
public Service () { } [WebMethod]
public string HelloWorld() {
return "Hello World-s";
}
}
Service 端 的 webconfig<microsoft.web.services3>
<policy fileName="wse3policyCache.config"/>
<security>
<securityTokenManager>
<add type="Insucomputo.CustomUsernameTokenManager" namespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" localName="UsernameToken"/>
</securityTokenManager>
</security>
</microsoft.web.services3>Service 端的 wse3policyCache.config<policies xmlns="http://schemas.microsoft.com/wse/2005/06/policy">
<extensions>
<extension name="usernameOverTransportSecurity" type="Microsoft.Web.Services3.Design.UsernameOverTransportAssertion, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<extension name="requireActionHeader" type="Microsoft.Web.Services3.Design.RequireActionHeaderAssertion, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</extensions>
<policy name="CustomServicePolicy">
<usernameOverTransportSecurity />
<requireActionHeader />
</policy>
</policies>
----------------------------------------------------------------------------------Client 端 的代码-----也启用wse3.0 的配置, 使用client的方式, none 的密码发送方法, policy 名称和service的一样.public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ }
protected void Button1_Click(object sender, EventArgs e)
{
try
{
Service1.ServiceWse proxy = new Service1.ServiceWse();
//Service1.Service proxy = new Service1.Service();
UsernameToken token = new UsernameToken("edgar", "clave", PasswordOption.SendPlainText); proxy.SetClientCredential(token);
proxy.SetPolicy("CustomServicePolicy");
// 加上下面几句也不通
// proxy.Url = "http://localhost:8080/WebService_Ok_Sample/Service.asmx";
// proxy.PreAuthenticate = true;
// proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
// proxy.UseDefaultCredentials = true;
Label1.Text = proxy.HelloWorld();
}
catch (Exception ex)
{
Label1.Text = ex.ToString();
}
}
} client 端的 web.config<microsoft.web.services3>
<policy fileName="wse3policyCache.config"/>
</microsoft.web.services3>
client 端的wse3policyCache.config:<policies xmlns="http://schemas.microsoft.com/wse/2005/06/policy">
<extensions>
<extension name="usernameOverTransportSecurity" type="Microsoft.Web.Services3.Design.UsernameOverTransportAssertion, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<extension name="requireActionHeader" type="Microsoft.Web.Services3.Design.RequireActionHeaderAssertion, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</extensions>
<policy name="CustomServicePolicy">
<usernameOverTransportSecurity />
<requireActionHeader />
</policy>
</policies>--------------------------------------------------------
报错:System.Net.WebException: 请求因 HTTP 状态 401 失败: Unauthorized。 在 System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall) 在 System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters) 在 Service1.ServiceWse.HelloWorld() 在 _Default.Button1_Click(Object sender, EventArgs e)
-----------------------------多谢 个位了 !!
iis 6.0 : 开启匿名, 集成windows 认证.
1 建立一个 web service 已经 配置 wse 3.0 的环境 + policy + 采用 none 的方式认证
代码 :using Microsoft.Web.Services3.Design; -- 已经添加了引用
using Microsoft.Web.Services3;[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[Policy("CustomServicePolicy")]public class Service : System.Web.Services.WebService
{
public Service () { } [WebMethod]
public string HelloWorld() {
return "Hello World-s";
}
}
Service 端 的 webconfig<microsoft.web.services3>
<policy fileName="wse3policyCache.config"/>
<security>
<securityTokenManager>
<add type="Insucomputo.CustomUsernameTokenManager" namespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" localName="UsernameToken"/>
</securityTokenManager>
</security>
</microsoft.web.services3>Service 端的 wse3policyCache.config<policies xmlns="http://schemas.microsoft.com/wse/2005/06/policy">
<extensions>
<extension name="usernameOverTransportSecurity" type="Microsoft.Web.Services3.Design.UsernameOverTransportAssertion, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<extension name="requireActionHeader" type="Microsoft.Web.Services3.Design.RequireActionHeaderAssertion, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</extensions>
<policy name="CustomServicePolicy">
<usernameOverTransportSecurity />
<requireActionHeader />
</policy>
</policies>
----------------------------------------------------------------------------------Client 端 的代码-----也启用wse3.0 的配置, 使用client的方式, none 的密码发送方法, policy 名称和service的一样.public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{ }
protected void Button1_Click(object sender, EventArgs e)
{
try
{
Service1.ServiceWse proxy = new Service1.ServiceWse();
//Service1.Service proxy = new Service1.Service();
UsernameToken token = new UsernameToken("edgar", "clave", PasswordOption.SendPlainText); proxy.SetClientCredential(token);
proxy.SetPolicy("CustomServicePolicy");
// 加上下面几句也不通
// proxy.Url = "http://localhost:8080/WebService_Ok_Sample/Service.asmx";
// proxy.PreAuthenticate = true;
// proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
// proxy.UseDefaultCredentials = true;
Label1.Text = proxy.HelloWorld();
}
catch (Exception ex)
{
Label1.Text = ex.ToString();
}
}
} client 端的 web.config<microsoft.web.services3>
<policy fileName="wse3policyCache.config"/>
</microsoft.web.services3>
client 端的wse3policyCache.config:<policies xmlns="http://schemas.microsoft.com/wse/2005/06/policy">
<extensions>
<extension name="usernameOverTransportSecurity" type="Microsoft.Web.Services3.Design.UsernameOverTransportAssertion, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<extension name="requireActionHeader" type="Microsoft.Web.Services3.Design.RequireActionHeaderAssertion, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</extensions>
<policy name="CustomServicePolicy">
<usernameOverTransportSecurity />
<requireActionHeader />
</policy>
</policies>--------------------------------------------------------
报错:System.Net.WebException: 请求因 HTTP 状态 401 失败: Unauthorized。 在 System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall) 在 System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters) 在 Service1.ServiceWse.HelloWorld() 在 _Default.Button1_Click(Object sender, EventArgs e)
-----------------------------多谢 个位了 !!
System.Net.ServicePointManager.Expect100Continue = false;
WEB1.Service ws1 = new WebServer_Test.WEB1.Service();
ws1.Credentials = System.Net.CredentialCache.DefaultCredentials;
如: 加上下面几句也不通
proxy.Url = "http://localhost:8080/WebService_Ok_Sample/Service.asmx";
proxy.PreAuthenticate = true;
proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
proxy.UseDefaultCredentials = true;
还有, 这句 是在server 端还是 client 端
System.Net.ServicePointManager.Expect100Continue = false;