1
単純なWCF Webサービスがあります。 Webサービスへの外部リクエストはすべて認証されている必要があります。外部リクエストの認証 - SOAPヘッダーにユーザーの資格情報を渡す方法?
Webベースのサービスの契約:
namespace SimpleCustomService
{
[ServiceContract]
public interface UsrIService
{
[OperationContract]
string SayHello();
}
}
Webベースのサービスの実装:私は、Webサービスのメソッドを呼び出すためのプロキシクラスを生成wsdl.exe
ユーティリティを使用することにより
namespace SimpleCustomService
{
public class UsrService : UsrIService
{
public string SayHello()
{
return "Hello";
}
}
}
。次のように
生成されたコードが見えます:
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Serialization;
//
// This source code was auto-generated by wsdl, Version=4.6.1055.0.
//
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.6.1055.0")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Web.Services.WebServiceBindingAttribute(Name="BasicHttpBinding_UsrIService", Namespace="http://tempuri.org/")]
public partial class UsrService : System.Web.Services.Protocols.SoapHttpClientProtocol {
private System.Threading.SendOrPostCallback SayHelloOperationCompleted;
/// <remarks/>
public UsrService() {
this.Url = "http://localhost:8080/0/ServiceModel/SimpleCustomService.svc/soap";
}
/// <remarks/>
public event SayHelloCompletedEventHandler SayHelloCompleted;
/// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/UsrIService/SayHello", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
[return: System.Xml.Serialization.XmlElementAttribute(IsNullable=true)]
public string SayHello() {
object[] results = this.Invoke("SayHello", new object[0]);
return ((string)(results[0]));
}
/// <remarks/>
public System.IAsyncResult BeginSayHello(System.AsyncCallback callback, object asyncState) {
return this.BeginInvoke("SayHello", new object[0], callback, asyncState);
}
/// <remarks/>
public string EndSayHello(System.IAsyncResult asyncResult) {
object[] results = this.EndInvoke(asyncResult);
return ((string)(results[0]));
}
/// <remarks/>
public void SayHelloAsync() {
this.SayHelloAsync(null);
}
/// <remarks/>
public void SayHelloAsync(object userState) {
if ((this.SayHelloOperationCompleted == null)) {
this.SayHelloOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSayHelloOperationCompleted);
}
this.InvokeAsync("SayHello", new object[0], this.SayHelloOperationCompleted, userState);
}
private void OnSayHelloOperationCompleted(object arg) {
if ((this.SayHelloCompleted != null)) {
System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
this.SayHelloCompleted(this, new SayHelloCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
}
}
/// <remarks/>
public new void CancelAsync(object userState) {
base.CancelAsync(userState);
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.6.1055.0")]
public delegate void SayHelloCompletedEventHandler(object sender, SayHelloCompletedEventArgs e);
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.6.1055.0")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class SayHelloCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
private object[] results;
internal SayHelloCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
base(exception, cancelled, userState) {
this.results = results;
}
/// <remarks/>
public string Result {
get {
this.RaiseExceptionIfNecessary();
return ((string)(this.results[0]));
}
}
}
私はそれが私の場合には必要なものですが、私が思うに、この議論を発見し、:
IメッセージのSOAPヘッダーに資格情報を渡したいどうやってするの?
私はこのコードを使用する場合:
using (UsrService client = new UsrService())
{
client.ClientCredentials.UserName.UserName = "user";
client.ClientCredentials.UserName.Password = "password";
client.SayHello();
}
を私は、このエラーメッセージが表示されます:
"UsrService does not contain a difinition for ClientCredentials"
私は、生成されたプロキシクラスに不足しているコードを含めるべきか?
私は情報に非常に感謝します。ありがとうございます。
お返事ありがとうございました!今私はそれをやろうとします。 –
ありがとうございました! –
それはうれしかった@AlekseyBykov。 –