thẻ ghi lưu trữ: lists.asmx

Lists.asmx, GetListItems và thư mục

Tôi đã làm một số nghiên cứu cho một ai đó ngày hôm nay trên các dịch vụ web list.asmx cung cấp như một phần của SharePoint 2010 (và trước đó).  Cô đã có thể nhận được các bản ghi danh sách ở thư mục gốc (bao gồm tên của thư mục con), nhưng không thể có được các mục trong thư mục con.  Tôi đã làm một số tìm kiếm xung quanh trên internets và đó là một câu hỏi phổ biến đáng ngạc nhiên.  Được, Tôi không thể nhận được một câu trả lời tốt các câu hỏi đơn giản, "nếu tôi biết thư mục, làm thế nào để có được các mục trong thư mục?”  Để được trung thực, Tôi đã không thử tất cả những khó khăn kể từ khi tôi đã muốn con số này một ra ngày của riêng tôi trong một thời Nụ cười.

Để thiết lập, Tôi tạo ra một trang web được đặt tên "Viết blog kịch bản" và một danh sách tùy chỉnh tên "Tùy chỉnh danh sách với tiểu Folders".  Tôi sau đó tạo ra thư mục tên:

  • Năm 2005
  • Năm 2006
  • Năm 2007

Tôi thêm một vài bài vào thư mục "Năm 2006".  Đây là những gì nó trông giống như:

image

Bạn bè của tôi không phải là văn bản C# Mã nhưng thay vì sử dụng Java, Vì vậy, phong bì xà phòng là những gì cô ấy thực sự cần.  Để nhận được rằng, Tôi đã viết một chút về jQuery và sau đó sử dụng fiddler để có được cuộc trò chuyện thực tế HTTP.

Ở đây là có liên quan jQuery (Tôi sao chép mã xuống dưới đây nếu bạn muốn sao chép/dán):

image

Họ quan trọng đầu tiên là để bao gồm cả một <queryOptions> và <QueryOptions> nút.  Điều quan trọng thứ hai là các <Thư mục> nút là một URL mà khách hàng có quyền truy cập.

Có thể có những cách khác để có được điều này, nhưng điều này đã làm việc tốt cho tôi khi sử dụng jQuery.

Đây là phong bì xà phòng cho các bên trên:

<soapenv:Phong bì xmlns:soapenv =’http://schemas.xmlsoap.org/Soap/Envelope/’>                
  <soapenv:Cơ thể>
    <GetListItems xmlns =’
http://schemas.Microsoft.com/SharePoint/Soap/’>
      <listName>Tùy chỉnh danh sách với tiểu thư mục</listName>
      <viewFields>  
        <ViewFields>
          <FieldRef tên =' tiêu đề’ />
          <FieldRef tên ='EncodedAbsUrl’ />
        </ViewFields>
      </viewFields>
      <queryOptions>
        <QueryOptions>
          <Thư mục>
http://demoserver1/blog Kịch bản/danh sách tùy chỉnh danh sách với tiểu thư mục/năm 2006</Thư mục>
        </QueryOptions>
      </queryOptions>
   
</GetListItems>
  </soapenv:Cơ thể>
</soapenv:Phong bì>

Rất nhiều ví dụ và thảo luận xung quanh này dẫn tôi để tin rằng tất cả tôi cần là <QueryOptions> và chỉ ra tên thư mục.  Đối với tôi, Tôi cần cả hai quấn nó bên trong <queryOptions> cũng như chỉ định một URL đầy đủ điều kiện cho các <Thư mục> nút.

Đây là thiết lập AJAX của jQuery:

$(tài liệu).sẵn sàng(chức năng() {
       var soapEnv =
           "<soapenv:Phong bì xmlns:soapenv =’http://schemas.xmlsoap.org/Soap/Envelope/’> \
               <soapenv:Cơ thể> \
                    <GetListItems xmlns =’http://schemas.Microsoft.com/SharePoint/Soap/’> \
                       <listName>Tùy chỉnh danh sách với tiểu thư mục</listName> \
                       <viewFields> \
                           <ViewFields> \
                              <FieldRef tên =' tiêu đề’ /> \
                              <FieldRef tên ='EncodedAbsUrl’ /> \
                          </ViewFields> \
                       </viewFields> \
                       <queryOptions> \
                         <QueryOptions> \
                           <Thư mục>http://demoserver1/Blogging Kịch bản/danh sách tùy chỉnh danh sách với tiểu thư mục/năm 2006</Thư mục> \
                         </QueryOptions> \
                       </queryOptions> \
                   </GetListItems> \
               </soapenv:Cơ thể> \
           </soapenv:Phong bì>";

</kết thúc>

Đăng ký vào blog của tôi.

Theo tôi trên Twitter lúc http://www.twitter.com/pagalvin

Lists.asmx, GetList và "giá trị không thể được null”

Tôi phát hiện ra ngày hôm nay rằng GetList() phương pháp trong lists.asmx Dịch vụ web đã được gọi là rất cẩn thận hoặc nó là dễ bị ném một bí ẩn "Giá trị hiện tại không thể được null" ngoại lệ (và đó giả sử bạn có thể vượt qua các thông báo lỗi chung tồi tệ hơn nữa, "Ngoại lệ của loại ' Microsoft.SharePoint.SoapServer.SoapServerException’ bị văng ra.")  Đặc biệt, Tôi thấy rằng bạn không thể cung cấp cho bất kỳ hình thức nào của tiền tố về phương pháp GetList.  Đoạn jQuery sau minh họa điểm:

image

Nếu bạn làm điều đó, Dịch vụ web đáp ứng với "Giá trị không thể được null" theo điều này Fiddler-cung cấp bảng điểm HTTP:

<?Phiên bản XML = "1.0" mã hóa = "utf-8"?>
  <xà phòng:Phong bì
     xmlns:xà phòng ="
http://schemas.xmlsoap.org/Soap/Envelope/"    
     xmlns:XSi = "
http://www.w3.org/2001/XMLSchema-instance
     xmlns:xsd ="
http://www.w3.org/ 2001/XMLSchema">

  <xà phòng:Cơ thể>
    <xà phòng:Lỗi>
      <faultcode>xà phòng:Máy chủ</faultcode>
      <faultstring>
        Các ngoại lệ của loại ' Microsoft.SharePoint.SoapServer.SoapServerException’ ném.
      </faultstring>
      <chi tiết>
        <errorstring xmlns ="
http://schemas.Microsoft.com/SharePoint/Soap/">
Giá trị không thể được null.
        </errorstring>
      </chi tiết>
    </xà phòng:Lỗi>
  </xà phòng:Cơ thể>
</xà phòng:Phong bì>

Tất nhiên, bạn có lẽ sẽ không thêm tiền tố "s0" đó ngày của riêng bạn, nhưng một số công cụ có xu hướng để làm điều đó (như Eclipse).

Điều này là khó hiểu tất cả chi tiết / bực bội vì các phương pháp khác chịu đựng tiền tố.  Ví dụ, các GetListCollection phương pháp không quan tâm nếu nó được mục, ngay cả với vô nghĩa tiền tố như "xyzzy":

image

Điều này "giá trị hiện tại không thể được null" có vẻ khá phổ biến với lists.asmx để hy vọng điều này sẽ giúp đỡ người ra trong tương lai.

</kết thúc>

Đăng ký vào blog của tôi.

Theo tôi trên Twitter lúc http://www.twitter.com/pagalvin