1

現在、DotNetOpenAuth ライブラリを介して認証される Web サービスを構築中です。この目的のために、IIS7 サーバー上に 2 つのサイトを作成しました。1 つはコンシューマー、もう 1 つはプロバイダーと実際の Web サービスです (ちなみに、現在、コンシューマー プロジェクトをローカルでデバッグしていますが、最終的にはコンシューマー プロジェクトに切り替える予定です)。別の IIS7 サイトにあります)。

各プロジェクトの実装は個別に魅力的に機能しますが、すべてを結び付けると問題が発生しました。

Web サービスはコンシューマーから呼び出され、List<TimeTable>(TimeTable は私が書いたクラスです) を返します。ただし、コードをテストするたびに、Web サービスは正常に動作し、約 300 項目のリストを生成しますが、消費者がそれを受け取ると、リストのカウントが突然 0 になります。

これは、Web サービスとコンシューマーが別々のプロジェクトであることが原因であると考えられます。コンシューマー プロジェクトは TimeTable クラスを「認識」していません (サービス プロバイダー プロジェクトにのみ存在するためList<object>) List<TimeTable>。ただし、代わりに何を使用すればよいかわかりません。

考え?

編集: 要求に応じて、コンシューマーとプロバイダーから最も重要なメソッドを追加しました。これらのほとんどは、DotNetOpenAuth の例とほとんど同じであることに注意してください。この方法での文字列または「リスト」の取得は完全に機能します。

コンシューマー SampleWcf.aspx.csのメソッド

protected void retrieveTimeTable_Click(object sender, EventArgs e)
{
     try
     {                
         List<object> timeTables = CallService(client => client.retrieveTimeTable("1", "52"));
         this.retrieveTimeTableLabel.Text = timeTables.Count.ToString();
     }
     catch (SecurityAccessDeniedException)
     { this.retrieveTimeTableLabel.Text = "Access denied!"; }}

private T CallService<T>(Func<DataApiClient, T> predicate) 
{
    DataApiClient client = new DataApiClient();
    var serviceEndpoint = new MessageReceivingEndpoint(client.Endpoint.Address.Uri, HttpDeliveryMethods.AuthorizationHeaderRequest | HttpDeliveryMethods.PostRequest);
    var accessToken = Session["WcfAccessToken"] as string;
    if (accessToken == null) 
    { throw new InvalidOperationException("No access token!"); }
    WebConsumer consumer = this.CreateConsumer();
    WebRequest httpRequest = consumer.PrepareAuthorizedRequest(serviceEndpoint, accessToken);
    HttpRequestMessageProperty httpDetails = new HttpRequestMessageProperty();
    httpDetails.Headers[HttpRequestHeader.Authorization] = httpRequest.Headers[HttpRequestHeader.Authorization];
    using (OperationContextScope scope = new OperationContextScope(client.InnerChannel)) {
    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpDetails;
          return predicate(client); }}

クラス DataApiClient で

public List<string> getList()
{ return base.Channel.getList(); }

クラス DataApi.csの providerのメソッド

public List<TimeTable> retrieveTimeTable(string weekVan, string weekTot)
{
    TimeTableWebService ttws = new TimeTableWebService();
    List<TimeTable> results = ttws.getTimeTable(weekVan, weekTot);

    StringBuilder fbr = new StringBuilder();
    fbr.AppendLine("New log created on: " + DateTime.Now.ToString());
    fbr.AppendLine("Number of results: " + results.Count);

    using (StreamWriter outfile = new StreamWriter(@"D:\oauthSiteTest\log9.txt"))
    { outfile.Write(fbr.ToString()); }

    return results; }
4

0 に答える 0