使用SOAP wcf webservice检索对象列表

时间:2012-04-12 13:44:33

标签: asp.net wcf web-services soap dotnetopenauth

我目前正在构建通过DotNetOpenAuth库进行身份验证的Web服务。为此,我在IIS7服务器上创建了两个站点,一个用于消费者,另一个用于提供者和实际的web服务(顺便说一句,我当前在本地调试消费者项目,但最终我会切换到单独的IIS7站点上的消费者项目)。

每个项目的实施分别像魅力一样,然而,在将它们捆绑在一起时,我遇到了一个问题。

从消费者调用webservice,并返回List<TimeTable>(TimeTable是我自己写的一个类)。但是,每当我测试我的代码时,webservice工作正常,产生一个大约300个项目的列表,但当消费者收到它时,列表突然有0个。

我认为这可能是因为网络服务和消费者是分开的项目;消费者项目并不知道&#34; TimeTable类(因为它只存在于服务提供者项目中),所以在消费者中我尝试使用List<object>来存储List<TimeTable>,这显然不起作用。但是,我不知道应该使用什么。

思想?

编辑:根据要求,我添加了消费者和提供者最重要的方法。请注意,其中大多数与DotNetOpenAuth示例几乎完全相同 - 检索字符串或“列表”列表&#39;以这种方式运作完美。

消费者方法 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

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; }

0 个答案:

没有答案