From 00370791d52753e70b9aadc2b1ccf0c6e1196de9 Mon Sep 17 00:00:00 2001 From: "Andy (Steve) De George" <67293991+adegeo@users.noreply.github.com> Date: Thu, 10 Jun 2021 12:14:52 -0700 Subject: [PATCH 001/105] Convert labeler to new format (#24618) * convert label rules to new format * Update .repoman.yml --- .ghal.rules.json | 335 -------------------------------------------- .repoman.yml | 353 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 353 insertions(+), 335 deletions(-) delete mode 100644 .ghal.rules.json create mode 100644 .repoman.yml diff --git a/.ghal.rules.json b/.ghal.rules.json deleted file mode 100644 index 61c19446ca364..0000000000000 --- a/.ghal.rules.json +++ /dev/null @@ -1,335 +0,0 @@ -{ - "version": 3, - "configRevision": 4, - - "issue": { - "labeled": { - "processor-conditional-techprodlabels": { - "type": "query", - "value": "length(Issue.labels[?contains(name, '/prod') || contains(name, '/tech')]) != `0`", - "processors": { - "processor-conditional": { - "type": "query", - "value": "length(Issue.labels[?name == 'doc-enhancement' || name == 'product-question' || name == 'in-progress' || name == 'test-issue' || name == 'kudos' || name == 'loc' || name == 'doc-bug' || name == 'product-feedback' || name == 'code-of-conduct' || name == 'support-request' || name == 'duplicate' || name == 'resolved-by-customer' || name == 'docs-experience' || name == 'doc-provided' || name == 'doc-idea' || name == 'needs-more-info']) != `0`", - "actions": { - "labels-remove": ":watch: Not Triaged" - }, - "actions-failed": { - "labels-add": ":watch: Not Triaged" - } - } - } - }, - "processor-conditional-release6": { - "type": "query", - "value": "length(Issue.labels[?name == ':checkered_flag: Release .NET 6']) != `0`", - "actions": { - "projects-add": [ "132" ] - } - } - }, - "opened": { - "processor-default": { - "labels-add": [ ":watch: Not Triaged" ] - }, - "processor-meta-custom": { - "issuetype": { - "(?i)breaking-change$": { - "labels-add": [ "breaking-change", "doc-idea" ], - "projects-add": [ "135" ] - } - } - } - }, - "reopened": { - "processor-default": { - "labels-remove": [ "won't fix" ] - } - }, - "closed": { - "processor-default": { - "labels-remove": [ "in-progress", ":watch: Not Triaged" ] - } - } - }, - "pullrequest": { - "opened": { - "processor-default": { - "milestone-set": "![sprint]" - }, - "processor-conditional": { - "type": "query", - "value": "PullRequest.base.ref != 'live'", - "processors": { - "processor-files": { - "changedfile": { - - "(?i).*_csharplang.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-spec/tech" ] - }, - - "(?i).*_vblang\/spec.*": { - "labels-add": [ "dotnet-visualbasic/prod", "vb-spec/tech" ] - }, - - "(?i).*docs\/architecture.*": { - "labels-add": "dotnet-architecture/prod" - }, - "(?i).*docs\/architecture\/blazor-for-web-forms-developers.*": { - "labels-add": [ "dotnet-architecture/prod", "blazor/tech" ] - }, - "(?i).*docs\/architecture\/cloud-native.*": { - "labels-add": [ "dotnet-architecture/prod", "cloud-native/tech" ] - }, - "(?i).*docs\/architecture\/containerized-lifecycle.*": { - "labels-add": [ "dotnet-architecture/prod", "containerized-lifecycle/tech" ] - }, - "(?i).*docs\/architecture\/grpc-for-wcf-developers.*": { - "labels-add": [ "dotnet-architecture/prod", "grpc/tech" ] - }, - "(?i).*docs\/architecture\/microservices.*": { - "labels-add": [ "dotnet-architecture/prod", "microservices/tech" ] - }, - "(?i).*docs\/architecture\/modernize-with-azure-containers.*": { - "labels-add": [ "dotnet-architecture/prod", "modernize-with-azure-containers/tech" ] - }, - "(?i).*docs\/architecture\/modern-web-apps-azure.*": { - "labels-add": [ "dotnet-architecture/prod", "modern-web-apps-azure/tech" ] - }, - "(?i).*docs\/architecture\/serverless.*": { - "labels-add": [ "dotnet-architecture/prod", "serverless/tech" ] - }, - - "(?i).*docs\/azure.*": { - "labels-add": "dotnet-azure/prod" - }, - - "(?i).*docs\/core.*": { - "labels-add": "dotnet-fundamentals/prod" - }, - "(?i).*docs\/core\/tools.*": { - "labels-add": [ "dotnet-fundamentals/prod", "dotnet-cli/tech" ] - }, - "(?i).*docs\/core\/docker.*": { - "labels-add": [ "dotnet-fundamentals/prod", "dotnet-docker/tech" ] - }, - - "(?i).*docs\/core\/install.*": { - "labels-add": [ "dotnet/prod", "dotnet-install/tech" ] - }, - - "(?i).*docs\/csharp.*": { - "labels-add": "dotnet-csharp/prod" - }, - "(?i).*docs\/csharp\/fundamentals.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-fundamentals/tech" ] - }, - "(?i).*docs\/csharp\/misc.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-diagnostics/tech" ] - }, - "(?i).*docs\/csharp\/whats-new.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-whats-new/tech" ] - }, - "(?i).*docs\/csharp\/how-to.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-fundamentals/tech" ] - }, - "(?i).*docs\/csharp\/linq.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-linq/tech" ] - }, - "(?i).*docs\/csharp\/programming-guide\/indexers.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-fundamentals/tech" ] - }, - "(?i).*docs\/csharp\/programming-guide\/generics.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-fundamentals/tech" ] - }, - "(?i).*docs\/csharp\/programming-guide\/strings.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-fundamentals/tech" ] - }, - "(?i).*docs\/csharp\/programming-guide\/types.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-fundamentals/tech" ] - }, - "(?i).*docs\/csharp\/programming-guide\/statements-expressions-operators.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-fundamentals/tech" ] - }, - "(?i).*docs\/csharp\/programming-guide\/interop.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-advanced-concepts/tech" ] - }, - "(?i).*docs\/csharp\/language-reference\/unsafe-code.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-advanced-concepts/tech" ] - }, - "(?i).*docs\/csharp\/programming-guide\/namespaces.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-fundamentals/tech" ] - }, - "(?i).*docs\/csharp\/programming-guide\/arrays.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-fundamentals/tech" ] - }, - "(?i).*docs\/csharp\/programming-guide\/concepts\/covariance-contravariance.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-advanced-concepts/tech" ] - }, - "(?i).*docs\/csharp\/programming-guide\/concepts\/serialization.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-fundamentals/tech" ] - }, - "(?i).*docs\/csharp\/programming-guide\/concepts\/expression-trees.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-advanced-concepts/tech" ] - }, - "(?i).*docs\/csharp\/programming-guide\/concepts\/async.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-async/tech" ] - }, - "(?i).*docs\/csharp\/programming-guide\/concepts\/linq.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-linq/tech" ] - }, - "(?i).*docs\/csharp\/programming-guide\/concepts\/attributes.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-fundamentals/tech" ] - }, - "(?i).*docs\/csharp\/programming-guide\/xmldoc.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-fundamentals/tech" ] - }, - "(?i).*docs\/csharp\/programming-guide\/classes-and-structs.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-fundamentals/tech" ] - }, - "(?i).*docs\/csharp\/programming-guide\/delegates.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-fundamentals/tech" ] - }, - "(?i).*docs\/csharp\/programming-guide\/file-system.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-fundamentals/tech" ] - }, - "(?i).*docs\/csharp\/programming-guide\/events.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-fundamentals/tech" ] - }, - "(?i).*docs\/csharp\/programming-guide\/interfaces.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-fundamentals/tech" ] - }, - "(?i).*docs\/csharp\/tutorials.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-fundamentals/tech" ] - }, - "(?i).*docs\/csharp\/tutorials\/exploration.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-get-started/tech" ] - }, - "(?i).*docs\/csharp\/language-reference.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-language-reference/tech" ] - }, - "(?i).*docs\/csharp\/language-reference\/compiler-messages.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-diagnostics/tech" ] - }, - "(?i).*docs\/csharp\/roslyn-sdk.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-roslyn/tech" ] - }, - "(?i).*docs\/csharp\/tour-of-csharp.*": { - "labels-add": [ "dotnet-csharp/prod", "csharp-get-started/tech" ] - }, - - "(?i).*docs\/framework.*": { - "labels-add": "dotnet-framework/prod" - }, - "(?i).*docs\/framework\/configure-apps\/file-schema\/network.*": { - "labels-add": [ "dotnet-framework/prod", "dotnet-networking/tech" ] - }, - "(?i).*docs\/framework\/configure-apps\/file-schema\/wcf.*": { - "labels-add": [ "dotnet-framework/prod", "dotnet-wcf/tech" ] - }, - "(?i).*docs\/framework\/data\/adonet.*": { - "labels-add": [ "dotnet-framework/prod", "dotnet-data/tech" ] - }, - "(?i).*docs\/framework\/data\/wcf.*": { - "labels-add": [ "dotnet-framework/prod", "dotnet-wcf/tech" ] - }, - "(?i).*docs\/framework\/docker.*": { - "labels-add": [ "dotnet-framework/prod", "dotnet-docker/tech" ] - }, - "(?i).*docs\/framework\/install.*": { - "labels-add": [ "dotnet-framework/prod", "dotnet-install/tech" ] - }, - "(?i).*docs\/framework\/migration-guide.*": { - "labels-add": [ "dotnet-framework/prod", "dotnet-appcompat/tech" ] - }, - "(?i).*docs\/framework\/network-programming.*": { - "labels-add": [ "dotnet-framework/prod", "dotnet-networking/tech" ] - }, - "(?i).*docs\/framework\/wcf.*": { - "labels-add": [ "dotnet-framework/prod", "dotnet-wcf/tech" ] - }, - "(?i).*docs\/framework\/windows-workflow-foundation.*": { - "labels-add": [ "dotnet-framework/prod", "dotnet-wf/tech" ] - }, - - "(?i).*docs\/fsharp.*": { - "labels-add": "dotnet-fsharp/prod" - }, - - "(?i).*docs\/fundamentals.*": { - "labels-add": "dotnet-fundamentals/prod" - }, - - "(?i).*docs\/standard.*": { - "labels-add": "dotnet-fundamentals/prod" - }, - - "(?i).*docs\/standard\/analyzers.*": { - "labels-add": [ "dotnet-fundamentals/prod", "dotnet-analyzers/tech" ] - }, - - "(?i).*docs\/machine-learning.*": { - "labels-add": "dotnet-ml/prod" - }, - - "(?i).*docs\/spark.*": { - "labels-add": "dotnet-spark/prod" - }, - - "(?i).*docs\/standard\/data.*": { - "labels-add": "dotnet-data/prod" - }, - - "(?i).*docs\/standard\/design-guidelines.*": { - "labels-add": [ "dotnet/prod", "dotnet-standard/tech" ] - }, - - "(?i).*docs\/standard\/security.*": { - "labels-add": [ "dotnet/prod", "dotnet-security/tech" ] - }, - - "(?i).*docs\/visual-basic.*": { - "labels-add": "dotnet-visualbasic/prod" - }, - - "(?i).*docs\/visual-basic\/language-reference\/error-messages.*": { - "labels-add": [ "dotnet-visualbasic/prod", "vb-diagnostics/tech" ] - }, - - "(?i).*docs\/visual-basic\/misc.*": { - "labels-add": [ "dotnet-visualbasic/prod", "vb-diagnostics/tech" ] - } - - } - } - } - } - }, - "labeled": { - "processor-conditional-release6": { - "type": "query", - "value": "length(PullRequest.labels[?name == ':checkered_flag: Release .NET 6']) != `0`", - "actions": { - "projects-add": [ "132" ] - } - } - } - }, - "comment": { - "created": { - "processor-comment": { - "body": { - "^#please-review$": { - "condition-1": { - "type": "query", - "value": "Issue.state == 'open' && Issue.user.id == Comment.user.id", - "actions": { - "labels-add": "changes-addressed" - } - } - } - } - } - } - } -} diff --git a/.repoman.yml b/.repoman.yml new file mode 100644 index 0000000000000..27bdae9c78aaf --- /dev/null +++ b/.repoman.yml @@ -0,0 +1,353 @@ +revision: 1 +schema-version: 1 +owner-ms-alias: adegeo + +config: + DocMetadata: + Headers: + - ["---", "#### "] + + ParserRegex: "^\\* (.*): (.*)$" + + +issues: + + unlabeled: "labeled" + + labeled: + + # Handle issues with /prod /tech labels from label bot + # Manages the Not Triaged label for issues missing/having an org category issue + - check: + - type: query + value: "length(Issue.labels[?contains(name, '/prod') || contains(name, '/tech')]) != `0`" + pass: + - check: + - type: query + value: "length(Issue.labels[?name == 'doc-enhancement' || name == 'product-question' || name == 'in-progress' || name == 'test-issue' || name == 'kudos' || name == 'loc' || name == 'doc-bug' || name == 'product-feedback' || name == 'code-of-conduct' || name == 'support-request' || name == 'duplicate' || name == 'resolved-by-customer' || name == 'docs-experience' || name == 'doc-provided' || name == 'doc-idea' || name == 'needs-more-info']) != `0`" + pass: + - labels-remove: [":watch: Not Triaged"] + fail: + - labels-add: [":watch: Not Triaged"] + + # Add to .NET 6 project if .NET 6 label added + - check: + - type: query + value: "length(Issue.labels[?name == ':checkered_flag: Release .NET 6']) != `0`" + pass: + - projects-add: [132] + + opened: + # New issue opened, add Not Triaged + - labels-add: [":watch: Not Triaged"] + + # If breaking change issue metadata, add labels + - check: + - type: metadata-comment + name: issuetype + value: "(?i)breaking-change$" + pass: + - labels-add: ["breaking-change", "doc-idea"] + - projects-add: [135] + + reopened: + + # Remove won't fix label + - labels-remove: ["won't fix"] + + closed: + + # Issue closed, remove in-progress and not triaged labels + - labels-remove: ["in-progress", ":watch: Not Triaged"] + +pull_request: + + reopened: opened + + opened: + + # Set default sprint for new PRs + - milestone-set: "![sprint]" + + - check: + - type: query + value: "PullRequest.base.ref != 'live'" + pass: + - files-changed: + # csharplang + - path: "(?i).*_csharplang.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-spec/tech"] + + # vbspec + - path: "(?i).*_vblang\/spec.*" + run: + - labels-add: ["dotnet-visualbasic/prod", "vb-spec/tech"] + + # architecture + - path: "(?i).*docs\/architecture.*" + run: + - labels-add: ["dotnet-architecture/prod"] + - path: "(?i).*docs\/architecture\/blazor-for-web-forms-developers.*" + run: + - labels-add: ["dotnet-architecture/prod", "blazor/tech"] + - path: "(?i).*docs\/architecture\/cloud-native.*" + run: + - labels-add: ["dotnet-architecture/prod", "cloud-native/tech"] + - path: "(?i).*docs\/architecture\/containerized-lifecycle.*" + run: + - labels-add: ["dotnet-architecture/prod", "containerized-lifecycle/tech"] + - path: "(?i).*docs\/architecture\/grpc-for-wcf-developers.*" + run: + - labels-add: ["dotnet-architecture/prod", "grpc/tech"] + - path: "(?i).*docs\/architecture\/microservices.*" + run: + - labels-add: ["dotnet-architecture/prod", "microservices/tech"] + - path: "(?i).*docs\/architecture\/modernize-with-azure-containers.*" + run: + - labels-add: ["dotnet-architecture/prod", "modernize-with-azure-containers/tech"] + - path: "(?i).*docs\/architecture\/modern-web-apps-azure.*" + run: + - labels-add: ["dotnet-architecture/prod", "modern-web-apps-azure/tech"] + - path: "(?i).*docs\/architecture\/serverless.*" + run: + - labels-add: ["dotnet-architecture/prod", "serverless/tech"] + + # azure + - path: "(?i).*docs\/azure.*" + run: + - labels-add: ["dotnet-azure/prod"] + + # core + - path: "(?i).*docs\/core.*" + run: + - labels-add: ["dotnet-fundamentals/prod"] + - path: "(?i).*docs\/core\/tools.*" + run: + - labels-add: ["dotnet-fundamentals/prod", "dotnet-cli/tech"] + - path: "(?i).*docs\/core\/docker.*" + run: + - labels-add: ["dotnet-fundamentals/prod", "dotnet-docker/tech"] + + # core/install + - path: "(?i).*docs\/core\/install.*" + run: + - labels-add: ["dotnet/prod", "dotnet-install/tech"] + + # csharp + - path: "(?i).*docs\/csharp.*" + run: + - labels-add: ["dotnet-csharp/prod"] + - path: "(?i).*docs\/csharp\/fundamentals.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-fundamentals/tech"] + - path: "(?i).*docs\/csharp\/misc.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-diagnostics/tech"] + - path: "(?i).*docs\/csharp\/whats-new.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-whats-new/tech"] + - path: "(?i).*docs\/csharp\/how-to.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-fundamentals/tech"] + - path: "(?i).*docs\/csharp\/linq.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-linq/tech"] + - path: "(?i).*docs\/csharp\/programming-guide\/indexers.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-fundamentals/tech"] + - path: "(?i).*docs\/csharp\/programming-guide\/generics.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-fundamentals/tech"] + - path: "(?i).*docs\/csharp\/programming-guide\/strings.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-fundamentals/tech"] + - path: "(?i).*docs\/csharp\/programming-guide\/types.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-fundamentals/tech"] + - path: "(?i).*docs\/csharp\/programming-guide\/statements-expressions-operators.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-fundamentals/tech"] + - path: "(?i).*docs\/csharp\/programming-guide\/interop.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-advanced-concepts/tech"] + - path: "(?i).*docs\/csharp\/language-reference\/unsafe-code.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-advanced-concepts/tech"] + - path: "(?i).*docs\/csharp\/programming-guide\/namespaces.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-fundamentals/tech"] + - path: "(?i).*docs\/csharp\/programming-guide\/arrays.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-fundamentals/tech"] + - path: "(?i).*docs\/csharp\/programming-guide\/concepts\/covariance-contravariance.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-advanced-concepts/tech"] + - path: "(?i).*docs\/csharp\/programming-guide\/concepts\/serialization.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-fundamentals/tech"] + - path: "(?i).*docs\/csharp\/programming-guide\/concepts\/expression-trees.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-advanced-concepts/tech"] + - path: "(?i).*docs\/csharp\/programming-guide\/concepts\/async.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-async/tech"] + - path: "(?i).*docs\/csharp\/programming-guide\/concepts\/linq.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-linq/tech"] + - path: "(?i).*docs\/csharp\/programming-guide\/concepts\/attributes.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-fundamentals/tech"] + - path: "(?i).*docs\/csharp\/programming-guide\/xmldoc.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-fundamentals/tech"] + - path: "(?i).*docs\/csharp\/programming-guide\/classes-and-structs.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-fundamentals/tech"] + - path: "(?i).*docs\/csharp\/programming-guide\/delegates.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-fundamentals/tech"] + - path: "(?i).*docs\/csharp\/programming-guide\/file-system.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-fundamentals/tech"] + - path: "(?i).*docs\/csharp\/programming-guide\/events.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-fundamentals/tech"] + - path: "(?i).*docs\/csharp\/programming-guide\/interfaces.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-fundamentals/tech"] + - path: "(?i).*docs\/csharp\/tutorials.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-fundamentals/tech"] + - path: "(?i).*docs\/csharp\/tutorials\/exploration.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-get-started/tech"] + - path: "(?i).*docs\/csharp\/language-reference.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-language-reference/tech"] + - path: "(?i).*docs\/csharp\/language-reference\/compiler-messages.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-diagnostics/tech"] + - path: "(?i).*docs\/csharp\/roslyn-sdk.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-roslyn/tech"] + - path: "(?i).*docs\/csharp\/tour-of-csharp.*" + run: + - labels-add: ["dotnet-csharp/prod", "csharp-get-started/tech"] + + # framework + - path: "(?i).*docs\/framework.*" + run: + - labels-add: ["dotnet-framework/prod"] + - path: "(?i).*docs\/framework\/configure-apps\/file-schema\/network.*" + run: + - labels-add: [ "dotnet-framework/prod", "dotnet-networking/tech" ] + - path: "(?i).*docs\/framework\/configure-apps\/file-schema\/wcf.*" + run: + - labels-add: [ "dotnet-framework/prod", "dotnet-wcf/tech" ] + - path: "(?i).*docs\/framework\/data\/adonet.*" + run: + - labels-add: [ "dotnet-framework/prod", "dotnet-data/tech" ] + - path: "(?i).*docs\/framework\/data\/wcf.*" + run: + - labels-add: [ "dotnet-framework/prod", "dotnet-wcf/tech" ] + - path: "(?i).*docs\/framework\/docker.*" + run: + - labels-add: [ "dotnet-framework/prod", "dotnet-docker/tech" ] + - path: "(?i).*docs\/framework\/install.*" + run: + - labels-add: [ "dotnet-framework/prod", "dotnet-install/tech" ] + - path: "(?i).*docs\/framework\/migration-guide.*" + run: + - labels-add: [ "dotnet-framework/prod", "dotnet-appcompat/tech" ] + - path: "(?i).*docs\/framework\/network-programming.*" + run: + - labels-add: [ "dotnet-framework/prod", "dotnet-networking/tech" ] + - path: "(?i).*docs\/framework\/wcf.*" + run: + - labels-add: [ "dotnet-framework/prod", "dotnet-wcf/tech" ] + - path: "(?i).*docs\/framework\/windows-workflow-foundation.*" + run: + - labels-add: [ "dotnet-framework/prod", "dotnet-wf/tech" ] + + # fsharp + - path: "(?i).*docs\/fsharp.*" + run: + - labels-add: ["dotnet-fsharp/prod"] + + # fundamentals + - path: "(?i).*docs\/fundamentals.*" + run: + - labels-add: ["dotnet-fundamentals/prod"] + + # standard + - path: "(?i).*docs\/standard.*" + run: + - labels-add: ["dotnet-fundamentals/prod"] + + # analyzers + - path: "(?i).*docs\/standard\/analyzers.*" + run: + - labels-add: [ "dotnet-fundamentals/prod", "dotnet-analyzers/tech" ] + + # machine learning + - path: "(?i).*docs\/machine-learning.*" + run: + - labels-add: ["dotnet-ml/prod"] + + # spark + - path: "(?i).*docs\/spark.*" + run: + - labels-add: ["dotnet-spark/prod"] + + # data + - path: "(?i).*docs\/standard\/data.*" + run: + - labels-add: ["dotnet-data/prod"] + + # design guidelines + - path: "(?i).*docs\/standard\/design-guidelines.*" + run: + - labels-add: [ "dotnet/prod", "dotnet-standard/tech" ] + + # security + - path: "(?i).*docs\/standard\/security.*" + run: + - labels-add: [ "dotnet/prod", "dotnet-security/tech" ] + + # visual-basic + - path: "(?i).*docs\/visual-basic.*" + run: + - labels-add: ["dotnet-visualbasic/prod"] + + # visual-basic lang ref error messages + - path: "(?i).*docs\/visual-basic\/language-reference\/error-messages.*" + run: + - labels-add: [ "dotnet-visualbasic/prod", "vb-diagnostics/tech" ] + + # visual-basic misc + - path: "(?i).*docs\/visual-basic\/misc.*" + run: + - labels-add: ["dotnet-visualbasic/prod", "vb-diagnostics/tech"] + + labeled: + + # Add to .NET 6 project if .NET 6 label added + - check: + - type: query + value: "length(Issue.labels[?name == ':checkered_flag: Release .NET 6']) != `0`" + pass: + - projects-add: [132] + +issue_comment: + + created: + + # someone creates a comment with #please-review in it, add changes-addressed label + - check: + - type: query + value: "Issue.state == 'open' && Issue.user.id == Comment.user.id" + - type: comment-body + value: ^#please-review$ + pass: + - labels-add: ["changes-addressed"] From d34042d234a90d74df1baee17f664f89d5abd67f Mon Sep 17 00:00:00 2001 From: Tom Dykstra Date: Thu, 10 Jun 2021 12:37:31 -0700 Subject: [PATCH 002/105] update ms.topic (#24629) --- docfx.json | 1 + 1 file changed, 1 insertion(+) diff --git a/docfx.json b/docfx.json index 08e04b395f992..8dfcea3411e29 100644 --- a/docfx.json +++ b/docfx.json @@ -205,6 +205,7 @@ "docs/framework/configure-apps/file-schema/**/**.md": "reference", "docs/framework/data/adonet/ef/language-reference/*-entity-sql.md": "language-reference", "docs/framework/debug-trace-profile/*-mda.md": "reference", + "docs/framework/migration-guide/**/**.md": "reference", "docs/framework/performance/*-etw-events.md": "reference", "docs/framework/tools/**/**.md": "reference", "docs/framework/unmanaged-api/**/**.md": "reference", From dd4ac4f657fa69cd99e6c83d312a99dacc8993c8 Mon Sep 17 00:00:00 2001 From: "Andy (Steve) De George" <67293991+adegeo@users.noreply.github.com> Date: Thu, 10 Jun 2021 14:14:27 -0700 Subject: [PATCH 003/105] Update build-validation.yml (#24634) --- .github/workflows/build-validation.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-validation.yml b/.github/workflows/build-validation.yml index de5b15f8d615a..edcbbf048c853 100644 --- a/.github/workflows/build-validation.yml +++ b/.github/workflows/build-validation.yml @@ -25,8 +25,8 @@ on: branches: [ main ] env: - DOTNET_INSTALLER_CHANNEL: 'release/5.0.1xx' - DOTNET_DO_INSTALL: 'false' + DOTNET_INSTALLER_CHANNEL: '6.0' + DOTNET_DO_INSTALL: 'true' EnableNuGetPackageRestore: 'True' # A workflow run is made up of one or more jobs that can run sequentially or in parallel From 44f3085ef90a49d695516f50e5af9698138ece2e Mon Sep 17 00:00:00 2001 From: Azure SDK Bot <53356347+azure-sdk@users.noreply.github.com> Date: Thu, 10 Jun 2021 15:15:14 -0700 Subject: [PATCH 004/105] Update package index with latest published versions (#24632) --- docs/azure/includes/dotnet-all.md | 18 +++++++++--------- docs/azure/includes/dotnet-new.md | 8 ++++---- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/azure/includes/dotnet-all.md b/docs/azure/includes/dotnet-all.md index f1258782761b6..66f8435e842b0 100644 --- a/docs/azure/includes/dotnet-all.md +++ b/docs/azure/includes/dotnet-all.md @@ -10,13 +10,13 @@ | Azure Object Anchors Conversion | NuGet [0.2.0-beta.1](https://www.nuget.org/packages/Azure.MixedReality.ObjectAnchors.Conversion/0.2.0-beta.1) | [docs](/dotnet/api/overview/azure/MixedReality.ObjectAnchors.Conversion-readme-pre) | GitHub [0.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.MixedReality.ObjectAnchors.Conversion_0.2.0-beta.1/sdk/objectanchors/Azure.MixedReality.ObjectAnchors.Conversion/) | | Azure Remote Rendering | NuGet [1.0.1](https://www.nuget.org/packages/Azure.MixedReality.RemoteRendering/1.0.1) | [docs](/dotnet/api/overview/azure/MixedReality.RemoteRendering-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.MixedReality.RemoteRendering_1.0.1/sdk/remoterendering/Azure.MixedReality.RemoteRendering/) | | Azure Video Analyzer Edge | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.Media.VideoAnalyzer.Edge/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/Media.VideoAnalyzer.Edge-readme-pre) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Media.VideoAnalyzer.Edge_1.0.0-beta.4/sdk/videoanalyzer/Azure.Media.VideoAnalyzer.Edge/) | -| Cognitive Search | NuGet [11.2.1](https://www.nuget.org/packages/Azure.Search.Documents/11.2.1)
NuGet [11.3.0-beta.2](https://www.nuget.org/packages/Azure.Search.Documents/11.3.0-beta.2) | [docs](/dotnet/api/overview/azure/Search.Documents-readme) | GitHub [11.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Search.Documents_11.2.1/sdk/search/Azure.Search.Documents/)
GitHub [11.3.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Search.Documents_11.3.0-beta.2/sdk/search/Azure.Search.Documents/) | +| Cognitive Search | NuGet [11.3.0](https://www.nuget.org/packages/Azure.Search.Documents/11.3.0) | [docs](/dotnet/api/overview/azure/Search.Documents-readme) | GitHub [11.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Search.Documents_11.3.0/sdk/search/Azure.Search.Documents/) | | Communication Chat | NuGet [1.0.1](https://www.nuget.org/packages/Azure.Communication.Chat/1.0.1) | [docs](/dotnet/api/overview/azure/Communication.Chat-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Chat_1.0.1/sdk/communication/Azure.Communication.Chat/) | | Communication Common | NuGet [1.0.1](https://www.nuget.org/packages/Azure.Communication.Common/1.0.1) | [docs](/dotnet/api/overview/azure/Communication.Common-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Common_1.0.1/sdk/communication/Azure.Communication.Common/) | | Communication Identity | NuGet [1.0.1](https://www.nuget.org/packages/Azure.Communication.Identity/1.0.1) | [docs](/dotnet/api/overview/azure/Communication.Identity-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Identity_1.0.1/sdk/communication/Azure.Communication.Identity/) | | Communication Phone Numbers | NuGet [1.0.1](https://www.nuget.org/packages/Azure.Communication.PhoneNumbers/1.0.1) | [docs](/dotnet/api/overview/azure/Communication.PhoneNumbers-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.PhoneNumbers_1.0.1/sdk/communication/Azure.Communication.PhoneNumbers/) | | Communication SMS | NuGet [1.0.1](https://www.nuget.org/packages/Azure.Communication.Sms/1.0.1) | [docs](/dotnet/api/overview/azure/Communication.Sms-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Sms_1.0.1/sdk/communication/Azure.Communication.Sms/) | -| ConfidentialLedger | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Security.ConfidentialLedger/1.0.0-beta.2) | | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.ConfidentialLedger_1.0.0-beta.2/sdk/confidentialledger/Azure.Security.ConfidentialLedger/) | +| ConfidentialLedger | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Security.ConfidentialLedger/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Security.ConfidentialLedger-readme-pre) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.ConfidentialLedger_1.0.0-beta.2/sdk/confidentialledger/Azure.Security.ConfidentialLedger/) | | ConfidentialLedger | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Storage.ConfidentialLedger/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Storage.ConfidentialLedger-readme-pre) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.ConfidentialLedger_1.0.0-beta.1/sdk/confidentialledger/Azure.Storage.ConfidentialLedger/) | | Container Registry | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Containers.ContainerRegistry/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Containers.ContainerRegistry-readme-pre) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Containers.ContainerRegistry_1.0.0-beta.3/sdk/containerregistry/Azure.Containers.ContainerRegistry/) | | Core | NuGet [1.15.0](https://www.nuget.org/packages/Azure.Core/1.15.0) | [docs](/dotnet/api/overview/azure/Core-readme) | GitHub [1.15.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core_1.15.0/sdk/core/Azure.Core/) | @@ -39,7 +39,7 @@ | Media Analytics Edge | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Media.Analytics.Edge/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Media.Analytics.Edge-readme-pre) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Media.Analytics.Edge_1.0.0-beta.1/sdk/mediaservices/Azure.Media.Analytics.Edge) | | Metrics Advisor | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.AI.MetricsAdvisor/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/AI.MetricsAdvisor-readme-pre) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.MetricsAdvisor_1.0.0-beta.4/sdk/metricsadvisor/Azure.AI.MetricsAdvisor/) | | Monitor OpenTelemetry Exporter | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Monitor.OpenTelemetry.Exporter/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Monitor.OpenTelemetry.Exporter-readme-pre) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.OpenTelemetry.Exporter_1.0.0-beta.2/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/) | -| Monitor Query | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Monitor.Query/1.0.0-beta.1) | | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.Query_1.0.0-beta.1/sdk/monitor/Azure.Monitor.Query/) | +| Monitor Query | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Monitor.Query/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Monitor.Query-readme-pre) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.Query_1.0.0-beta.1/sdk/monitor/Azure.Monitor.Query/) | | Purview Catalog | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Analytics.Purview.Catalog/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Analytics.Purview.Catalog-readme-pre) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Purview.Catalog_1.0.0-beta.1/sdk/purview/Azure.Analytics.Purview.Catalog/) | | Purview Scanning | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Analytics.Purview.Scanning/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Analytics.Purview.Scanning-readme-pre) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Purview.Scanning_1.0.0-beta.1/sdk/purview/Azure.Analytics.Purview.Scanning/) | | Service Bus | NuGet [7.1.2](https://www.nuget.org/packages/Azure.Messaging.ServiceBus/7.1.2)
NuGet [7.2.0-beta.3](https://www.nuget.org/packages/Azure.Messaging.ServiceBus/7.2.0-beta.3) | [docs](/dotnet/api/overview/azure/Messaging.ServiceBus-readme) | GitHub [7.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.ServiceBus_7.1.2/sdk/servicebus/Azure.Messaging.ServiceBus/)
GitHub [7.2.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.ServiceBus_7.2.0-beta.3/sdk/servicebus/Azure.Messaging.ServiceBus/) | @@ -56,7 +56,7 @@ | Synapse - Monitoring | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Analytics.Synapse.Monitoring/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Analytics.Synapse.Monitoring-readme-pre) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Synapse.Monitoring_1.0.0-beta.3/sdk/synapse/Azure.Analytics.Synapse.Monitoring/) | | Synapse - Spark | NuGet [1.0.0-preview.6](https://www.nuget.org/packages/Azure.Analytics.Synapse.Spark/1.0.0-preview.6) | [docs](/dotnet/api/overview/azure/Analytics.Synapse.Spark-readme-pre) | GitHub [1.0.0-preview.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Synapse.Spark_1.0.0-preview.6/sdk/synapse/Azure.Analytics.Synapse.Spark/) | | System Memory Data | NuGet [1.0.2](https://www.nuget.org/packages/System.Memory.Data/1.0.2) | [docs](/dotnet/api/overview/azure/System.Memory.Data-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-net/tree/System.Memory.Data_1.0.2/sdk/core/System.Memory.Data/) | -| Tables | NuGet [12.0.0](https://www.nuget.org/packages/Azure.Data.Tables/12.0.0) | [docs](/dotnet/api/overview/azure/Data.Tables-readme) | GitHub [12.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Data.Tables_12.0.0/sdk/tables/Azure.Data.Tables/) | +| Tables | NuGet [12.0.1](https://www.nuget.org/packages/Azure.Data.Tables/12.0.1) | [docs](/dotnet/api/overview/azure/Data.Tables-readme) | GitHub [12.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Data.Tables_12.0.1/sdk/tables/Azure.Data.Tables/) | | Text Analytics | NuGet [5.1.0-beta.7](https://www.nuget.org/packages/Azure.AI.TextAnalytics/5.1.0-beta.7) | [docs](/dotnet/api/overview/azure/AI.TextAnalytics-readme-pre) | GitHub [5.1.0-beta.7](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.TextAnalytics_5.1.0-beta.7/sdk/textanalytics/Azure.AI.TextAnalytics/) | | WebJobs Extensions - Event Grid | NuGet [3.0.0-beta.3](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.EventGrid/3.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.EventGrid-readme-pre) | GitHub [3.0.0-beta.3](https://github.com/Azure/azure-functions-eventgrid-extension/tree/v2.1.0/src/EventGridExtension) | | WebJobs Extensions - Event Hubs | NuGet [5.0.0-beta.6](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.EventHubs/5.0.0-beta.6) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.EventHubs-readme-pre) | GitHub [5.0.0-beta.6](https://github.com/Azure/azure-webjobs-sdk-extensions) | @@ -155,7 +155,7 @@ | Client Runtime - Azure Test Framework | NuGet [1.7.7](https://www.nuget.org/packages/Microsoft.Rest.ClientRuntime.Azure.TestFramework/1.7.7) | | GitHub [1.7.7](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Rest.ClientRuntime.Azure.TestFramework_1.7.7/sdk/mgmtcommon/TestFramework/ClientRuntime.Azure.TestFramework) | | Client Runtime - ETW | NuGet [2.1.3](https://www.nuget.org/packages/Microsoft.Rest.ClientRuntime.Etw/2.1.3) | | GitHub [2.1.3](https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/mgmtcommon/ClientRuntime.Etw) | | Client Runtime - Log4Net | NuGet [2.1.4](https://www.nuget.org/packages/Microsoft.Rest.ClientRuntime.Log4Net/2.1.4) | | GitHub [2.1.4](https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/mgmtcommon/ClientRuntime.Log4Net) | -| Cognitive Search | NuGet [11.2.1](https://www.nuget.org/packages/Azure.Search.Documents/11.2.1)
NuGet [11.3.0-beta.2](https://www.nuget.org/packages/Azure.Search.Documents/11.3.0-beta.2) | [docs](/dotnet/api/overview/azure/Search.Documents-readme) | GitHub [11.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Search.Documents_11.2.1/sdk/search/Azure.Search.Documents/)
GitHub [11.3.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Search.Documents_11.3.0-beta.2/sdk/search/Azure.Search.Documents/) | +| Cognitive Search | NuGet [11.3.0](https://www.nuget.org/packages/Azure.Search.Documents/11.3.0) | [docs](/dotnet/api/overview/azure/Search.Documents-readme) | GitHub [11.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Search.Documents_11.3.0/sdk/search/Azure.Search.Documents/) | | Commerce Usage Aggregates | NuGet [1.5.3](https://www.nuget.org/packages/Microsoft.Azure.Commerce.UsageAggregates/1.5.3) | | | | Common | NuGet [2.2.1](https://www.nuget.org/packages/Microsoft.Azure.Common/2.2.1) | | | | Common - Authentication | NuGet [1.7.0-preview](https://www.nuget.org/packages/Microsoft.Azure.Common.Authentication/1.7.0-preview) | | | @@ -166,7 +166,7 @@ | Communication Phone Numbers | NuGet [1.0.1](https://www.nuget.org/packages/Azure.Communication.PhoneNumbers/1.0.1) | [docs](/dotnet/api/overview/azure/Communication.PhoneNumbers-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.PhoneNumbers_1.0.1/sdk/communication/Azure.Communication.PhoneNumbers/) | | Communication SMS | NuGet [1.0.1](https://www.nuget.org/packages/Azure.Communication.Sms/1.0.1) | [docs](/dotnet/api/overview/azure/Communication.Sms-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Sms_1.0.1/sdk/communication/Azure.Communication.Sms/) | | Computer Vision | NuGet [7.0.0](https://www.nuget.org/packages/Microsoft.Azure.CognitiveServices.Vision.ComputerVision/7.0.0) | | GitHub [7.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.CognitiveServices.Vision.ComputerVision_6.0.0-preview.1/sdk/cognitiveservices/Vision.ComputerVision) | -| ConfidentialLedger | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Security.ConfidentialLedger/1.0.0-beta.2) | | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.ConfidentialLedger_1.0.0-beta.2/sdk/confidentialledger/Azure.Security.ConfidentialLedger/) | +| ConfidentialLedger | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Security.ConfidentialLedger/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Security.ConfidentialLedger-readme-pre) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.ConfidentialLedger_1.0.0-beta.2/sdk/confidentialledger/Azure.Security.ConfidentialLedger/) | | ConfidentialLedger | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Storage.ConfidentialLedger/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Storage.ConfidentialLedger-readme-pre) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.ConfidentialLedger_1.0.0-beta.1/sdk/confidentialledger/Azure.Storage.ConfidentialLedger/) | | Configuration Manager | NuGet [4.0.0](https://www.nuget.org/packages/Microsoft.Azure.ConfigurationManager/4.0.0) | | | | Container Registry | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Containers.ContainerRegistry/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Containers.ContainerRegistry-readme-pre) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Containers.ContainerRegistry_1.0.0-beta.3/sdk/containerregistry/Azure.Containers.ContainerRegistry/) | @@ -175,7 +175,7 @@ | Core | NuGet [1.15.0](https://www.nuget.org/packages/Azure.Core/1.15.0) | [docs](/dotnet/api/overview/azure/Core-readme) | GitHub [1.15.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core_1.15.0/sdk/core/Azure.Core/) | | Core - AMQP | NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.Core.Amqp/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/Core.Amqp-readme-pre) | GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core.Amqp_1.1.0-beta.1/sdk/core/Azure.Core.Amqp/) | | Core Newtonsoft Json | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.Core.NewtonsoftJson/1.0.0)
NuGet [1.0.0-preview.1](https://www.nuget.org/packages/Microsoft.Azure.Core.NewtonsoftJson/1.0.0-preview.1) | | | -| Core Spatial | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.Core.Spatial/1.0.0)
NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Microsoft.Azure.Core.Spatial/1.0.0-beta.1) | | | +| Core Spatial | NuGet [1.1.0](https://www.nuget.org/packages/Microsoft.Azure.Core.Spatial/1.1.0) | | | | Core Spatial Newtonsoft Json | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.Core.Spatial.NewtonsoftJson/1.0.0)
NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Microsoft.Azure.Core.Spatial.NewtonsoftJson/1.0.0-beta.1) | | | | Cosmos DB | NuGet [4.0.0-preview3](https://www.nuget.org/packages/Azure.Cosmos/4.0.0-preview3) | [docs](/dotnet/api/azure.cosmos) | GitHub [4.0.0-preview3](https://github.com/Azure/azure-cosmos-dotnet-v3/tree/releases/4.0.0-preview3) | | Cosmos DB | NuGet [3.19.0](https://www.nuget.org/packages/Microsoft.Azure.Cosmos/3.19.0)
NuGet [3.19.0-preview1](https://www.nuget.org/packages/Microsoft.Azure.Cosmos/3.19.0-preview1) | [docs](/dotnet/api/overview/azure/cosmosdb) | GitHub [3.19.0](https://github.com/Azure/azure-cosmos-dotnet-v3/tree/3.12.0/Microsoft.Azure.Cosmos) | @@ -267,7 +267,7 @@ | Mobile Server - Cross Domain | NuGet [2.0.3](https://www.nuget.org/packages/Microsoft.Azure.Mobile.Server.CrossDomain/2.0.3) | | | | Mobile Service - Resource Broker | NuGet [1.0.2.1](https://www.nuget.org/packages/Microsoft.WindowsAzure.Mobile.Service.ResourceBroker/1.0.2.1) | | | | Monitor OpenTelemetry Exporter | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Monitor.OpenTelemetry.Exporter/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Monitor.OpenTelemetry.Exporter-readme-pre) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.OpenTelemetry.Exporter_1.0.0-beta.2/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/) | -| Monitor Query | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Monitor.Query/1.0.0-beta.1) | | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.Query_1.0.0-beta.1/sdk/monitor/Azure.Monitor.Query/) | +| Monitor Query | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Monitor.Query/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Monitor.Query-readme-pre) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.Query_1.0.0-beta.1/sdk/monitor/Azure.Monitor.Query/) | | News Search | NuGet [2.0.0](https://www.nuget.org/packages/Microsoft.Azure.CognitiveServices.Search.NewsSearch/2.0.0) | | | | Notification Hubs | NuGet [4.1.0](https://www.nuget.org/packages/Microsoft.Azure.NotificationHubs/4.1.0) | | GitHub [4.1.0](https://github.com/Azure/azure-notificationhubs-dotnet) | | Operational Insights | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.OperationalInsights/1.0.0) | | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/operationalinsights/Microsoft.Azure.OperationalInsights) | @@ -315,7 +315,7 @@ | Synapse - Monitoring | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Analytics.Synapse.Monitoring/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Analytics.Synapse.Monitoring-readme-pre) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Synapse.Monitoring_1.0.0-beta.3/sdk/synapse/Azure.Analytics.Synapse.Monitoring/) | | Synapse - Spark | NuGet [1.0.0-preview.6](https://www.nuget.org/packages/Azure.Analytics.Synapse.Spark/1.0.0-preview.6) | [docs](/dotnet/api/overview/azure/Analytics.Synapse.Spark-readme-pre) | GitHub [1.0.0-preview.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Synapse.Spark_1.0.0-preview.6/sdk/synapse/Azure.Analytics.Synapse.Spark/) | | System Memory Data | NuGet [1.0.2](https://www.nuget.org/packages/System.Memory.Data/1.0.2) | [docs](/dotnet/api/overview/azure/System.Memory.Data-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-net/tree/System.Memory.Data_1.0.2/sdk/core/System.Memory.Data/) | -| Tables | NuGet [12.0.0](https://www.nuget.org/packages/Azure.Data.Tables/12.0.0) | [docs](/dotnet/api/overview/azure/Data.Tables-readme) | GitHub [12.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Data.Tables_12.0.0/sdk/tables/Azure.Data.Tables/) | +| Tables | NuGet [12.0.1](https://www.nuget.org/packages/Azure.Data.Tables/12.0.1) | [docs](/dotnet/api/overview/azure/Data.Tables-readme) | GitHub [12.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Data.Tables_12.0.1/sdk/tables/Azure.Data.Tables/) | | Tables | NuGet [2.0.0-preview](https://www.nuget.org/packages/Microsoft.Azure.Cosmos.Table/2.0.0-preview) | | | | Tables | NuGet [2.1.2](https://www.nuget.org/packages/Microsoft.Azure.CosmosDB.Table/2.1.2) | | | | Template | NuGet [1.0.2-preview1](https://www.nuget.org/packages/Microsoft.Azure.Template/1.0.2-preview1) | | | diff --git a/docs/azure/includes/dotnet-new.md b/docs/azure/includes/dotnet-new.md index fe6bc7f76eca3..9d690faca373e 100644 --- a/docs/azure/includes/dotnet-new.md +++ b/docs/azure/includes/dotnet-new.md @@ -10,13 +10,13 @@ | Azure Object Anchors Conversion | NuGet [0.2.0-beta.1](https://www.nuget.org/packages/Azure.MixedReality.ObjectAnchors.Conversion/0.2.0-beta.1) | [docs](/dotnet/api/overview/azure/MixedReality.ObjectAnchors.Conversion-readme-pre) | GitHub [0.2.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.MixedReality.ObjectAnchors.Conversion_0.2.0-beta.1/sdk/objectanchors/Azure.MixedReality.ObjectAnchors.Conversion/) | | Azure Remote Rendering | NuGet [1.0.1](https://www.nuget.org/packages/Azure.MixedReality.RemoteRendering/1.0.1) | [docs](/dotnet/api/overview/azure/MixedReality.RemoteRendering-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.MixedReality.RemoteRendering_1.0.1/sdk/remoterendering/Azure.MixedReality.RemoteRendering/) | | Azure Video Analyzer Edge | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.Media.VideoAnalyzer.Edge/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/Media.VideoAnalyzer.Edge-readme-pre) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Media.VideoAnalyzer.Edge_1.0.0-beta.4/sdk/videoanalyzer/Azure.Media.VideoAnalyzer.Edge/) | -| Cognitive Search | NuGet [11.2.1](https://www.nuget.org/packages/Azure.Search.Documents/11.2.1)
NuGet [11.3.0-beta.2](https://www.nuget.org/packages/Azure.Search.Documents/11.3.0-beta.2) | [docs](/dotnet/api/overview/azure/Search.Documents-readme) | GitHub [11.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Search.Documents_11.2.1/sdk/search/Azure.Search.Documents/)
GitHub [11.3.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Search.Documents_11.3.0-beta.2/sdk/search/Azure.Search.Documents/) | +| Cognitive Search | NuGet [11.3.0](https://www.nuget.org/packages/Azure.Search.Documents/11.3.0) | [docs](/dotnet/api/overview/azure/Search.Documents-readme) | GitHub [11.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Search.Documents_11.3.0/sdk/search/Azure.Search.Documents/) | | Communication Chat | NuGet [1.0.1](https://www.nuget.org/packages/Azure.Communication.Chat/1.0.1) | [docs](/dotnet/api/overview/azure/Communication.Chat-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Chat_1.0.1/sdk/communication/Azure.Communication.Chat/) | | Communication Common | NuGet [1.0.1](https://www.nuget.org/packages/Azure.Communication.Common/1.0.1) | [docs](/dotnet/api/overview/azure/Communication.Common-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Common_1.0.1/sdk/communication/Azure.Communication.Common/) | | Communication Identity | NuGet [1.0.1](https://www.nuget.org/packages/Azure.Communication.Identity/1.0.1) | [docs](/dotnet/api/overview/azure/Communication.Identity-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Identity_1.0.1/sdk/communication/Azure.Communication.Identity/) | | Communication Phone Numbers | NuGet [1.0.1](https://www.nuget.org/packages/Azure.Communication.PhoneNumbers/1.0.1) | [docs](/dotnet/api/overview/azure/Communication.PhoneNumbers-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.PhoneNumbers_1.0.1/sdk/communication/Azure.Communication.PhoneNumbers/) | | Communication SMS | NuGet [1.0.1](https://www.nuget.org/packages/Azure.Communication.Sms/1.0.1) | [docs](/dotnet/api/overview/azure/Communication.Sms-readme) | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Communication.Sms_1.0.1/sdk/communication/Azure.Communication.Sms/) | -| ConfidentialLedger | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Security.ConfidentialLedger/1.0.0-beta.2) | | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.ConfidentialLedger_1.0.0-beta.2/sdk/confidentialledger/Azure.Security.ConfidentialLedger/) | +| ConfidentialLedger | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Security.ConfidentialLedger/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Security.ConfidentialLedger-readme-pre) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.ConfidentialLedger_1.0.0-beta.2/sdk/confidentialledger/Azure.Security.ConfidentialLedger/) | | ConfidentialLedger | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Storage.ConfidentialLedger/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Storage.ConfidentialLedger-readme-pre) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.ConfidentialLedger_1.0.0-beta.1/sdk/confidentialledger/Azure.Storage.ConfidentialLedger/) | | Container Registry | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Containers.ContainerRegistry/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Containers.ContainerRegistry-readme-pre) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Containers.ContainerRegistry_1.0.0-beta.3/sdk/containerregistry/Azure.Containers.ContainerRegistry/) | | Core | NuGet [1.15.0](https://www.nuget.org/packages/Azure.Core/1.15.0) | [docs](/dotnet/api/overview/azure/Core-readme) | GitHub [1.15.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core_1.15.0/sdk/core/Azure.Core/) | @@ -39,7 +39,7 @@ | Media Analytics Edge | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Media.Analytics.Edge/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Media.Analytics.Edge-readme-pre) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Media.Analytics.Edge_1.0.0-beta.1/sdk/mediaservices/Azure.Media.Analytics.Edge) | | Metrics Advisor | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.AI.MetricsAdvisor/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/AI.MetricsAdvisor-readme-pre) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.MetricsAdvisor_1.0.0-beta.4/sdk/metricsadvisor/Azure.AI.MetricsAdvisor/) | | Monitor OpenTelemetry Exporter | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Monitor.OpenTelemetry.Exporter/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Monitor.OpenTelemetry.Exporter-readme-pre) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.OpenTelemetry.Exporter_1.0.0-beta.2/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/) | -| Monitor Query | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Monitor.Query/1.0.0-beta.1) | | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.Query_1.0.0-beta.1/sdk/monitor/Azure.Monitor.Query/) | +| Monitor Query | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Monitor.Query/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Monitor.Query-readme-pre) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.Query_1.0.0-beta.1/sdk/monitor/Azure.Monitor.Query/) | | Purview Catalog | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Analytics.Purview.Catalog/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Analytics.Purview.Catalog-readme-pre) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Purview.Catalog_1.0.0-beta.1/sdk/purview/Azure.Analytics.Purview.Catalog/) | | Purview Scanning | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Analytics.Purview.Scanning/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Analytics.Purview.Scanning-readme-pre) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Purview.Scanning_1.0.0-beta.1/sdk/purview/Azure.Analytics.Purview.Scanning/) | | Service Bus | NuGet [7.1.2](https://www.nuget.org/packages/Azure.Messaging.ServiceBus/7.1.2)
NuGet [7.2.0-beta.3](https://www.nuget.org/packages/Azure.Messaging.ServiceBus/7.2.0-beta.3) | [docs](/dotnet/api/overview/azure/Messaging.ServiceBus-readme) | GitHub [7.1.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.ServiceBus_7.1.2/sdk/servicebus/Azure.Messaging.ServiceBus/)
GitHub [7.2.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.ServiceBus_7.2.0-beta.3/sdk/servicebus/Azure.Messaging.ServiceBus/) | @@ -56,7 +56,7 @@ | Synapse - Monitoring | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Analytics.Synapse.Monitoring/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Analytics.Synapse.Monitoring-readme-pre) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Synapse.Monitoring_1.0.0-beta.3/sdk/synapse/Azure.Analytics.Synapse.Monitoring/) | | Synapse - Spark | NuGet [1.0.0-preview.6](https://www.nuget.org/packages/Azure.Analytics.Synapse.Spark/1.0.0-preview.6) | [docs](/dotnet/api/overview/azure/Analytics.Synapse.Spark-readme-pre) | GitHub [1.0.0-preview.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Synapse.Spark_1.0.0-preview.6/sdk/synapse/Azure.Analytics.Synapse.Spark/) | | System Memory Data | NuGet [1.0.2](https://www.nuget.org/packages/System.Memory.Data/1.0.2) | [docs](/dotnet/api/overview/azure/System.Memory.Data-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-net/tree/System.Memory.Data_1.0.2/sdk/core/System.Memory.Data/) | -| Tables | NuGet [12.0.0](https://www.nuget.org/packages/Azure.Data.Tables/12.0.0) | [docs](/dotnet/api/overview/azure/Data.Tables-readme) | GitHub [12.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Data.Tables_12.0.0/sdk/tables/Azure.Data.Tables/) | +| Tables | NuGet [12.0.1](https://www.nuget.org/packages/Azure.Data.Tables/12.0.1) | [docs](/dotnet/api/overview/azure/Data.Tables-readme) | GitHub [12.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Data.Tables_12.0.1/sdk/tables/Azure.Data.Tables/) | | Text Analytics | NuGet [5.1.0-beta.7](https://www.nuget.org/packages/Azure.AI.TextAnalytics/5.1.0-beta.7) | [docs](/dotnet/api/overview/azure/AI.TextAnalytics-readme-pre) | GitHub [5.1.0-beta.7](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.TextAnalytics_5.1.0-beta.7/sdk/textanalytics/Azure.AI.TextAnalytics/) | | WebJobs Extensions - Event Grid | NuGet [3.0.0-beta.3](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.EventGrid/3.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.EventGrid-readme-pre) | GitHub [3.0.0-beta.3](https://github.com/Azure/azure-functions-eventgrid-extension/tree/v2.1.0/src/EventGridExtension) | | WebJobs Extensions - Event Hubs | NuGet [5.0.0-beta.6](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.EventHubs/5.0.0-beta.6) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.EventHubs-readme-pre) | GitHub [5.0.0-beta.6](https://github.com/Azure/azure-webjobs-sdk-extensions) | From 0d9ae9e1db5b45958c1044a9a7f66ca740afe7df Mon Sep 17 00:00:00 2001 From: GitHubPang <61439577+GitHubPang@users.noreply.github.com> Date: Fri, 11 Jun 2021 21:28:56 +0800 Subject: [PATCH 005/105] Fix typo in how-to-use-the-automl-api.md (#24638) --- .../machine-learning/how-to-guides/how-to-use-the-automl-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/machine-learning/how-to-guides/how-to-use-the-automl-api.md b/docs/machine-learning/how-to-guides/how-to-use-the-automl-api.md index 9defa251fb96f..d0ab07786f06c 100644 --- a/docs/machine-learning/how-to-guides/how-to-use-the-automl-api.md +++ b/docs/machine-learning/how-to-guides/how-to-use-the-automl-api.md @@ -158,7 +158,7 @@ Data pre-processing happens by default and the following steps are performed aut Define the criteria to complete your task: -1. Exit after a length of time - Using `MaxExperimentTimeInSeconds` in your experiment settings you can define how long in seconds that an task should continue to run. +1. Exit after a length of time - Using `MaxExperimentTimeInSeconds` in your experiment settings you can define how long in seconds that a task should continue to run. 1. Exit on a cancellation token - You can use a cancellation token that lets you cancel the task before it is scheduled to finish. From f5e92ea72b246a74f813096f51ab9886e6aa1ead Mon Sep 17 00:00:00 2001 From: Cam Soper Date: Fri, 11 Jun 2021 11:27:23 -0500 Subject: [PATCH 006/105] Specify channel (#24622) --- docs/iot/deployment.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/iot/deployment.md b/docs/iot/deployment.md index 18e754683cfd8..99e15ac18cd67 100644 --- a/docs/iot/deployment.md +++ b/docs/iot/deployment.md @@ -22,11 +22,11 @@ To deploy your app as a framework-dependent app, complete the following steps: 1. Run the following command to install .NET: ```bash - curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin + curl -sSL https://dot.net/v1/dotnet-install.sh | bash /dev/stdin --channel Current ``` > [!NOTE] - > This installs the latest version. If you need a specific version, add `--version ` to the end, where `` is the specific build version. + > This installs the latest version. If you need a specific version, replace the `--channel Current` parameter with `--version `, where `` is the specific build version. 1. To simplify path resolution, add a `DOTNET_ROOT` environment variable and add the *.dotnet* directory to `$PATH` with the following commands: From 3cac90ef7fccbaa1768b08082064de0af1814966 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Falc=C3=B3n?= Date: Fri, 11 Jun 2021 13:28:37 -0300 Subject: [PATCH 007/105] Update verbatim2.cs (#24628) Clarifies the usage of @ for attribute ambiguity --- .../snippets/csharp/language-reference/keywords/verbatim2.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/csharp/language-reference/keywords/verbatim2.cs b/samples/snippets/csharp/language-reference/keywords/verbatim2.cs index d611e2f0b6cf3..ba37d44f7096b 100644 --- a/samples/snippets/csharp/language-reference/keywords/verbatim2.cs +++ b/samples/snippets/csharp/language-reference/keywords/verbatim2.cs @@ -24,7 +24,7 @@ public InfoAttribute(string info) } [Info("A simple executable.")] // Generates compiler error CS1614. Ambiguous Info and InfoAttribute. -// Prepend '@' to select 'Info'. Specify the full name 'InfoAttribute' to select it. +// Prepend '@' to select 'Info' ([@Info("A simple executable.")]). Specify the full name 'InfoAttribute' to select it. public class Example { [InfoAttribute("The entry point.")] From d2d6a0f8c1a60b0f67405875b200f5d0a635cca2 Mon Sep 17 00:00:00 2001 From: Atif Aziz Date: Fri, 11 Jun 2021 20:34:07 +0200 Subject: [PATCH 008/105] Add "Object Initializers with collection read-only property initialization" (#24639) --- .../object-and-collection-initializers.md | 28 +++++++++++++++++ .../BasicObjectInitializers.cs | 30 +++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/docs/csharp/programming-guide/classes-and-structs/object-and-collection-initializers.md b/docs/csharp/programming-guide/classes-and-structs/object-and-collection-initializers.md index 6accaf99a949b..64c8b8d6bd941 100644 --- a/docs/csharp/programming-guide/classes-and-structs/object-and-collection-initializers.md +++ b/docs/csharp/programming-guide/classes-and-structs/object-and-collection-initializers.md @@ -103,6 +103,34 @@ The preceding sample generates code that calls the to add the three items into the dictionary. These two different ways to initialize associative collections have slightly different behavior because of the method calls the compiler generates. Both variants work with the `Dictionary` class. Other types may only support one or the other based on their public API. +## Object Initializers with collection read-only property initialization + +Some classes may have collection properties where the property is read-only, like the `Cats` property of `CatOwner` in the following case: + +[!code-csharp[ObjectInitializer1](../../../../samples/snippets/csharp/programming-guide/classes-and-structs/object-collection-initializers/BasicObjectInitializers.cs#CatOwnerDeclaration)] + +You will not be able to use collection initializer syntax discussed so far since the property cannot be assigned a new list: + +```csharp +CatOwner owner = new CatOwner +{ + Cats = new List + { + new Cat{ Name = "Sylvester", Age=8 }, + new Cat{ Name = "Whiskers", Age=2 }, + new Cat{ Name = "Sasha", Age=14 } + } +}; +``` + +However, new entries can be added to `Cats` nonetheless using the initialization syntax by omitting the list creation (`new List`), as shown next: + +[!code-csharp[ListInitializer](../../../../samples/snippets/csharp/programming-guide/classes-and-structs/object-collection-initializers/BasicObjectInitializers.cs#ReadOnlyPropertyCollectionInitializer)] + +The set of entries to be added simply appear surrounded by braces. The above is identical to writing: + +[!code-csharp[ListInitializer](../../../../samples/snippets/csharp/programming-guide/classes-and-structs/object-collection-initializers/BasicObjectInitializers.cs#ReadOnlyPropertyCollectionInitializerTranslation)] + ## Examples The following example combines the concepts of object and collection initializers. diff --git a/samples/snippets/csharp/programming-guide/classes-and-structs/object-collection-initializers/BasicObjectInitializers.cs b/samples/snippets/csharp/programming-guide/classes-and-structs/object-collection-initializers/BasicObjectInitializers.cs index 9af2fd4cc986d..8a154c8aa64df 100644 --- a/samples/snippets/csharp/programming-guide/classes-and-structs/object-collection-initializers/BasicObjectInitializers.cs +++ b/samples/snippets/csharp/programming-guide/classes-and-structs/object-collection-initializers/BasicObjectInitializers.cs @@ -26,6 +26,13 @@ public Cat(string name) } // + // + public class CatOwner + { + public IList Cats { get; } = new List(); + } + // + // public class Matrix { @@ -114,6 +121,29 @@ from p in products }; // + { + // + CatOwner owner = new CatOwner + { + Cats = + { + new Cat{ Name = "Sylvester", Age=8 }, + new Cat{ Name = "Whiskers", Age=2 }, + new Cat{ Name = "Sasha", Age=14 } + } + }; + // + } + + { + // + CatOwner owner = new CatOwner(); + owner.Cats.Add(new Cat{ Name = "Sylvester", Age=8 }); + owner.Cats.Add(new Cat{ Name = "Whiskers", Age=2 }); + owner.Cats.Add(new Cat{ Name = "Sasha", Age=14 }); + // + } + InitializationSample.Main(); FullExample.Main(); DictionaryExample.Main(); From ee6af2c181080ef385e4ca3b1f0ae43f9f762541 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20K=C3=B6plinger?= Date: Fri, 11 Jun 2021 23:52:32 +0200 Subject: [PATCH 009/105] Use Android API level instead of OS number (#24564) Android versions the APIs using a "level" concept which doesn't follow the version numbering scheme of the OS release. We're using the API level for the SupportedOSPlatform annotations. --- docs/standard/analyzers/platform-compat-analyzer.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/standard/analyzers/platform-compat-analyzer.md b/docs/standard/analyzers/platform-compat-analyzer.md index b3d850c2bed77..00620c6bec5f3 100644 --- a/docs/standard/analyzers/platform-compat-analyzer.md +++ b/docs/standard/analyzers/platform-compat-analyzer.md @@ -24,7 +24,7 @@ The platform compatibility analyzer is one of the Roslyn code quality analyzers. - An **unattributed API** is considered to work on **all OS platforms**. - An API marked with `[SupportedOSPlatform("platform")]` is considered only portable to the specified OS `platform`. - - The attribute can be applied multiple times to indicate **multiple platform support** (`[SupportedOSPlatform("windows"), SupportedOSPlatform("Android6.0")]`). + - The attribute can be applied multiple times to indicate **multiple platform support** (`[SupportedOSPlatform("windows"), SupportedOSPlatform("Android29.0")]`). - The analyzer will produce a **warning** if platform-specific APIs are referenced without a proper **platform context**: - **Warns** if the project doesn't target the supported platform (for example, a Windows-specific API called from a project targeting iOS `net5.0-ios14.0`). - **Warns** if the project is cross-platform and calls platform-specific APIs (for example, a Windows-specific API called from cross platform TFM `net5.0`). @@ -32,7 +32,7 @@ The platform compatibility analyzer is one of the Roslyn code quality analyzers. - **Doesn't warn** if the platform-specific API call is guarded by corresponding platform-check methods (for example, a Windows-specific API call guarded by `OperatingSystem.IsWindows()`). - **Doesn't warn** if the platform-specific API is referenced from the same platform-specific context (**call site also attributed** with `[SupportedOSPlatform("platform")`). - An API marked with `[UnsupportedOSPlatform("platform")]` is considered unsupported only on the specified OS `platform` but supported for all other platforms. - - The attribute can be applied multiple times with different platforms, for example, `[UnsupportedOSPlatform("iOS"), UnsupportedOSPlatform("Android6.0")]`. + - The attribute can be applied multiple times with different platforms, for example, `[UnsupportedOSPlatform("iOS"), UnsupportedOSPlatform("Android29.0")]`. - The analyzer produces a **warning** only if the `platform` is effective for the call site: - **Warns** if the project targets the platform that's attributed as unsupported (for example, if the API is attributed with `[UnsupportedOSPlatform("windows")]` and the call site targets `net5.0-windows`). - **Warns** if the project is multi-targeted and the `platform` is included in the default [MSBuild ``](https://github.com/dotnet/sdk/blob/main/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.SupportedPlatforms.props) items group, or the `platform` is manually included within the `MSBuild` \ items group: From a2105ae181c63f047d5dae31f76f051d14e4c6f7 Mon Sep 17 00:00:00 2001 From: Marcel Bindseil Date: Fri, 11 Jun 2021 23:53:33 +0200 Subject: [PATCH 010/105] Update implement-resilient-entity-framework-core-sql-connections.md (#24541) corrected grammar --- ...implement-resilient-entity-framework-core-sql-connections.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture/microservices/implement-resilient-applications/implement-resilient-entity-framework-core-sql-connections.md b/docs/architecture/microservices/implement-resilient-applications/implement-resilient-entity-framework-core-sql-connections.md index 625971e917410..638a998206fc4 100644 --- a/docs/architecture/microservices/implement-resilient-applications/implement-resilient-entity-framework-core-sql-connections.md +++ b/docs/architecture/microservices/implement-resilient-applications/implement-resilient-entity-framework-core-sql-connections.md @@ -43,7 +43,7 @@ If you try to execute that transaction when using an EF execution strategy (retr > System.InvalidOperationException: The configured execution strategy 'SqlServerRetryingExecutionStrategy' does not support user initiated transactions. Use the execution strategy returned by 'DbContext.Database.CreateExecutionStrategy()' to execute all the operations in the transaction as a retriable unit. -The solution is to manually invoke the EF execution strategy with a delegate representing everything that needs to be executed. If a transient failure occurs, the execution strategy will invoke the delegate again. For example, the following code show how it's implemented in eShopOnContainers with two multiple DbContexts (\_catalogContext and the IntegrationEventLogContext) when updating a product and then saving the ProductPriceChangedIntegrationEvent object, which needs to use a different DbContext. +The solution is to manually invoke the EF execution strategy with a delegate representing everything that needs to be executed. If a transient failure occurs, the execution strategy will invoke the delegate again. For example, the following code shows how it's implemented in eShopOnContainers with two multiple DbContexts (\_catalogContext and the IntegrationEventLogContext) when updating a product and then saving the ProductPriceChangedIntegrationEvent object, which needs to use a different DbContext. ```csharp public async Task UpdateProduct( From 351ed1ea443365e566f26089625b66fda6ece2c2 Mon Sep 17 00:00:00 2001 From: Youssef Victor Date: Fri, 11 Jun 2021 23:57:37 +0200 Subject: [PATCH 011/105] Add missing parenthesis (#24536) --- .../porting-existing-aspnet-apps/more-migration-scenarios.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/architecture/porting-existing-aspnet-apps/more-migration-scenarios.md b/docs/architecture/porting-existing-aspnet-apps/more-migration-scenarios.md index e7ff4b67001c2..dd53f6a86a243 100644 --- a/docs/architecture/porting-existing-aspnet-apps/more-migration-scenarios.md +++ b/docs/architecture/porting-existing-aspnet-apps/more-migration-scenarios.md @@ -233,7 +233,7 @@ Most ASP.NET MVC and Web API apps do not use a large number of custom filters. S ## Route constraints -ASP.NET Core uses route constraints to help ensure requests are routed properly to route a request. [ASP.NET Core supports a large number of different route constraints for this purpose]/aspnet/core/fundamentals/routing#route-constraint-reference). Route constraints can be applied in the route table, but most apps built with ASP.NET MVC 5 and/or [ASP.NET Web API 2](/aspnet/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2#route-constraints) use inline route constraints applied to attribute routes. Inline route constraints use a format like this one: +ASP.NET Core uses route constraints to help ensure requests are routed properly to route a request. [ASP.NET Core supports a large number of different route constraints for this purpose](/aspnet/core/fundamentals/routing#route-constraint-reference). Route constraints can be applied in the route table, but most apps built with ASP.NET MVC 5 and/or [ASP.NET Web API 2](/aspnet/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2#route-constraints) use inline route constraints applied to attribute routes. Inline route constraints use a format like this one: ```csharp [Route("/customer/{id:int}")] From 6eed48a9055c618ccbf656bfe6c9940d6909cc15 Mon Sep 17 00:00:00 2001 From: Genevieve Warren <24882762+gewarren@users.noreply.github.com> Date: Fri, 11 Jun 2021 16:19:00 -0700 Subject: [PATCH 012/105] Update name attribute info (#24647) --- docs/core/extensions/configuration-providers.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/core/extensions/configuration-providers.md b/docs/core/extensions/configuration-providers.md index 70d2d2ef582d7..e1f882a7db3ec 100644 --- a/docs/core/extensions/configuration-providers.md +++ b/docs/core/extensions/configuration-providers.md @@ -88,7 +88,7 @@ An example *appsettings.xml* file with various configuration settings follows: :::code language="xml" source="snippets/configuration/console-xml/appsettings.xml"::: -Repeating elements that use the same element name work if the `name` attribute is used to distinguish the elements: +In .NET 5 and earlier versions, add the `name` attribute to distinguish repeating elements that use the same element name. In .NET 6 and later versions, the XML configuration provider automatically indexes repeating elements. That means you don't have to specify the `name` attribute, except if you want the "0" index in the key and there's only one element. :::code language="xml" source="snippets/configuration/console-xml/repeating-example.xml"::: From 1678e90f487c04ac61749f7f6e48d6732c746dbd Mon Sep 17 00:00:00 2001 From: Atif Aziz Date: Sat, 12 Jun 2021 16:03:22 +0200 Subject: [PATCH 013/105] Fix end tag of one basic object initializers snippet (#24653) --- .../object-collection-initializers/BasicObjectInitializers.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/csharp/programming-guide/classes-and-structs/object-collection-initializers/BasicObjectInitializers.cs b/samples/snippets/csharp/programming-guide/classes-and-structs/object-collection-initializers/BasicObjectInitializers.cs index 8a154c8aa64df..30f9aed8e852c 100644 --- a/samples/snippets/csharp/programming-guide/classes-and-structs/object-collection-initializers/BasicObjectInitializers.cs +++ b/samples/snippets/csharp/programming-guide/classes-and-structs/object-collection-initializers/BasicObjectInitializers.cs @@ -141,7 +141,7 @@ from p in products owner.Cats.Add(new Cat{ Name = "Sylvester", Age=8 }); owner.Cats.Add(new Cat{ Name = "Whiskers", Age=2 }); owner.Cats.Add(new Cat{ Name = "Sasha", Age=14 }); - // + // } InitializationSample.Main(); From 7e60153126efb7b5586278c193a411ba29612fb0 Mon Sep 17 00:00:00 2001 From: Genevieve Warren <24882762+gewarren@users.noreply.github.com> Date: Mon, 14 Jun 2021 09:33:22 -0700 Subject: [PATCH 014/105] fix broken links (#24650) --- docs/architecture/cloud-native/candidate-apps.md | 4 ++-- docs/architecture/cloud-native/definition.md | 4 ++-- .../cloud-native/infrastructure-as-code.md | 4 ++-- docs/breadcrumb/toc.yml | 4 ++-- docs/csharp/fundamentals/tutorials/classes.md | 2 +- .../tutorials/object-detection-onnx.md | 10 ++-------- 6 files changed, 11 insertions(+), 17 deletions(-) diff --git a/docs/architecture/cloud-native/candidate-apps.md b/docs/architecture/cloud-native/candidate-apps.md index def93939149e4..34a130d00c34c 100644 --- a/docs/architecture/cloud-native/candidate-apps.md +++ b/docs/architecture/cloud-native/candidate-apps.md @@ -19,7 +19,7 @@ What type of application might be a candidate for cloud native? - A system with where individual features must release *without* a full redeployment of the entire system -- An application developed by teams with expertise in different technology stacks +- An application developed by teams with expertise in different technology stacks - An application with components that must scale independently @@ -75,7 +75,7 @@ With the introduction behind, we now dive into a much more detailed look at clou - [Beyond the Twelve-Factor Application](https://content.pivotal.io/blog/beyond-the-twelve-factor-app) -- [What is Infrastructure as Code](/azure/devops/learn/what-is-infrastructure-as-code) +- [What is Infrastructure as Code](/devops/deliver/what-is-infrastructure-as-code) - [Uber Engineering's Micro Deploy: Deploying Daily with Confidence](https://eng.uber.com/micro-deploy/) diff --git a/docs/architecture/cloud-native/definition.md b/docs/architecture/cloud-native/definition.md index c0b66377b2af4..ffe432ec1b513 100644 --- a/docs/architecture/cloud-native/definition.md +++ b/docs/architecture/cloud-native/definition.md @@ -275,7 +275,7 @@ Backing services are discussed in detail Chapter 5, *Cloud-Native Data Patterns* As you've seen, cloud-native systems embrace microservices, containers, and modern system design to achieve speed and agility. But, that's only part of the story. How do you provision the cloud environments upon which these systems run? How do you rapidly deploy app features and updates? How do you round out the full picture? -Enter the widely accepted practice of [Infrastructure as Code](/azure/devops/learn/what-is-infrastructure-as-code), or IaC. +Enter the widely accepted practice of [Infrastructure as Code](/devops/deliver/what-is-infrastructure-as-code), or IaC. With IaC, you automate platform provisioning and application deployment. You essentially apply software engineering practices such as testing and versioning to your DevOps practices. Your infrastructure and deployments are automated, consistent, and repeatable. @@ -285,7 +285,7 @@ Tools like [Azure Resource Manager](/azure/azure-resource-manager/management/ove Under the hood, IaC is idempotent, meaning that you can run the same script over and over without side effects. If the team needs to make a change, they edit and rerun the script. Only the updated resources are affected. -In the article, [What is Infrastructure as Code](/azure/devops/learn/what-is-infrastructure-as-code), Author Sam Guckenheimer describes how, "Teams who implement IaC can deliver stable environments rapidly and at scale. Teams avoid manual configuration of environments and enforce consistency by representing the desired state of their environments via code. Infrastructure deployments with IaC are repeatable and prevent runtime issues caused by configuration drift or missing dependencies. DevOps teams can work together with a unified set of practices and tools to deliver applications and their supporting infrastructure rapidly, reliably, and at scale." +In the article, [What is Infrastructure as Code](/devops/deliver/what-is-infrastructure-as-code), Author Sam Guckenheimer describes how, "Teams who implement IaC can deliver stable environments rapidly and at scale. Teams avoid manual configuration of environments and enforce consistency by representing the desired state of their environments via code. Infrastructure deployments with IaC are repeatable and prevent runtime issues caused by configuration drift or missing dependencies. DevOps teams can work together with a unified set of practices and tools to deliver applications and their supporting infrastructure rapidly, reliably, and at scale." ### Automating deployments diff --git a/docs/architecture/cloud-native/infrastructure-as-code.md b/docs/architecture/cloud-native/infrastructure-as-code.md index b5acdb53816d2..b87edfa797dd0 100644 --- a/docs/architecture/cloud-native/infrastructure-as-code.md +++ b/docs/architecture/cloud-native/infrastructure-as-code.md @@ -8,7 +8,7 @@ ms.date: 05/13/2020 Cloud-native systems embrace microservices, containers, and modern system design to achieve speed and agility. They provide automated build and release stages to ensure consistent and quality code. But, that's only part of the story. How do you provision the cloud environments upon which these systems run? -Modern cloud-native applications embrace the widely accepted practice of [Infrastructure as Code](/azure/devops/learn/what-is-infrastructure-as-code), or `IaC`. With IaC, you automate platform provisioning. You essentially apply software engineering practices such as testing and versioning to your DevOps practices. Your infrastructure and deployments are automated, consistent, and repeatable. Just as continuous delivery automated the traditional model of manual deployments, Infrastructure as Code (IaC) is evolving how application environments are managed. +Modern cloud-native applications embrace the widely accepted practice of [Infrastructure as Code](/devops/deliver/what-is-infrastructure-as-code), or `IaC`. With IaC, you automate platform provisioning. You essentially apply software engineering practices such as testing and versioning to your DevOps practices. Your infrastructure and deployments are automated, consistent, and repeatable. Just as continuous delivery automated the traditional model of manual deployments, Infrastructure as Code (IaC) is evolving how application environments are managed. Tools like Azure Resource Manager (ARM), Terraform, and the Azure Command Line Interface (CLI) enable you to declaratively script the cloud infrastructure you require. @@ -119,7 +119,7 @@ Figure 10-17 shows a YAML snippet that lists the version of Azure CLI and the de **Figure 10-17** - Azure CLI script -In the article, [What is Infrastructure as Code](/azure/devops/learn/what-is-infrastructure-as-code), Author Sam Guckenheimer describes how, "Teams who implement IaC can deliver stable environments rapidly and at scale. Teams avoid manual configuration of environments and enforce consistency by representing the desired state of their environments via code. Infrastructure deployments with IaC are repeatable and prevent runtime issues caused by configuration drift or missing dependencies. DevOps teams can work together with a unified set of practices and tools to deliver applications and their supporting infrastructure rapidly, reliably, and at scale." +In the article, [What is Infrastructure as Code](/devops/deliver/what-is-infrastructure-as-code), Author Sam Guckenheimer describes how, "Teams who implement IaC can deliver stable environments rapidly and at scale. Teams avoid manual configuration of environments and enforce consistency by representing the desired state of their environments via code. Infrastructure deployments with IaC are repeatable and prevent runtime issues caused by configuration drift or missing dependencies. DevOps teams can work together with a unified set of practices and tools to deliver applications and their supporting infrastructure rapidly, reliably, and at scale." >[!div class="step-by-step"] >[Previous](feature-flags.md) diff --git a/docs/breadcrumb/toc.yml b/docs/breadcrumb/toc.yml index 3d863a83fa7fb..1007639f17901 100644 --- a/docs/breadcrumb/toc.yml +++ b/docs/breadcrumb/toc.yml @@ -320,7 +320,7 @@ items: topicHref: /dotnet/csharp/tour-of-csharp/tutorials/index - name: Fundamentals tocHref: /dotnet/csharp/fundamentals/ - topicHref: /dotnet/csharp/fundamentals/type-system/index + topicHref: /dotnet/csharp/fundamentals/types/index - name: What's new tocHref: /dotnet/csharp/whats-new/ topicHref: /dotnet/csharp/whats-new/index @@ -587,4 +587,4 @@ items: topicHref: /dotnet/iot/index - name: What's new tocHref: /dotnet/whats-new/ - topicHref: /dotnet/whats-new/index \ No newline at end of file + topicHref: /dotnet/whats-new/index diff --git a/docs/csharp/fundamentals/tutorials/classes.md b/docs/csharp/fundamentals/tutorials/classes.md index b5afaf1893b2d..787039321701f 100644 --- a/docs/csharp/fundamentals/tutorials/classes.md +++ b/docs/csharp/fundamentals/tutorials/classes.md @@ -209,7 +209,7 @@ Run your program to see the results. ## Next steps -If you got stuck, you can see the source for this tutorial [in our GitHub repo](https://github.com/dotnet/docs/tree/main/docs/csharp/tutorials/intro-to-csharp/snippets/introduction-to-classes). +If you got stuck, you can see the source for this tutorial [in our GitHub repo](https://github.com/dotnet/docs/tree/main/docs/csharp/fundamentals/tutorials/snippets/introduction-to-classes). You can continue with the [object oriented programming](oop.md) tutorial. diff --git a/docs/machine-learning/tutorials/object-detection-onnx.md b/docs/machine-learning/tutorials/object-detection-onnx.md index a4120ad07880a..9fcd93794f683 100644 --- a/docs/machine-learning/tutorials/object-detection-onnx.md +++ b/docs/machine-learning/tutorials/object-detection-onnx.md @@ -103,15 +103,9 @@ Now that you have a general understanding of what ONNX is and how Tiny YOLOv2 wo 1. Copy the `assets` directory into your *ObjectDetection* project directory. This directory and its subdirectories contain the image files (except for the Tiny YOLOv2 model, which you'll download and add in the next step) needed for this tutorial. -1. Download the [Tiny YOLOv2 model](https://onnxzoo.blob.core.windows.net/models/opset_8/tiny_yolov2/tiny_yolov2.tar.gz) from the [ONNX Model Zoo](https://github.com/onnx/models/tree/master/vision/object_detection_segmentation/tiny-yolov2), and unzip. +1. Download the Tiny YOLOv2 model from the [ONNX Model Zoo](https://github.com/onnx/models/tree/master/vision/object_detection_segmentation/tiny-yolov2). - Open the command prompt and enter the following command: - - ```shell - tar -xvzf tiny_yolov2.tar.gz - ``` - -1. Copy the extracted `model.onnx` file from the directory just unzipped into your *ObjectDetection* project `assets\Model` directory and rename it to `TinyYolo2_model.onnx`. This directory contains the model needed for this tutorial. +1. Copy the `model.onnx` file into your *ObjectDetection* project `assets\Model` directory and rename it to `TinyYolo2_model.onnx`. This directory contains the model needed for this tutorial. 1. In Solution Explorer, right-click each of the files in the asset directory and subdirectories and select **Properties**. Under **Advanced**, change the value of **Copy to Output Directory** to **Copy if newer**. From 1fe38fe20bc5e7c81dbaf0f9e8643e0854c6f7a4 Mon Sep 17 00:00:00 2001 From: David Anson Date: Mon, 14 Jun 2021 10:08:54 -0700 Subject: [PATCH 015/105] Fix incorrect capitalization of "ASP.NET" in image description (#24659) The next release of `markdownlint` will report this violation. --- docs/framework/wcf/feature-details/configuring-iis-for-wcf.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/framework/wcf/feature-details/configuring-iis-for-wcf.md b/docs/framework/wcf/feature-details/configuring-iis-for-wcf.md index d6e013bd828a5..ca79ec419cd5a 100644 --- a/docs/framework/wcf/feature-details/configuring-iis-for-wcf.md +++ b/docs/framework/wcf/feature-details/configuring-iis-for-wcf.md @@ -40,7 +40,7 @@ Internet Information Services (IIS) 7.0 has a modular design that allows you to You must install ASP.NET to make ASP.NET work on IIS 7.0. After checking **ASP.NET**, your screen should look like the following illustration. - ![Asp.NET required settings](media/wcfc-trunfeaturesonoroff3s.gif "wcfc_TrunFeaturesOnOrOFf3s") + ![ASP.NET required settings](media/wcfc-trunfeaturesonoroff3s.gif "wcfc_TrunFeaturesOnOrOFf3s") This is the minimal environment for both WCF and ASP.NET applications to work in IIS 7.0. From a9bfafa780cf61dc21ca94c19a546901570e5812 Mon Sep 17 00:00:00 2001 From: Andy Gocke Date: Mon, 14 Jun 2021 12:23:10 -0700 Subject: [PATCH 016/105] Add docs about extraction directory on Unix (#24562) * Add docs about extraction directory on Unix * Remove extra space * Update docs/core/deploying/single-file.md Co-authored-by: Andy (Steve) De George <67293991+adegeo@users.noreply.github.com> * Update docs/core/deploying/single-file.md Co-authored-by: Andy (Steve) De George <67293991+adegeo@users.noreply.github.com> --- docs/core/deploying/single-file.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/core/deploying/single-file.md b/docs/core/deploying/single-file.md index 3cf987e5da2a0..ba1cd8701081b 100644 --- a/docs/core/deploying/single-file.md +++ b/docs/core/deploying/single-file.md @@ -13,7 +13,7 @@ Single File deployment is available for both the [framework-dependent deployment ## Output differences from .NET 3.x -In .NET Core 3.x, publishing as a single file produced exactly one file, consisting of the app itself, dependencies, and any other files in the folder during publish. When the app starts, the single file app was extracted to a temporary folder and run from there. Starting with .NET 5, only managed DLLs are bundled with the app into a single executable. When the app starts, the managed DLLs are extracted and loaded in memory, avoiding the extraction to a temporary folder. On Windows, this means that the managed binaries are embedded in the single-file bundle, but the native binaries of the core runtime itself are separate files. To embed those files for extraction and get exactly one output file, like in .NET Core 3.x, set the property `IncludeNativeLibrariesForSelfExtract` to `true`. For more information about extraction, see [Other considerations](#other-considerations). +In .NET Core 3.x, publishing as a single file produced exactly one file, consisting of the app itself, dependencies, and any other files in the folder during publish. When the app starts, the single file app was extracted to a temporary folder and run from there. Starting with .NET 5, only managed DLLs are bundled with the app into a single executable. When the app starts, the managed DLLs are extracted and loaded in memory, avoiding the extraction to a temporary folder. On Windows, this means that the managed binaries are embedded in the single-file bundle, but the native binaries of the core runtime itself are separate files. To embed those files for extraction and get exactly one output file, like in .NET Core 3.x, set the property `IncludeNativeLibrariesForSelfExtract` to `true`. For more information about extraction, see [Including native libraries](#including-native-libraries). ## API incompatibility @@ -51,12 +51,17 @@ Without this file Visual Studio may produce the error "Unable to attach to the p To fix these errors, _mscordbi_ needs to be copied next to the executable. _mscordbi_ is `publish`ed by default in the subdirectory with the application's runtime ID. So, for example, if one were to publish a self-contained single-file executable using the `dotnet` CLI for Windows using the parameters `-r win-x64`, the executable would be placed in _bin/Debug/net5.0/win-x64/publish_. A copy of _mscordbi.dll_ would be present in _bin/Debug/net5.0/win-x64_. -## Other considerations +## Including native libraries Single-file doesn't bundle native libraries by default. On Linux, we prelink the runtime into the bundle and only application native libraries are deployed to the same directory as the single-file app. On Windows, we prelink only the hosting code and both the runtime and application native libraries are deployed to the same directory as the single-file app. This is to ensure a good debugging experience, which requires native files to be excluded from the single file. There is an option to set a flag, `IncludeNativeLibrariesForSelfExtract`, to include native libraries in the single file bundle, but these files will be extracted to a temporary directory in the client machine when the single file application is run. Specifying `IncludeAllContentForSelfExtract` will extract all files before running the executable. This preserves the original .NET Core single-file deployment behavior. +> [!NOTE] +> If extraction is used and the app is running on Linux or MacOS, either `$HOME` or `$DOTNET_BUNDLE_EXTRACT_BASE_DIR` must be set to a path. If `$HOME` is set, the files will be extracted in a directory under _$HOME/.net_, while if `$DOTNET_BUNDLE_EXTRACT_BASE_DIR` is set, it will take precedence and files will be created in directories below that path. To prevent tampering, these directories should not be writable by users or services with different privileges, **not** _/tmp_ or _/var/tmp_ on most systems). + +## Other considerations + Single-file application will have all related PDB files alongside it and will not be bundled by default. If you want to include PDBs inside the assembly for projects you build, set the `DebugType` to `embedded` as described [below](#include-pdb-files-inside-the-bundle) in detail. Managed C++ components aren't well suited for single-file deployment and we recommend that you write applications in C# or another non-managed C++ language to be single-file compatible. From 0934b11277cd14a2da01ba7599dde8ad73545914 Mon Sep 17 00:00:00 2001 From: Azure SDK Bot <53356347+azure-sdk@users.noreply.github.com> Date: Mon, 14 Jun 2021 15:37:56 -0700 Subject: [PATCH 017/105] Update package index with latest published versions (#24635) --- docs/azure/includes/dotnet-all.md | 22 +++++++++++----------- docs/azure/includes/dotnet-new.md | 10 +++++----- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/docs/azure/includes/dotnet-all.md b/docs/azure/includes/dotnet-all.md index 66f8435e842b0..b12ea4f61c559 100644 --- a/docs/azure/includes/dotnet-all.md +++ b/docs/azure/includes/dotnet-all.md @@ -20,7 +20,7 @@ | ConfidentialLedger | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Storage.ConfidentialLedger/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Storage.ConfidentialLedger-readme-pre) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.ConfidentialLedger_1.0.0-beta.1/sdk/confidentialledger/Azure.Storage.ConfidentialLedger/) | | Container Registry | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Containers.ContainerRegistry/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Containers.ContainerRegistry-readme-pre) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Containers.ContainerRegistry_1.0.0-beta.3/sdk/containerregistry/Azure.Containers.ContainerRegistry/) | | Core | NuGet [1.15.0](https://www.nuget.org/packages/Azure.Core/1.15.0) | [docs](/dotnet/api/overview/azure/Core-readme) | GitHub [1.15.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core_1.15.0/sdk/core/Azure.Core/) | -| Core - AMQP | NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.Core.Amqp/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/Core.Amqp-readme-pre) | GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core.Amqp_1.1.0-beta.1/sdk/core/Azure.Core.Amqp/) | +| Core - AMQP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Core.Amqp/1.0.0)
NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.Core.Amqp/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/Core.Amqp-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core.Amqp_1.0.0/sdk/core/Azure.Core.Amqp/)
GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core.Amqp_1.1.0-beta.1/sdk/core/Azure.Core.Amqp/) | | Cosmos DB | NuGet [4.0.0-preview3](https://www.nuget.org/packages/Azure.Cosmos/4.0.0-preview3) | [docs](/dotnet/api/azure.cosmos) | GitHub [4.0.0-preview3](https://github.com/Azure/azure-cosmos-dotnet-v3/tree/releases/4.0.0-preview3) | | Digital Twins - Core | NuGet [1.2.2](https://www.nuget.org/packages/Azure.DigitalTwins.Core/1.2.2) | [docs](/dotnet/api/overview/azure/DigitalTwins.Core-readme) | GitHub [1.2.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.DigitalTwins.Core_1.2.2/sdk/digitaltwins/Azure.DigitalTwins.Core/) | | Document Translation | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.AI.Translation.Document/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/AI.Translation.Document-readme-pre) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Translation.Document_1.0.0-beta.2/sdk/translation/Azure.AI.Translation.Document/) | @@ -57,10 +57,10 @@ | Synapse - Spark | NuGet [1.0.0-preview.6](https://www.nuget.org/packages/Azure.Analytics.Synapse.Spark/1.0.0-preview.6) | [docs](/dotnet/api/overview/azure/Analytics.Synapse.Spark-readme-pre) | GitHub [1.0.0-preview.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Synapse.Spark_1.0.0-preview.6/sdk/synapse/Azure.Analytics.Synapse.Spark/) | | System Memory Data | NuGet [1.0.2](https://www.nuget.org/packages/System.Memory.Data/1.0.2) | [docs](/dotnet/api/overview/azure/System.Memory.Data-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-net/tree/System.Memory.Data_1.0.2/sdk/core/System.Memory.Data/) | | Tables | NuGet [12.0.1](https://www.nuget.org/packages/Azure.Data.Tables/12.0.1) | [docs](/dotnet/api/overview/azure/Data.Tables-readme) | GitHub [12.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Data.Tables_12.0.1/sdk/tables/Azure.Data.Tables/) | -| Text Analytics | NuGet [5.1.0-beta.7](https://www.nuget.org/packages/Azure.AI.TextAnalytics/5.1.0-beta.7) | [docs](/dotnet/api/overview/azure/AI.TextAnalytics-readme-pre) | GitHub [5.1.0-beta.7](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.TextAnalytics_5.1.0-beta.7/sdk/textanalytics/Azure.AI.TextAnalytics/) | -| WebJobs Extensions - Event Grid | NuGet [3.0.0-beta.3](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.EventGrid/3.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.EventGrid-readme-pre) | GitHub [3.0.0-beta.3](https://github.com/Azure/azure-functions-eventgrid-extension/tree/v2.1.0/src/EventGridExtension) | -| WebJobs Extensions - Event Hubs | NuGet [5.0.0-beta.6](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.EventHubs/5.0.0-beta.6) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.EventHubs-readme-pre) | GitHub [5.0.0-beta.6](https://github.com/Azure/azure-webjobs-sdk-extensions) | -| WebJobs Extensions - Service Bus | NuGet [5.0.0-beta.3](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.ServiceBus/5.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.ServiceBus-readme-pre) | GitHub [5.0.0-beta.3](https://github.com/Azure/azure-functions-servicebus-extension/tree/v4.1.2) | +| Text Analytics | NuGet [5.0.0](https://www.nuget.org/packages/Azure.AI.TextAnalytics/5.0.0)
NuGet [5.1.0-beta.7](https://www.nuget.org/packages/Azure.AI.TextAnalytics/5.1.0-beta.7) | [docs](/dotnet/api/overview/azure/AI.TextAnalytics-readme) | GitHub [5.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.TextAnalytics_5.0.0/sdk/textanalytics/Azure.AI.TextAnalytics/)
GitHub [5.1.0-beta.7](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.TextAnalytics_5.1.0-beta.7/sdk/textanalytics/Azure.AI.TextAnalytics/) | +| WebJobs Extensions - Event Grid | NuGet [3.0.0-beta.3](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.EventGrid/3.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.EventGrid-readme-pre) | GitHub [3.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.EventGrid_3.0.0-beta.3/sdk/eventgrid/Microsoft.Azure.WebJobs.Extensions.EventGrid/) | +| WebJobs Extensions - Event Hubs | NuGet [5.0.0-beta.6](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.EventHubs/5.0.0-beta.6) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.EventHubs-readme-pre) | GitHub [5.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.EventHubs_5.0.0-beta.6/sdk/eventhub/Microsoft.Azure.WebJobs.Extensions.EventHubs/) | +| WebJobs Extensions - Service Bus | NuGet [5.0.0-beta.3](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.ServiceBus/5.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.ServiceBus-readme-pre) | GitHub [5.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.ServiceBus_5.0.0-beta.3/sdk/servicebus/Microsoft.Azure.WebJobs.Extensions.ServiceBus/) | | WebJobs Extensions - WebPubSub | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.WebPubSub/1.0.0-beta.1) | | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.WebPubSub_1.0.0-beta.1/sdk/webpubsub/Microsoft.Azure.WebJobs.Extensions.WebPubSub/) | | WebPubSub | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Messaging.WebPubSub/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Messaging.WebPubSub-readme-pre) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.WebPubSub_1.0.0-beta.1/sdk/webpubsub/Azure.Messaging.WebPubSub/) | | Resource Management - App Configuration | NuGet [1.0.0-preview.1](https://www.nuget.org/packages/Azure.ResourceManager.AppConfiguration/1.0.0-preview.1) | [docs](/dotnet/api/overview/azure/ResourceManager.AppConfiguration-readme-pre) | GitHub [1.0.0-preview.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppConfiguration_1.0.0-preview.1/sdk/appconfiguration/Azure.ResourceManager.AppConfiguration/) | @@ -173,7 +173,7 @@ | Container Registry | NuGet [1.0.0-preview.2](https://www.nuget.org/packages/Microsoft.Azure.ContainerRegistry/1.0.0-preview.2) | | GitHub [1.0.0-preview.2](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.ContainerRegistry_1.0.0-preview.2/sdk/containerregistry/Microsoft.Azure.ContainerRegistry/) | | Content Moderator | NuGet [2.0.0](https://www.nuget.org/packages/Microsoft.Azure.CognitiveServices.ContentModerator/2.0.0) | | | | Core | NuGet [1.15.0](https://www.nuget.org/packages/Azure.Core/1.15.0) | [docs](/dotnet/api/overview/azure/Core-readme) | GitHub [1.15.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core_1.15.0/sdk/core/Azure.Core/) | -| Core - AMQP | NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.Core.Amqp/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/Core.Amqp-readme-pre) | GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core.Amqp_1.1.0-beta.1/sdk/core/Azure.Core.Amqp/) | +| Core - AMQP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Core.Amqp/1.0.0)
NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.Core.Amqp/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/Core.Amqp-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core.Amqp_1.0.0/sdk/core/Azure.Core.Amqp/)
GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core.Amqp_1.1.0-beta.1/sdk/core/Azure.Core.Amqp/) | | Core Newtonsoft Json | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.Core.NewtonsoftJson/1.0.0)
NuGet [1.0.0-preview.1](https://www.nuget.org/packages/Microsoft.Azure.Core.NewtonsoftJson/1.0.0-preview.1) | | | | Core Spatial | NuGet [1.1.0](https://www.nuget.org/packages/Microsoft.Azure.Core.Spatial/1.1.0) | | | | Core Spatial Newtonsoft Json | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.Core.Spatial.NewtonsoftJson/1.0.0)
NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Microsoft.Azure.Core.Spatial.NewtonsoftJson/1.0.0-beta.1) | | | @@ -320,7 +320,7 @@ | Tables | NuGet [2.1.2](https://www.nuget.org/packages/Microsoft.Azure.CosmosDB.Table/2.1.2) | | | | Template | NuGet [1.0.2-preview1](https://www.nuget.org/packages/Microsoft.Azure.Template/1.0.2-preview1) | | | | Test HttpRecorder | NuGet [1.13.3](https://www.nuget.org/packages/Microsoft.Azure.Test.HttpRecorder/1.13.3) | | GitHub [1.13.3](https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/mgmtcommon/TestFramework/Microsoft.Azure.Test.HttpRecorder) | -| Text Analytics | NuGet [5.1.0-beta.7](https://www.nuget.org/packages/Azure.AI.TextAnalytics/5.1.0-beta.7) | [docs](/dotnet/api/overview/azure/AI.TextAnalytics-readme-pre) | GitHub [5.1.0-beta.7](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.TextAnalytics_5.1.0-beta.7/sdk/textanalytics/Azure.AI.TextAnalytics/) | +| Text Analytics | NuGet [5.0.0](https://www.nuget.org/packages/Azure.AI.TextAnalytics/5.0.0)
NuGet [5.1.0-beta.7](https://www.nuget.org/packages/Azure.AI.TextAnalytics/5.1.0-beta.7) | [docs](/dotnet/api/overview/azure/AI.TextAnalytics-readme) | GitHub [5.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.TextAnalytics_5.0.0/sdk/textanalytics/Azure.AI.TextAnalytics/)
GitHub [5.1.0-beta.7](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.TextAnalytics_5.1.0-beta.7/sdk/textanalytics/Azure.AI.TextAnalytics/) | | Text Analytics | NuGet [4.1.0-preview.2](https://www.nuget.org/packages/Microsoft.Azure.CognitiveServices.Language.TextAnalytics/4.1.0-preview.2) | | GitHub [4.1.0-preview.2](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.CognitiveServices.Language.TextAnalytics_4.1.0-preview.2/sdk/cognitiveservices/Language.TextAnalytics) | | Video Search | NuGet [2.0.0](https://www.nuget.org/packages/Microsoft.Azure.CognitiveServices.Search.VideoSearch/2.0.0) | | | | Vision Content Moderator | NuGet [2.1.0-preview.1](https://www.nuget.org/packages/Microsoft.Azure.CognitiveServices.Vision.ContentModerator/2.1.0-preview.1) | | GitHub [2.1.0-preview.1](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.CognitiveServices.Vision.ContentModerator_2.1.0-preview.1/sdk/cognitiveservices/Vision.ContentModerator) | @@ -353,8 +353,8 @@ | WebJobs Extensions - Durable Task | NuGet [2.5.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.DurableTask/2.5.0) | [docs](/dotnet/api/overview/azure/functions) | GitHub [2.5.0](https://github.com/Azure/azure-functions-durable-extension/tree/v2.2.2/src/WebJobs.Extensions.DurableTask) | | WebJobs Extensions - Durable Task Analyzers | NuGet [0.4.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.DurableTask.Analyzers/0.4.0) | | GitHub [0.4.0](https://github.com/Azure/azure-functions-durable-extension/tree/Analyzer-v0.3.0/src/WebJobs.Extensions.DurableTask.Analyzers) | | WebJobs Extensions - Edge Hub | NuGet [1.0.7](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.EdgeHub/1.0.7) | | GitHub [1.0.7](https://github.com/Azure/iotedge/tree/1.0.7/edge-hub) | -| WebJobs Extensions - Event Grid | NuGet [3.0.0-beta.3](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.EventGrid/3.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.EventGrid-readme-pre) | GitHub [3.0.0-beta.3](https://github.com/Azure/azure-functions-eventgrid-extension/tree/v2.1.0/src/EventGridExtension) | -| WebJobs Extensions - Event Hubs | NuGet [5.0.0-beta.6](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.EventHubs/5.0.0-beta.6) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.EventHubs-readme-pre) | GitHub [5.0.0-beta.6](https://github.com/Azure/azure-webjobs-sdk-extensions) | +| WebJobs Extensions - Event Grid | NuGet [3.0.0-beta.3](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.EventGrid/3.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.EventGrid-readme-pre) | GitHub [3.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.EventGrid_3.0.0-beta.3/sdk/eventgrid/Microsoft.Azure.WebJobs.Extensions.EventGrid/) | +| WebJobs Extensions - Event Hubs | NuGet [5.0.0-beta.6](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.EventHubs/5.0.0-beta.6) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.EventHubs-readme-pre) | GitHub [5.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.EventHubs_5.0.0-beta.6/sdk/eventhub/Microsoft.Azure.WebJobs.Extensions.EventHubs/) | | WebJobs Extensions - Http | NuGet [3.0.12](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Http/3.0.12) | | GitHub [3.0.12](https://github.com/Azure/azure-webjobs-sdk-extensions/tree/v3.0.2/src/WebJobs.Extensions.Http) | | WebJobs Extensions - Kafka | NuGet [3.3.2](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Kafka/3.3.2) | | GitHub [3.3.2](https://github.com/Azure/azure-functions-kafka-extension/tree/3.0.0/src/Microsoft.Azure.WebJobs.Extensions.Kafka) | | WebJobs Extensions - Microsoft Graph | NuGet [1.0.0-beta6](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.MicrosoftGraph/1.0.0-beta6) | | GitHub [1.0.0-beta6](https://github.com/Azure/azure-functions-microsoftgraph-extension) | @@ -365,7 +365,7 @@ | WebJobs Extensions - OpenAPI Core | NuGet [0.7.2-preview](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.OpenApi.Core/0.7.2-preview) | | | | WebJobs Extensions - RabbitMQ | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.RabbitMQ/1.0.0)
NuGet [1.0.0-beta](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.RabbitMQ/1.0.0-beta) | | GitHub [1.0.0](https://github.com/Azure/azure-functions-rabbitmq-extension/tree/v0.2.2029-beta) | | WebJobs Extensions - SendGrid | NuGet [3.0.2](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.SendGrid/3.0.2) | | GitHub [3.0.2](https://github.com/Azure/azure-webjobs-sdk-extensions/tree/v3.0.0/src/WebJobs.Extensions.SendGrid) | -| WebJobs Extensions - Service Bus | NuGet [5.0.0-beta.3](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.ServiceBus/5.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.ServiceBus-readme-pre) | GitHub [5.0.0-beta.3](https://github.com/Azure/azure-functions-servicebus-extension/tree/v4.1.2) | +| WebJobs Extensions - Service Bus | NuGet [5.0.0-beta.3](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.ServiceBus/5.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.ServiceBus-readme-pre) | GitHub [5.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.ServiceBus_5.0.0-beta.3/sdk/servicebus/Microsoft.Azure.WebJobs.Extensions.ServiceBus/) | | WebJobs Extensions - SignalR Service | NuGet [1.4.1](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.SignalRService/1.4.1) | | GitHub [1.4.1](https://github.com/Azure/azure-functions-signalrservice-extension/tree/v1.2.0/src/SignalRServiceExtension) | | WebJobs Extensions - Storage | NuGet [4.0.3](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Storage/4.0.3)
NuGet [5.0.0-beta.4](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Storage/5.0.0-beta.4) | | GitHub [4.0.3](https://github.com/Azure/azure-webjobs-sdk/tree/master/src/Microsoft.Azure.WebJobs.Extensions.Storage) | | WebJobs Extensions - Storage Blobs | NuGet [5.0.0-beta.4](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/5.0.0-beta.4) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs-readme-pre) | | @@ -508,7 +508,7 @@ | Management - Maps | NuGet [1.0.2](https://www.nuget.org/packages/Microsoft.Azure.Management.Maps/1.0.2) | | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/maps/Microsoft.Azure.Management.Maps) | | Management - Marketplace | NuGet [1.1.0](https://www.nuget.org/packages/Microsoft.Azure.Management.Marketplace/1.1.0)
NuGet [2.0.0-preview](https://www.nuget.org/packages/Microsoft.Azure.Management.Marketplace/2.0.0-preview) | | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Management.Marketplace_1.1.0/sdk/marketplace/Microsoft.Azure.Management.Marketplace/)
GitHub [2.0.0-preview](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Management.Marketplace_2.0.0-preview/sdk/marketplace/Microsoft.Azure.Management.Marketplace/) | | Management - Marketplace Ordering | NuGet [1.0.1](https://www.nuget.org/packages/Microsoft.Azure.Management.MarketplaceOrdering/1.0.1) | | GitHub [1.0.1](https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/marketplaceordering/Microsoft.Azure.Management.MarketplaceOrdering) | -| Management - Media Services | NuGet [3.0.5](https://www.nuget.org/packages/Microsoft.Azure.Management.Media/3.0.5) | | GitHub [3.0.5](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Management.Media_3.0.5/sdk/mediaservices/Microsoft.Azure.Management.Media/) | +| Management - Media Services | NuGet [4.0.0](https://www.nuget.org/packages/Microsoft.Azure.Management.Media/4.0.0) | | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Management.Media_4.0.0/sdk/mediaservices/Microsoft.Azure.Management.Media/) | | Management - Migrate Resource Mover | NuGet [2.0.0](https://www.nuget.org/packages/Microsoft.Azure.Management.Migrate.ResourceMover/2.0.0) | | | | Management - Mixed Reality | NuGet [3.0.0](https://www.nuget.org/packages/Microsoft.Azure.Management.MixedReality/3.0.0) | [docs](/dotnet/api/overview/azure/mixed-reality) | GitHub [3.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Management.MixedReality_3.0.0/sdk/mixedreality/Microsoft.Azure.Management.MixedReality/) | | Management - Monitor | NuGet [0.25.3-preview](https://www.nuget.org/packages/Microsoft.Azure.Management.Monitor/0.25.3-preview) | | GitHub [0.25.3-preview](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.Management.Monitor_0.25.3-preview/sdk/monitor/Microsoft.Azure.Management.Monitor/) | diff --git a/docs/azure/includes/dotnet-new.md b/docs/azure/includes/dotnet-new.md index 9d690faca373e..99b914dea77ab 100644 --- a/docs/azure/includes/dotnet-new.md +++ b/docs/azure/includes/dotnet-new.md @@ -20,7 +20,7 @@ | ConfidentialLedger | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Storage.ConfidentialLedger/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Storage.ConfidentialLedger-readme-pre) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.ConfidentialLedger_1.0.0-beta.1/sdk/confidentialledger/Azure.Storage.ConfidentialLedger/) | | Container Registry | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Containers.ContainerRegistry/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Containers.ContainerRegistry-readme-pre) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Containers.ContainerRegistry_1.0.0-beta.3/sdk/containerregistry/Azure.Containers.ContainerRegistry/) | | Core | NuGet [1.15.0](https://www.nuget.org/packages/Azure.Core/1.15.0) | [docs](/dotnet/api/overview/azure/Core-readme) | GitHub [1.15.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core_1.15.0/sdk/core/Azure.Core/) | -| Core - AMQP | NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.Core.Amqp/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/Core.Amqp-readme-pre) | GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core.Amqp_1.1.0-beta.1/sdk/core/Azure.Core.Amqp/) | +| Core - AMQP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Core.Amqp/1.0.0)
NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.Core.Amqp/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/Core.Amqp-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core.Amqp_1.0.0/sdk/core/Azure.Core.Amqp/)
GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core.Amqp_1.1.0-beta.1/sdk/core/Azure.Core.Amqp/) | | Cosmos DB | NuGet [4.0.0-preview3](https://www.nuget.org/packages/Azure.Cosmos/4.0.0-preview3) | [docs](/dotnet/api/azure.cosmos) | GitHub [4.0.0-preview3](https://github.com/Azure/azure-cosmos-dotnet-v3/tree/releases/4.0.0-preview3) | | Digital Twins - Core | NuGet [1.2.2](https://www.nuget.org/packages/Azure.DigitalTwins.Core/1.2.2) | [docs](/dotnet/api/overview/azure/DigitalTwins.Core-readme) | GitHub [1.2.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.DigitalTwins.Core_1.2.2/sdk/digitaltwins/Azure.DigitalTwins.Core/) | | Document Translation | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.AI.Translation.Document/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/AI.Translation.Document-readme-pre) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Translation.Document_1.0.0-beta.2/sdk/translation/Azure.AI.Translation.Document/) | @@ -57,10 +57,10 @@ | Synapse - Spark | NuGet [1.0.0-preview.6](https://www.nuget.org/packages/Azure.Analytics.Synapse.Spark/1.0.0-preview.6) | [docs](/dotnet/api/overview/azure/Analytics.Synapse.Spark-readme-pre) | GitHub [1.0.0-preview.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Analytics.Synapse.Spark_1.0.0-preview.6/sdk/synapse/Azure.Analytics.Synapse.Spark/) | | System Memory Data | NuGet [1.0.2](https://www.nuget.org/packages/System.Memory.Data/1.0.2) | [docs](/dotnet/api/overview/azure/System.Memory.Data-readme) | GitHub [1.0.2](https://github.com/Azure/azure-sdk-for-net/tree/System.Memory.Data_1.0.2/sdk/core/System.Memory.Data/) | | Tables | NuGet [12.0.1](https://www.nuget.org/packages/Azure.Data.Tables/12.0.1) | [docs](/dotnet/api/overview/azure/Data.Tables-readme) | GitHub [12.0.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Data.Tables_12.0.1/sdk/tables/Azure.Data.Tables/) | -| Text Analytics | NuGet [5.1.0-beta.7](https://www.nuget.org/packages/Azure.AI.TextAnalytics/5.1.0-beta.7) | [docs](/dotnet/api/overview/azure/AI.TextAnalytics-readme-pre) | GitHub [5.1.0-beta.7](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.TextAnalytics_5.1.0-beta.7/sdk/textanalytics/Azure.AI.TextAnalytics/) | -| WebJobs Extensions - Event Grid | NuGet [3.0.0-beta.3](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.EventGrid/3.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.EventGrid-readme-pre) | GitHub [3.0.0-beta.3](https://github.com/Azure/azure-functions-eventgrid-extension/tree/v2.1.0/src/EventGridExtension) | -| WebJobs Extensions - Event Hubs | NuGet [5.0.0-beta.6](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.EventHubs/5.0.0-beta.6) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.EventHubs-readme-pre) | GitHub [5.0.0-beta.6](https://github.com/Azure/azure-webjobs-sdk-extensions) | -| WebJobs Extensions - Service Bus | NuGet [5.0.0-beta.3](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.ServiceBus/5.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.ServiceBus-readme-pre) | GitHub [5.0.0-beta.3](https://github.com/Azure/azure-functions-servicebus-extension/tree/v4.1.2) | +| Text Analytics | NuGet [5.0.0](https://www.nuget.org/packages/Azure.AI.TextAnalytics/5.0.0)
NuGet [5.1.0-beta.7](https://www.nuget.org/packages/Azure.AI.TextAnalytics/5.1.0-beta.7) | [docs](/dotnet/api/overview/azure/AI.TextAnalytics-readme) | GitHub [5.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.TextAnalytics_5.0.0/sdk/textanalytics/Azure.AI.TextAnalytics/)
GitHub [5.1.0-beta.7](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.TextAnalytics_5.1.0-beta.7/sdk/textanalytics/Azure.AI.TextAnalytics/) | +| WebJobs Extensions - Event Grid | NuGet [3.0.0-beta.3](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.EventGrid/3.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.EventGrid-readme-pre) | GitHub [3.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.EventGrid_3.0.0-beta.3/sdk/eventgrid/Microsoft.Azure.WebJobs.Extensions.EventGrid/) | +| WebJobs Extensions - Event Hubs | NuGet [5.0.0-beta.6](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.EventHubs/5.0.0-beta.6) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.EventHubs-readme-pre) | GitHub [5.0.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.EventHubs_5.0.0-beta.6/sdk/eventhub/Microsoft.Azure.WebJobs.Extensions.EventHubs/) | +| WebJobs Extensions - Service Bus | NuGet [5.0.0-beta.3](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.ServiceBus/5.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.ServiceBus-readme-pre) | GitHub [5.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.ServiceBus_5.0.0-beta.3/sdk/servicebus/Microsoft.Azure.WebJobs.Extensions.ServiceBus/) | | WebJobs Extensions - WebPubSub | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.WebPubSub/1.0.0-beta.1) | | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.WebPubSub_1.0.0-beta.1/sdk/webpubsub/Microsoft.Azure.WebJobs.Extensions.WebPubSub/) | | WebPubSub | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Messaging.WebPubSub/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Messaging.WebPubSub-readme-pre) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.WebPubSub_1.0.0-beta.1/sdk/webpubsub/Azure.Messaging.WebPubSub/) | | Resource Management - App Configuration | NuGet [1.0.0-preview.1](https://www.nuget.org/packages/Azure.ResourceManager.AppConfiguration/1.0.0-preview.1) | [docs](/dotnet/api/overview/azure/ResourceManager.AppConfiguration-readme-pre) | GitHub [1.0.0-preview.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.ResourceManager.AppConfiguration_1.0.0-preview.1/sdk/appconfiguration/Azure.ResourceManager.AppConfiguration/) | From 11a98ec57fa3649a5cb5893413cbb79a872b903d Mon Sep 17 00:00:00 2001 From: "Andy (Steve) De George" <67293991+adegeo@users.noreply.github.com> Date: Tue, 15 Jun 2021 07:34:06 -0700 Subject: [PATCH 018/105] Update upgrade-assistant articles (#24476) * Update upgrade assistant steps * fix troubleshooting * Acro --- .../porting/upgrade-assistant-aspnetmvc.md | 27 +++++++------------ .../porting/upgrade-assistant-overview.md | 19 ++++++------- .../upgrade-assistant-winforms-framework.md | 17 +++++------- .../upgrade-assistant-wpf-framework.md | 17 +++++------- docs/fundamentals/toc.yml | 4 +-- 5 files changed, 34 insertions(+), 50 deletions(-) diff --git a/docs/core/porting/upgrade-assistant-aspnetmvc.md b/docs/core/porting/upgrade-assistant-aspnetmvc.md index dbd9d9f4a236b..8c17a5e53be9e 100644 --- a/docs/core/porting/upgrade-assistant-aspnetmvc.md +++ b/docs/core/porting/upgrade-assistant-aspnetmvc.md @@ -1,10 +1,10 @@ --- title: Upgrade ASP.NET MVC apps to .NET 5 -description: Use the .NET Upgrade Assistant to upgrade an existing .NET Framework ASP.NET MVC app to .NET 5. The .NET Upgrade Assistant is a CLI tool that assists in migrating an app from .NET Framework to .NET 5. -author: ardalis -ms.date: 03/08/2021 +description: Use the .NET Upgrade Assistant to upgrade an existing .NET Framework ASP.NET MVC app to .NET 5. The .NET Upgrade Assistant is a CLI tool that helps migrate an app from .NET Framework to .NET 5. +author: thraka +ms.date: 06/01/2021 --- -# Upgrade an ASP.NET MVC App to .NET 5 with the .NET Upgrade Assistant +# Upgrade an ASP.NET MVC app to .NET 5 with the .NET Upgrade Assistant The [.NET Upgrade Assistant](upgrade-assistant-overview.md) is a command-line tool that can assist with upgrading .NET Framework ASP.NET MVC apps to .NET 5. This article provides: @@ -45,7 +45,7 @@ The tool runs and shows you a list of the steps it will do. :::image type="content" source="media/upgrade-assistant-aspnetmvc/initial-run.png" alt-text=".NET Upgrade Assistant initial screen"::: -As each step is completed, the tool provides a set of commands allowing the user to apply or skip the next step, see more details, configure logging, or exit the process. If the tool detects that a step will perform no actions, it automatically skips that step and continues to the next step until it reaches one that has actions to perform. Pressing Enter will perform the next step if no other selection is made. +As each step is completed, the tool provides a set of commands allowing the user to apply or skip the next step, see more details, configure logging, or exit the process. If the tool detects that a step will perform no actions, it automatically skips that step and continues to the next step until it reaches one that has actions to do. Pressing Enter will start the next step if no other selection is made. In this example, the apply step is chosen each time. The first step is to back up the project. @@ -63,7 +63,7 @@ Next, the tool updates the project's NuGet packages. Several packages need updat :::image type="content" source="media/upgrade-assistant-aspnetmvc/update-nuget-packages.png" alt-text=".NET Upgrade Assistant update NuGet packages"::: -Once the packages are updated, the next step is to add template files, if any. The tool notes there are four expected template items that must be added, and then adds them. These include the following files: +Once the packages are updated, the next step is to add template files, if any. The tool notes there are four expected template items that must be added, and then adds them. The following is a list of the template files: - `Program.cs` - `Startup.cs` @@ -115,26 +115,19 @@ By default, the project will be converted as a class library. Change the first l - FilterConfig.cs - RouteConfig.cs -These files - and the entire `App_Start` folder - can be deleted. Likewise, the `Global.asax` and `Global.asax.cs` files can be removed. +These files, and the entire `App_Start` folder, can be deleted. Likewise, the `Global.asax` and `Global.asax.cs` files can be removed. At this point the only errors that remain are related to bundling. There are [several ways to configure bundling and minification in ASP.NET Core](/aspnet/core/migration/mvc?view=aspnetcore-5.0&preserve-view=true#configure-bundling-and-minification). Choose whatever makes the most sense for your project. ## Troubleshooting tips -There are several known problems that can occur when using the .NET Upgrade Assistant. In some cases, these are problems with the [try-convert tool](https://github.com/dotnet/try-convert) that the .NET Upgrade Assistant uses internally. This tool is being frequently updated to address more scenarios, so make sure you're using a recent version. - -- The **try-convert** tool must be installed and updated to at least version _0.7.212201_. -- Earlier versions of the **try-convert** tool didn't support custom target or props files. If you can't upgrade to the latest version, you may need to manually address these issues. If the target project file includes references to custom targets or props files, these references may need to be manually deleted from the file before the .NET Upgrade Assistant is run against it. - -```xml - -``` +There are several known problems that can occur when using the .NET Upgrade Assistant. In some cases, these are problems with the [try-convert tool](https://github.com/dotnet/try-convert) that the .NET Upgrade Assistant uses internally. [The tool's GitHub repository](https://github.com/dotnet/upgrade-assistant#troubleshooting-common-issues) has more troubleshooting tips and known issues. ## See also -- [Upgrade a WPF App to .NET 5 with the .NET Upgrade Assistant](upgrade-assistant-wpf-framework.md) -- [Upgrade a Windows Forms App to .NET 5 with the .NET Upgrade Assistant](upgrade-assistant-winforms-framework.md) +- [Upgrade a WPF App to .NET 5](upgrade-assistant-wpf-framework.md) +- [Upgrade a Windows Forms App to .NET 5](upgrade-assistant-winforms-framework.md) - [Overview of the .NET Upgrade Assistant](upgrade-assistant-overview.md) - [.NET Upgrade Assistant GitHub Repository](https://github.com/dotnet/upgrade-assistant) diff --git a/docs/core/porting/upgrade-assistant-overview.md b/docs/core/porting/upgrade-assistant-overview.md index 22ba37280cb19..132f25a998fdb 100644 --- a/docs/core/porting/upgrade-assistant-overview.md +++ b/docs/core/porting/upgrade-assistant-overview.md @@ -1,8 +1,8 @@ --- title: Overview of the .NET Upgrade Assistant description: Introducing the .NET Upgrade Assistant tool that helps migrate from .NET Framework and upgrades your projects to .NET 5. -author: ardalis -ms.date: 03/08/2021 +author: thraka +ms.date: 06/01/2021 --- # Overview of the .NET Upgrade Assistant @@ -23,7 +23,7 @@ Currently the tool supports the following .NET Framework app types: - .NET Framework console apps - .NET Framework class libraries -The .NET Upgrade Assistant is currently prerelease and is receiving frequent updates. If you discover problems using the tool, please report them in the tool's [GitHub repository](https://github.com/dotnet/upgrade-assistant). +The .NET Upgrade Assistant is currently prerelease and is receiving frequent updates. If you discover problems using the tool, report them in the tool's [GitHub repository](https://github.com/dotnet/upgrade-assistant). ## How to install the .NET Upgrade Assistant @@ -31,10 +31,7 @@ The [Get Started tutorial](https://aka.ms/dotnet-upgrade-assistant-install) walk ### Prerequisites -1. This tool uses MSBuild to work with project files. Make sure that a recent version of MSBuild is installed. An easy way to do this is to [install Visual Studio 2019](https://visualstudio.microsoft.com/downloads/). -1. This tool depends on [try-convert](https://github.com/dotnet/try-convert). In order for the tool to run correctly, you must install the try-convert tool for converting project files to the new SDK style. If you already have **try-convert** installed, you may need to update it instead (since **upgrade-assistant** depends on version _0.7.212201_ or later) - 1. To install try-convert: `dotnet tool install -g try-convert` - 1. To update try-convert: `dotnet tool update -g try-convert` +- This tool uses MSBuild to work with project files. Make sure that a recent version of MSBuild is installed. An easy way to satisfy this requirement is to [install Visual Studio 2019](https://visualstudio.microsoft.com/downloads/). ### Installation steps @@ -50,11 +47,11 @@ Similarly, because the .NET Upgrade Assistant is installed as a .NET CLI tool, i dotnet tool update -g upgrade-assistant ``` -For detailed installation instructions, please refer to the project's [README](https://github.com/dotnet/upgrade-assistant). +For detailed installation instructions, refer to the project's [README](https://github.com/dotnet/upgrade-assistant). ## See also -- [Upgrade a WPF App to .NET 5 with the .NET Upgrade Assistant](upgrade-assistant-wpf-framework.md) -- [Upgrade a Windows Forms App to .NET 5 with the .NET Upgrade Assistant](upgrade-assistant-winforms-framework.md) -- [Upgrade an ASP.NET MVC App to .NET 5 with the .NET Upgrade Assistant](upgrade-assistant-aspnetmvc.md) +- [Upgrade an ASP.NET MVC App to .NET 5](upgrade-assistant-aspnetmvc.md) +- [Upgrade a WPF App to .NET 5](upgrade-assistant-wpf-framework.md) +- [Upgrade a Windows Forms App to .NET 5](upgrade-assistant-winforms-framework.md) - [.NET Upgrade Assistant GitHub Repository](https://github.com/dotnet/upgrade-assistant) diff --git a/docs/core/porting/upgrade-assistant-winforms-framework.md b/docs/core/porting/upgrade-assistant-winforms-framework.md index 7ecba14836c9b..1380e0c14a9d0 100644 --- a/docs/core/porting/upgrade-assistant-winforms-framework.md +++ b/docs/core/porting/upgrade-assistant-winforms-framework.md @@ -1,8 +1,8 @@ --- title: Upgrade Windows Forms apps to .NET 5 description: Use the .NET Upgrade Assistant to upgrade an existing .NET Framework Windows Forms app to .NET 5. The .NET Upgrade Assistant is a CLI tool that helps migrating an app from .NET Framework to .NET 5. -author: ardalis -ms.date: 03/08/2021 +author: thraka +ms.date: 06/01/2021 --- # Upgrade a Windows Forms App to .NET 5 with the .NET Upgrade Assistant @@ -41,7 +41,7 @@ The tool runs and shows you a list of the steps it will do. :::image type="content" source="media/upgrade-assistant-winforms-framework/step1.png" alt-text=".NET Upgrade Assistant initial screen"::: -As each step is completed, the tool provides a set of commands allowing the user to apply or skip the next step, see more details, configure logging, or exit the process. If the tool detects that a step will perform no actions, it will automatically skip that step and continue to the next step until it reaches one that will have actions to perform. Pressing enter will perform the next step if no other selection is made. +As each step is completed, the tool provides a set of commands allowing the user to apply or skip the next step, see more details, configure logging, or exit the process. If the tool detects that a step will perform no actions, it automatically skips that step and continues to the next step until it reaches one that has actions to do. Pressing Enter will start the next step if no other selection is made. In this example, the apply step is chosen each time. The first step is to back up the project. @@ -91,16 +91,13 @@ Notice that the .NET Upgrade Assistant also adds analyzers to the project that a ## Troubleshooting tips -There are several known problems that can occur when using the .NET Upgrade Assistant. In some cases, these are problems with the [try-convert tool](https://github.com/dotnet/try-convert) that the .NET Upgrade Assistant uses internally. This tool is being frequently updated to address more scenarios, so make sure you're using a recent version. +There are several known problems that can occur when using the .NET Upgrade Assistant. In some cases, these are problems with the [try-convert tool](https://github.com/dotnet/try-convert) that the .NET Upgrade Assistant uses internally. -- The **try-convert** tool must be installed and updated to at least version _0.7.212201_. -- Earlier versions of the **try-convert** tool didn't support custom target or props files. If you can't upgrade to the latest version, you may need to manually address these issues. If the target project file includes references to custom targets or props files, these references may need to be manually deleted from the file before the .NET Upgrade Assistant is run against it. - -[The tool's GitHub repository](https://github.com/dotnet/upgrade-assistant#troubleshooting-common-issues) has additional troubleshooting tips and known issues. +[The tool's GitHub repository](https://github.com/dotnet/upgrade-assistant#troubleshooting-common-issues) has more troubleshooting tips and known issues. ## See also -- [Upgrade a WPF App to .NET 5 with the .NET Upgrade Assistant](upgrade-assistant-wpf-framework.md) -- [Upgrade an ASP.NET MVC App to .NET 5 with the .NET Upgrade Assistant](upgrade-assistant-aspnetmvc.md) +- [Upgrade a WPF App to .NET 5](upgrade-assistant-wpf-framework.md) +- [Upgrade an ASP.NET MVC App to .NET 5](upgrade-assistant-aspnetmvc.md) - [Overview of the .NET Upgrade Assistant](upgrade-assistant-overview.md) - [.NET Upgrade Assistant GitHub Repository](https://github.com/dotnet/upgrade-assistant) diff --git a/docs/core/porting/upgrade-assistant-wpf-framework.md b/docs/core/porting/upgrade-assistant-wpf-framework.md index 6de5eadddaca0..2d9dfeb120752 100644 --- a/docs/core/porting/upgrade-assistant-wpf-framework.md +++ b/docs/core/porting/upgrade-assistant-wpf-framework.md @@ -1,8 +1,8 @@ --- title: Upgrade WPF apps to .NET 5 description: Use the .NET Upgrade Assistant to upgrade an existing .NET Framework WPF app to .NET 5. The .NET Upgrade Assistant is a CLI tool that helps migrating an app from .NET Framework to .NET 5. -author: ardalis -ms.date: 03/08/2021 +author: thraka +ms.date: 06/01/2021 --- # Upgrade a WPF App to .NET 5 with the .NET Upgrade Assistant @@ -41,13 +41,13 @@ The tool runs and shows you a list of the steps it will do. :::image type="content" source="media/upgrade-assistant-wpf-framework/initial-run.png" alt-text=".NET Upgrade Assistant initial screen"::: -As each step is completed, the tool provides a set of commands allowing the user to apply or skip the next step, see more details, configure logging, or exit the process. If the tool detects that a step will perform no actions, it will automatically skip that step and continue to the next step until it reaches one that will have actions to perform. Pressing enter will perform the next step if no other selection is made. +As each step is completed, the tool provides a set of commands allowing the user to apply or skip the next step, see more details, configure logging, or exit the process. If the tool detects that a step will perform no actions, it automatically skips that step and continues to the next step until it reaches one that has actions to do. Pressing Enter will start the next step if no other selection is made. In this example, the apply step is chosen each time. The first step is to back up the project. :::image type="content" source="media/upgrade-assistant-wpf-framework/backup-project.png" alt-text=".NET Upgrade Assistant back up project"::: -The tool prompts for a custom path for the backup, or to use the default, which will place the project backup in the same folder with a `.backup` extension. The next step the tool performs is to convert the project file to SDK style. +The tool prompts for a custom path for the backup, or to use the default, which will place the project backup in the same folder with a `.backup` extension. The next step the tool does is to convert the project file to SDK style. :::image type="content" source="media/upgrade-assistant-wpf-framework/convert-project.png" alt-text=".NET Upgrade Assistant convert project to SDK style"::: @@ -91,16 +91,13 @@ Notice that the .NET Upgrade Assistant also adds analyzers to the project that a ## Troubleshooting tips -There are several known problems that can occur when using the .NET Upgrade Assistant. In some cases, these are problems with the [try-convert tool](https://github.com/dotnet/try-convert) that the .NET Upgrade Assistant uses internally. This tool is being frequently updated to address more scenarios, so make sure you're using a recent version. - -- The try-convert tool must be installed and updated to at least version _0.7.21201_. -- Earlier versions of the try-convert tool didn't support custom target or props files. If you can't upgrade to the latest version, you may need to manually address these issues. If the target project file includes references to custom targets or props files, these references may need to be manually deleted from the file before the .NET Upgrade Assistant is run against it. +There are several known problems that can occur when using the .NET Upgrade Assistant. In some cases, these are problems with the [try-convert tool](https://github.com/dotnet/try-convert) that the .NET Upgrade Assistant uses internally. [The tool's GitHub repository](https://github.com/dotnet/upgrade-assistant#troubleshooting-common-issues) has more troubleshooting tips and known issues. ## See also -- [Upgrade a Windows Forms App to .NET 5 with the .NET Upgrade Assistant](upgrade-assistant-winforms-framework.md) -- [Upgrade an ASP.NET MVC App to .NET 5 with the .NET Upgrade Assistant](upgrade-assistant-aspnetmvc.md) +- [Upgrade a Windows Forms App to .NET 5](upgrade-assistant-winforms-framework.md) +- [Upgrade an ASP.NET MVC App to .NET 5](upgrade-assistant-aspnetmvc.md) - [Overview of the .NET Upgrade Assistant](upgrade-assistant-overview.md) - [.NET Upgrade Assistant GitHub Repository](https://github.com/dotnet/upgrade-assistant) diff --git a/docs/fundamentals/toc.yml b/docs/fundamentals/toc.yml index b56846abb7045..a8f48778cfc99 100644 --- a/docs/fundamentals/toc.yml +++ b/docs/fundamentals/toc.yml @@ -2460,12 +2460,12 @@ items: items: - name: Overview href: ../core/porting/upgrade-assistant-overview.md + - name: ASP.NET Core + href: ../core/porting/upgrade-assistant-aspnetmvc.md - name: Windows Presentation Foundation href: ../core/porting/upgrade-assistant-wpf-framework.md - name: Windows Forms href: ../core/porting/upgrade-assistant-winforms-framework.md - - name: ASP.NET Core - href: ../core/porting/upgrade-assistant-aspnetmvc.md - name: Breaking changes displayName: app compatibility href: ../core/compatibility/ From 7c9ccd6ad505ad8af2a8b192422c4b28dbd79108 Mon Sep 17 00:00:00 2001 From: "Andy (Steve) De George" <67293991+adegeo@users.noreply.github.com> Date: Tue, 15 Jun 2021 07:40:07 -0700 Subject: [PATCH 019/105] Fix author (#24674) --- docs/core/porting/upgrade-assistant-aspnetmvc.md | 2 +- docs/core/porting/upgrade-assistant-overview.md | 2 +- docs/core/porting/upgrade-assistant-winforms-framework.md | 2 +- docs/core/porting/upgrade-assistant-wpf-framework.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/core/porting/upgrade-assistant-aspnetmvc.md b/docs/core/porting/upgrade-assistant-aspnetmvc.md index 8c17a5e53be9e..f4b63b5c0529b 100644 --- a/docs/core/porting/upgrade-assistant-aspnetmvc.md +++ b/docs/core/porting/upgrade-assistant-aspnetmvc.md @@ -1,7 +1,7 @@ --- title: Upgrade ASP.NET MVC apps to .NET 5 description: Use the .NET Upgrade Assistant to upgrade an existing .NET Framework ASP.NET MVC app to .NET 5. The .NET Upgrade Assistant is a CLI tool that helps migrate an app from .NET Framework to .NET 5. -author: thraka +author: adegeo ms.date: 06/01/2021 --- # Upgrade an ASP.NET MVC app to .NET 5 with the .NET Upgrade Assistant diff --git a/docs/core/porting/upgrade-assistant-overview.md b/docs/core/porting/upgrade-assistant-overview.md index 132f25a998fdb..83f31eb2b5f02 100644 --- a/docs/core/porting/upgrade-assistant-overview.md +++ b/docs/core/porting/upgrade-assistant-overview.md @@ -1,7 +1,7 @@ --- title: Overview of the .NET Upgrade Assistant description: Introducing the .NET Upgrade Assistant tool that helps migrate from .NET Framework and upgrades your projects to .NET 5. -author: thraka +author: adegeo ms.date: 06/01/2021 --- # Overview of the .NET Upgrade Assistant diff --git a/docs/core/porting/upgrade-assistant-winforms-framework.md b/docs/core/porting/upgrade-assistant-winforms-framework.md index 1380e0c14a9d0..2b594c64f612c 100644 --- a/docs/core/porting/upgrade-assistant-winforms-framework.md +++ b/docs/core/porting/upgrade-assistant-winforms-framework.md @@ -1,7 +1,7 @@ --- title: Upgrade Windows Forms apps to .NET 5 description: Use the .NET Upgrade Assistant to upgrade an existing .NET Framework Windows Forms app to .NET 5. The .NET Upgrade Assistant is a CLI tool that helps migrating an app from .NET Framework to .NET 5. -author: thraka +author: adegeo ms.date: 06/01/2021 --- # Upgrade a Windows Forms App to .NET 5 with the .NET Upgrade Assistant diff --git a/docs/core/porting/upgrade-assistant-wpf-framework.md b/docs/core/porting/upgrade-assistant-wpf-framework.md index 2d9dfeb120752..1d78883167343 100644 --- a/docs/core/porting/upgrade-assistant-wpf-framework.md +++ b/docs/core/porting/upgrade-assistant-wpf-framework.md @@ -1,7 +1,7 @@ --- title: Upgrade WPF apps to .NET 5 description: Use the .NET Upgrade Assistant to upgrade an existing .NET Framework WPF app to .NET 5. The .NET Upgrade Assistant is a CLI tool that helps migrating an app from .NET Framework to .NET 5. -author: thraka +author: adegeo ms.date: 06/01/2021 --- # Upgrade a WPF App to .NET 5 with the .NET Upgrade Assistant From 1ebe041ed5f2579040308d37bcb6662687fc4c97 Mon Sep 17 00:00:00 2001 From: Hadrian Tang Date: Tue, 15 Jun 2021 23:31:04 +0800 Subject: [PATCH 020/105] Keyword release (#24675) --- .../language-reference/keyword-reference.md | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/docs/fsharp/language-reference/keyword-reference.md b/docs/fsharp/language-reference/keyword-reference.md index 114b2a0ce5a1f..a6c75efbd3170 100644 --- a/docs/fsharp/language-reference/keyword-reference.md +++ b/docs/fsharp/language-reference/keyword-reference.md @@ -176,22 +176,16 @@ If you use the `--mlcompatibility` compiler option, the above keywords are avail The following tokens are reserved as keywords for future expansion of the F# language: -- `atomic` - `break` - `checked` - `component` - `const` - `constraint` -- `constructor` - `continue` -- `eager` - `event` - `external` -- `functor` - `include` -- `method` - `mixin` -- `object` - `parallel` - `process` - `protected` @@ -200,7 +194,20 @@ The following tokens are reserved as keywords for future expansion of the F# lan - `tailcall` - `trait` - `virtual` -- `volatile` + +The following tokens were once reserved as keywords but were [released](https://github.com/fsharp/fslang-design/blob/main/FSharp-4.1/FS-1016-unreserve-keywords.md) in F# 4.1, so now you can use them as identifiers: + +Keyword | Reason +-|- +`method` | the F# commmunity are happy with `member` to introduce methods +`constructor` | the F# commmunity are happy with `new` to introduce constructors +`atomic` | this was related to the fad for transactional memory circa 2006. In F# this would now be a library-defined computation expression +`eager` | this is no longer needed, it was initially designed to be `let eager` to match a potential `let lazy` +`object` | there is no need to reserve this +`recursive` | F# is happy using `rec` +`functor` | If F# added parametereized modules, we would use `module M(args) = ...` +`measure` | There is no specific reason to reserve this these days, the `[]` attribute suffices +`volatile` | There is no specific reason to reserve this these days, the `[]` attribute suffices ## See also From 45401bbaef1c86c5e6e236e93184e2a02ca6207b Mon Sep 17 00:00:00 2001 From: Genevieve Warren <24882762+gewarren@users.noreply.github.com> Date: Tue, 15 Jun 2021 08:40:27 -0700 Subject: [PATCH 021/105] .NET Framework 4.5.1 in Visual Studio (#24499) --- .../startup/supportedruntime-element.md | 4 +- ...d-disable-automatic-binding-redirection.md | 6 ++- .../redirect-assembly-versions.md | 2 +- .../deployment-guide-for-developers.md | 40 +++++++------- .../get-started/system-requirements.md | 2 +- .../framework/install/guide-for-developers.md | 52 ++++++++++--------- .../interop/how-to-create-com-wrappers.md | 6 +-- .../mitigation-product-versioning.md | 4 +- .../versions-and-dependencies.md | 8 +++ ...xe-windows-runtime-metadata-export-tool.md | 2 +- includes/net-framework-retired-versions.md | 2 +- includes/net-framework-vs.md | 2 + 12 files changed, 72 insertions(+), 58 deletions(-) create mode 100644 includes/net-framework-vs.md diff --git a/docs/framework/configure-apps/file-schema/startup/supportedruntime-element.md b/docs/framework/configure-apps/file-schema/startup/supportedruntime-element.md index dae459675b313..3d29bf090b1ab 100644 --- a/docs/framework/configure-apps/file-schema/startup/supportedruntime-element.md +++ b/docs/framework/configure-apps/file-schema/startup/supportedruntime-element.md @@ -66,7 +66,7 @@ The `runtime` attribute specifies the Common Language Runtime (CLR) version that ## "sku id" values -The `sku` attribute uses a target framework moniker (TFM) to indicate the version of the .NET Framework that the app targets and requires to run. The following table lists valid values that are supported by the `sku` attribute, starting with the .NET Framework 4. +The `sku` attribute uses a target framework moniker (TFM) to indicate the version of .NET Framework that the app targets and requires to run. The following table lists valid values that are supported by the `sku` attribute, starting with .NET Framework 4. |.NET Framework version|`sku` attribute| |----------------------------|---------------------| @@ -91,7 +91,7 @@ The `sku` attribute uses a target framework moniker (TFM) to indicate the versio ## Example -The following example shows how to specify the supported runtime version in a configuration file. The configuration file indicates that the app targets the .NET Framework 4.7. +The following example shows how to specify the supported runtime version in a configuration file. The configuration file indicates that the app targets .NET Framework 4.7. ```xml diff --git a/docs/framework/configure-apps/how-to-enable-and-disable-automatic-binding-redirection.md b/docs/framework/configure-apps/how-to-enable-and-disable-automatic-binding-redirection.md index 6455b114e4176..80f8fc6cb59c8 100644 --- a/docs/framework/configure-apps/how-to-enable-and-disable-automatic-binding-redirection.md +++ b/docs/framework/configure-apps/how-to-enable-and-disable-automatic-binding-redirection.md @@ -9,11 +9,13 @@ ms.assetid: 5fca42f3-bdce-4b81-a704-61e42c89d3ba --- # How to: Enable and Disable Automatic Binding Redirection -When you compile apps in Visual Studio that target the .NET Framework 4.5.1 and later versions, binding redirects may be automatically added to the app configuration file to override assembly unification. Binding redirects are added if your app or its components reference more than one version of the same assembly, even if you manually specify binding redirects in the configuration file for your app. The automatic binding redirection feature affects desktop apps and web apps that target the .NET Framework 4.5.1 or a later version, although the behavior is slightly different for a web app. You can enable automatic binding redirection if you have existing apps that target previous versions of the .NET Framework, or you can disable this feature if you want to manually author binding redirects. +When you compile apps in Visual Studio that target .NET Framework 4.5.1 and later versions, binding redirects may be automatically added to the app configuration file to override assembly unification. Binding redirects are added if your app or its components reference more than one version of the same assembly, even if you manually specify binding redirects in the configuration file for your app. The automatic binding redirection feature affects desktop apps and web apps that target .NET Framework 4.5.1 or a later version, although the behavior is slightly different for a web app. You can enable automatic binding redirection if you have existing apps that target previous versions of the .NET Framework, or you can disable this feature if you want to manually author binding redirects. + +[!INCLUDE [net-framework-vs](../../../includes/net-framework-vs.md)] ## Disable automatic binding redirects in desktop apps -Automatic binding redirects are enabled by default for Windows desktop apps that target the .NET Framework 4.5.1 and later versions. The binding redirects are added to the output configuration (**app.config**) file when the app is compiled and override the assembly unification that might otherwise take place. The source **app.config** file is not modified. You can disable this feature by modifying the project file for the app or by deselecting a checkbox in the project's properties in Visual Studio. +Automatic binding redirects are enabled by default for Windows desktop apps that target .NET Framework 4.5.1 and later versions. The binding redirects are added to the output configuration (**app.config**) file when the app is compiled and override the assembly unification that might otherwise take place. The source **app.config** file is not modified. You can disable this feature by modifying the project file for the app or by deselecting a checkbox in the project's properties in Visual Studio. ### Disable through project properties diff --git a/docs/framework/configure-apps/redirect-assembly-versions.md b/docs/framework/configure-apps/redirect-assembly-versions.md index e4fd8fdcc3231..f4f5f7e4e3bc5 100644 --- a/docs/framework/configure-apps/redirect-assembly-versions.md +++ b/docs/framework/configure-apps/redirect-assembly-versions.md @@ -57,7 +57,7 @@ You can redirect compile-time binding references to .NET Framework assemblies, t ### Rely on automatic binding redirection -When you create a desktop app in Visual Studio that targets the .NET Framework 4.5.1 or a later version, the app uses automatic binding redirection. This means that if two components reference different versions of the same strong-named assembly, the runtime automatically adds a binding redirection to the newer version of the assembly in the output app configuration (app.config) file. This redirection overrides the assembly unification that might otherwise take place. The source app.config file is not modified. For example, let's say that your app directly references an out-of-band .NET Framework component but uses a third-party library that targets an older version of the same component. When you compile the app, the output app configuration file is modified to contain a binding redirection to the newer version of the component. If you create a web app, you receive a build warning regarding the binding conflict, which in turn, gives you the option to add the necessary binding redirect to the source web configuration file. +When you create a desktop app in Visual Studio that targets .NET Framework 4.5.1 or a later version, the app uses automatic binding redirection. This means that if two components reference different versions of the same strong-named assembly, the runtime automatically adds a binding redirection to the newer version of the assembly in the output app configuration (app.config) file. This redirection overrides the assembly unification that might otherwise take place. The source app.config file is not modified. For example, let's say that your app directly references an out-of-band .NET Framework component but uses a third-party library that targets an older version of the same component. When you compile the app, the output app configuration file is modified to contain a binding redirection to the newer version of the component. If you create a web app, you receive a build warning regarding the binding conflict, which in turn, gives you the option to add the necessary binding redirect to the source web configuration file. If you manually add binding redirects to the source app.config file, at compile time, Visual Studio tries to unify the assemblies based on the binding redirects you added. For example, let's say you insert the following binding redirect for an assembly: diff --git a/docs/framework/deployment/deployment-guide-for-developers.md b/docs/framework/deployment/deployment-guide-for-developers.md index a6572f0a9cfac..9bdf671334b33 100644 --- a/docs/framework/deployment/deployment-guide-for-developers.md +++ b/docs/framework/deployment/deployment-guide-for-developers.md @@ -28,7 +28,7 @@ You can download the redistributable packages and language packs for .NET Framew Important notes: -- Versions of the .NET Framework from .NET Framework 4.5.1 through [!INCLUDE[net_current](../../../includes/net-current-version.md)] are in-place updates to .NET Framework 4.5, which means they use the same runtime version, but the assembly versions are updated and include new types and members. +- Versions of .NET Framework from .NET Framework 4.5.1 through [!INCLUDE[net_current](../../../includes/net-current-version.md)] are in-place updates to .NET Framework 4.5, which means they use the same runtime version, but the assembly versions are updated and include new types and members. - .NET Framework 4.5 and later versions are built incrementally on .NET Framework 4. When you install .NET Framework 4.5 or later versions on a system that has .NET Framework 4 installed, the version 4 assemblies are replaced with newer versions. @@ -36,7 +36,7 @@ You can download the redistributable packages and language packs for .NET Framew - You must have administrator privileges to install .NET Framework 4.5 or later versions. -- .NET Framework 4.5 is included in Windows 8 and Windows Server 2012, so you don't have to deploy it with your app on those operating systems. Similarly, .NET Framework 4.5.1 is included in Windows 8.1 and Windows Server 2012 R2. .NET Framework 4.5.2 isn't included in any operating systems. .NET Framework 4.6 is included in Windows 10, .NET Framework 4.6.1 is included in Windows 10 November Update, and .NET Framework 4.6.2 is included in Windows 10 Anniversary Update. .NET Framework 4.7 is included in Windows 10 Creators Update, .NET Framework 4.7.1 is included in Windows 10 Fall Creators Update, and .NET Framework 4.7.2 is included in Windows 10 October 2018 Update and Windows 10 April 2018 Update. .NET Framework 4.8 is included in Windows 10 May 2019 Update and all later Windows 10 updates. For a full list of hardware and software requirements, see [System Requirements](../get-started/system-requirements.md). +- .NET Framework 4.5 is included in Windows 8 and Windows Server 2012, so you don't have to deploy it with your app on those operating systems. Similarly, .NET Framework 4.5.1 is included in Windows 8.1 and Windows Server 2012 R2. .NET Framework 4.5.2 isn't included in any operating systems. .NET Framework 4.6 is included in Windows 10, .NET Framework 4.6.1 is included in Windows 10 November Update, and .NET Framework 4.6.2 is included in Windows 10 Anniversary Update. .NET Framework 4.7 is included in Windows 10 Creators Update, .NET Framework 4.7.1 is included in Windows 10 Fall Creators Update, and .NET Framework 4.7.2 is included in Windows 10 October 2018 Update and Windows 10 April 2018 Update. .NET Framework 4.8 is included in Windows 10 May 2019 Update and all later Windows 10 updates. For a full list of hardware and software requirements, see [System Requirements](../get-started/system-requirements.md). - Starting with .NET Framework 4.5, your users can view a list of running .NET Framework apps during setup and close them easily. This may help avoid system restarts caused by .NET Framework installations. See [Reducing System Restarts](reducing-system-restarts.md). @@ -58,7 +58,7 @@ When you're ready to publish your app to a web server or other centralized locat ## Redistributable packages -The .NET Framework is available in two redistributable packages: web installer (bootstrapper) and offline installer (stand-alone redistributable). All .NET Framework downloads are hosted on the [Download .NET Framework page](https://dotnet.microsoft.com/download/dotnet-framework/). The following table compares the two packages: +.NET Framework is available in two redistributable packages: web installer (bootstrapper) and offline installer (stand-alone redistributable). All .NET Framework downloads are hosted on the [Download .NET Framework page](https://dotnet.microsoft.com/download/dotnet-framework/). The following table compares the two packages: ||Web installer|Offline installer| |-|-------------------|-----------------------| @@ -73,9 +73,9 @@ The .NET Framework is available in two redistributable packages: web installer ( ## Deployment methods - Four deployment methods are available: +Four deployment methods are available: -- You can set a dependency on the .NET Framework. You can specify the .NET Framework as a prerequisite in your app's installation, using one of these methods: +- You can set a dependency on .NET Framework. You can specify .NET Framework as a prerequisite in your app's installation, using one of these methods: - Use [ClickOnce deployment](#clickonce-deployment) (available with Visual Studio) @@ -85,7 +85,7 @@ The .NET Framework is available in two redistributable packages: web installer ( - Use the [Windows Installer XML (WiX) toolset](#wix) -- You can ask your users to [install the .NET Framework manually](#installing_manually). +- You can ask your users to [install .NET Framework manually](#installing_manually). - You can chain (include) the .NET Framework setup process in your app's setup, and decide how you want to handle the .NET Framework installation experience: @@ -95,15 +95,15 @@ The .NET Framework is available in two redistributable packages: web installer ( These deployment methods are discussed in detail in the following sections. -## Setting a dependency on the .NET Framework +## Set a dependency on .NET Framework -If you use ClickOnce, InstallAware, InstallShield, or WiX to deploy your app, you can add a dependency on the .NET Framework so it can be installed as part of your app. +If you use ClickOnce, InstallAware, InstallShield, or WiX to deploy your app, you can add a dependency on .NET Framework so it can be installed as part of your app. ### ClickOnce deployment ClickOnce deployment is available for projects that are created with Visual Basic and Visual C#, but it is not available for Visual C++. -In Visual Studio, to choose ClickOnce deployment and add a dependency on the .NET Framework: +In Visual Studio, to choose ClickOnce deployment and add a dependency on .NET Framework: 1. Open the app project you want to publish. @@ -115,7 +115,7 @@ In Visual Studio, to choose ClickOnce deployment and add a dependency on the .NE 5. In the **Prerequisites** dialog box, make sure that the **Create setup program to install prerequisite components** check box is selected. -6. In the prerequisites list, locate and select the version of the .NET Framework that you've used to build your project. +6. In the prerequisites list, locate and select the version of .NET Framework that you've used to build your project. 7. Choose an option to specify the source location for the prerequisites, and then choose **OK**. @@ -143,11 +143,11 @@ The Windows Installer XML (WiX) toolset builds Windows installation packages fro ## Install .NET Framework manually -In some situations, it might be impractical to automatically install the .NET Framework with your app. In that case, you can have users install the .NET Framework themselves. The redistributable package is available in [two packages](#redistributable-packages). In your setup process, provide instructions for how users should locate and install the .NET Framework. +In some situations, it might be impractical to automatically install .NET Framework with your app. In that case, you can have users install .NET Framework themselves. The redistributable package is available in [two packages](#redistributable-packages). In your setup process, provide instructions for how users should locate and install .NET Framework. -## Chaining the .NET Framework installation to your app's setup +## Chain the .NET Framework installation to your app's setup If you're creating a custom setup program for your app, you can chain (include) the .NET Framework setup process in your app's setup process. Chaining provides two UI options for the .NET Framework installation: @@ -207,7 +207,7 @@ If you have a custom setup package, you may want to silently launch and track th > [!IMPORTANT] > In determining whether the correct version of the .NET Framework is already installed, you should check whether your target version *or* a later version is installed, not whether your target version is installed. In other words, you should evaluate whether the release key you retrieve from the registry is greater than or equal to the release key of your target version, *not* whether it equals the release key of your target version. -- [Detect](#detecting-the-language-packs) whether the language packs are already installed on the user’s computer. +- [Detect](#detect-language-packs) whether the language packs are already installed on the user’s computer. - If you want to control the deployment, silently launch and track the .NET Framework setup process (see [How to: Get Progress from the .NET Framework 4.5 Installer](how-to-get-progress-from-the-dotnet-installer.md)). @@ -219,12 +219,12 @@ If you have a custom setup package, you may want to silently launch and track th -### Detecting the .NET Framework +### Detect .NET Framework -The .NET Framework installer writes registry keys when installation is successful. You can test whether .NET Framework 4.5 or later is installed by checking the `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full` folder in the registry for a `DWORD` value named `Release`. (Note that "NET Framework Setup" doesn't begin with a period.) The existence of this key indicates that .NET Framework 4.5 or a later version has been installed on that computer. The value of `Release` indicates which version of the .NET Framework is installed. +The .NET Framework installer writes registry keys when installation is successful. You can test whether .NET Framework 4.5 or later is installed by checking the `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full` folder in the registry for a `DWORD` value named `Release`. (Note that "NET Framework Setup" doesn't begin with a period.) The existence of this key indicates that .NET Framework 4.5 or a later version has been installed on that computer. The value of `Release` indicates which version of .NET Framework is installed. > [!IMPORTANT] -> You should check for a value **greater than or equal to** the release keyword value when attempting to detect whether a specific version is present. +> Check for a value **greater than or equal to** the release keyword value when attempting to detect whether a specific version is present. [!INCLUDE[Release key values note](~/includes/version-keys-note.md)] @@ -250,7 +250,7 @@ The .NET Framework installer writes registry keys when installation is successfu |.NET Framework 4.5.1 installed on Windows 8, Windows 7|378758| |.NET Framework 4.5|378389| -### Detecting the language packs +### Detect language packs You can test whether a specific language pack is installed by checking the HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\\*LCID* folder in the registry for a DWORD value named `Release`. (Note that "NET Framework Setup" doesn't begin with a period.) *LCID* specifies a locale identifier; see [supported languages](#supported-languages) for a list of these. @@ -268,7 +268,7 @@ To determine whether the final release version of a language pack is installed f ### Chaining the language packs to your app setup -The .NET Framework provides a set of stand-alone language pack executable files that contain localized resources for specific cultures. The language packs are available from the Download .NET Framework pages: +.NET Framework provides a set of stand-alone language pack executable files that contain localized resources for specific cultures. The language packs are available from the .NET Framework download pages: - [.NET Framework 4.8](https://dotnet.microsoft.com/download/dotnet-framework/net48) - [.NET Framework 4.7.2](https://dotnet.microsoft.com/download/dotnet-framework/net472) @@ -282,7 +282,7 @@ The .NET Framework provides a set of stand-alone language pack executable files - [.NET Framework 4.5](https://dotnet.microsoft.com/download/dotnet-framework/net45) > [!IMPORTANT] -> The language packs don't contain the .NET Framework components that are required to run an app; you must install the .NET Framework by using the web or offline installer before you install a language pack. +> The language packs don't contain the .NET Framework components that are required to run an app. You must install .NET Framework by using the web or offline installer before you install a language pack. Starting with .NET Framework 4.5.1, the package names take the form NDP<`version`>-KB<`number`>-x86-x64-AllOS-<`culture`>.exe, where `version` is the version number of the .NET Framework, `number` is a Microsoft Knowledge Base article number, and `culture` specifies a [country/region](#supported-languages). An example of one of these packages is `NDP452-KB2901907-x86-x64-AllOS-JPN.exe`. Package names are listed in the [Redistributable Packages](#redistributable-packages) section earlier in this article. @@ -327,7 +327,7 @@ See the following content: - [Windows Update Agent result codes](/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc720442(v=ws.10)) -## Uninstalling the .NET Framework +## Uninstall .NET Framework Starting with Windows 8, you can uninstall .NET Framework 4.5 or later versions by using **Turn Windows features on and off** in Control Panel. In older versions of Windows, you can uninstall .NET Framework 4.5 or later versions by using **Add or Remove Programs** in Control Panel. diff --git a/docs/framework/get-started/system-requirements.md b/docs/framework/get-started/system-requirements.md index f39cfabe9f304..2f5c36ad53dbb 100644 --- a/docs/framework/get-started/system-requirements.md +++ b/docs/framework/get-started/system-requirements.md @@ -64,7 +64,7 @@ For information on the support lifecycle of .NET Framework versions, see [Micros | Windows Vista SP2|32-bit and 64-bit | -- | .NET Framework 4

.NET Framework 4.5

.NET Framework 4.5.1

.NET Framework 4.5.2

.NET Framework 4.6 | | Windows XP |32-bit and 64-bit | -- | .NET Framework 4 | - **Notes:** +**Notes:** - On Windows 7 systems, .NET Framework requires Windows 7 SP1. If you're on Windows 7 and haven't yet installed Service Pack 1, you need to do so before installing the .NET Framework. diff --git a/docs/framework/install/guide-for-developers.md b/docs/framework/install/guide-for-developers.md index 1b902910adca8..0eef4b8dddfe0 100644 --- a/docs/framework/install/guide-for-developers.md +++ b/docs/framework/install/guide-for-developers.md @@ -9,25 +9,25 @@ helpviewer_keywords: - "installation [.NET Framework]" ms.assetid: daf9d9d5-84ac-4bd9-a864-27665ffd0f5c --- -# Install the .NET Framework for developers +# Install .NET Framework for developers -.NET is an integral part of many apps running on Windows and provides common functionality for those apps to run. For developers, the .NET Framework provides a comprehensive and consistent programming model for building apps that have visually stunning user experiences and seamless and secure communication. +.NET is an integral part of many apps running on Windows and provides common functionality for those apps to run. For developers, .NET Framework provides a comprehensive and consistent programming model for building apps that have visually stunning user experiences and seamless and secure communication. > [!NOTE] -> This topic is intended for **developers** who either want to install the .NET Framework on their own system or who want to install it with their applications. For **users** interested in installing the .NET Framework, see the individual topics that discuss installing the .NET Framework on specific operating systems, such as [Install the .NET Framework on Windows 10 and Windows Server 2016](on-windows-10.md). +> This article is intended for **developers** who either want to install .NET Framework on their own system or who want to install it with their applications. For **users** interested in installing .NET Framework, see the individual articles that discuss installing .NET Framework on specific operating systems, such as [Install .NET Framework on Windows 10 and Windows Server 2016](on-windows-10.md). -This article provides links for installing all versions of the .NET Framework from .NET Framework 4.5 to .NET Framework 4.8 on your computer. If you're a developer, you can also use these links to download and redistribute the .NET Framework with your apps. For information on deploying a version of the .NET Framework with your app, see [.NET Framework deployment guide for developers](../deployment/deployment-guide-for-developers.md). +This article provides links for installing all versions of .NET Framework from .NET Framework 4.5 to .NET Framework 4.8 on your computer. If you're a developer, you can also use these links to download and redistribute .NET Framework with your apps. For information on deploying a version of .NET Framework with your app, see [.NET Framework deployment guide for developers](../deployment/deployment-guide-for-developers.md). [!INCLUDE[net_retirement](../../../includes/net-framework-retired-versions.md)] [!INCLUDE[net-framework-4-versions](../../../includes/net-framework-4x-versions.md)] -For more information about versions of the .NET Framework and how to determine which versions are installed on a computer, see [Versions and Dependencies](../migration-guide/versions-and-dependencies.md) and [How to: Determine Which .NET Framework Versions Are Installed](../migration-guide/how-to-determine-which-versions-are-installed.md). +For more information about versions of .NET Framework and how to determine which versions are installed on a computer, see [Versions and Dependencies](../migration-guide/versions-and-dependencies.md) and [How to: Determine Which .NET Framework Versions Are Installed](../migration-guide/how-to-determine-which-versions-are-installed.md). > [!NOTE] -> For information on the .NET Framework 3.5, see [Install the .NET Framework 3.5 on Windows 10, Windows 8.1, and Windows 8](dotnet-35-windows-10.md). +> For information on .NET Framework 3.5, see [Install the .NET Framework 3.5 on Windows 10, Windows 8.1, and Windows 8](dotnet-35-windows-10.md). -Use the following table for quick links, or read further for details. To view the system requirements for the .NET Framework before installation, see [System Requirements](../get-started/system-requirements.md). For help with troubleshooting, see [Troubleshooting](troubleshoot-blocked-installations-and-uninstallations.md). +Use the following table for quick links, or read further for details. To view the system requirements for .NET Framework before installation, see [System Requirements](../get-started/system-requirements.md). For help with troubleshooting, see [Troubleshooting](troubleshoot-blocked-installations-and-uninstallations.md). | .NET Framework version | Installer (Developer Pack and Runtime) | Platform support | | ---------------------- | -------------------------------------- | ---------------- | @@ -42,6 +42,8 @@ Use the following table for quick links, or read further for details. To view th |**4.5.1** | [.NET Framework 4.5.1](https://dotnet.microsoft.com/download/dotnet-framework/net451) | **Included in:**

Windows 8.1
Windows Server 2012 R2
[Visual Studio 2013](https://my.visualstudio.com/Downloads?q=visual%20studio%202013)

**You can install on:**

Windows 8 and earlier
Windows Server 2012 and earlier
(for a full list, see [system requirements](../get-started/system-requirements.md))| |**4.5** | [.NET Framework 4.5](https://dotnet.microsoft.com/download/dotnet-framework/net45) | **Included in:**

Windows 8
Windows Server 2012
[Visual Studio 2012](https://my.visualstudio.com/Downloads?q=visual%20studio%202012)

**You can install on:**

Windows 7 and earlier
Windows Server 2008 SP2 and earlier
(for a full list, see [system requirements](../get-started/system-requirements.md))| +[!INCLUDE [net-framework-vs](../../../includes/net-framework-vs.md)] + You can install the **Developer Pack** for a specific version of the .NET Framework, if one is available, on all supported platforms. You can install the **Web or Offline installer** on: @@ -52,17 +54,17 @@ You can install the **Web or Offline installer** on: For a full list, see [System Requirements](../get-started/system-requirements.md). -For a general introduction to the .NET Framework for both users and developers, see [Getting Started](../get-started/index.md). For information about deploying the .NET Framework with your app, see the [deployment guide](../deployment/deployment-guide-for-developers.md). To read about the architecture and key features of the .NET Framework, see the [overview](../get-started/overview.md). +For a general introduction to .NET Framework for both users and developers, see [Getting Started](../get-started/index.md). For information about deploying .NET Framework with your app, see the [deployment guide](../deployment/deployment-guide-for-developers.md). To read about the architecture and key features of .NET Framework, see the [overview](../get-started/overview.md). ## Installation choices -Install a developer targeting pack to develop against the most recent version of the .NET Framework in Visual Studio or another development environment, or download the .NET Framework redistributable for distribution with your app or control. +Install a developer targeting pack to develop against the most recent version of .NET Framework in Visual Studio or another development environment, or download the .NET Framework redistributable for distribution with your app or control. ### To install the .NET Framework Developer Pack or Targeting Pack -A *targeting pack* lets your app target a specific version of the .NET Framework when developing in Visual Studio and some other development environments. A *developer pack* includes a specific version of the .NET Framework and its accompanying SDK along with its corresponding targeting pack. +A *targeting pack* lets your app target a specific version of .NET Framework when developing in Visual Studio and some other development environments. A *developer pack* includes a specific version of .NET Framework and its accompanying SDK along with its corresponding targeting pack. -The developer pack for .NET Framework 4.5.1 or 4.5.2, the targeting pack for .NET Framework 4.6, and the developer pack for .NET Framework 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, or 4.8 provides a particular .NET Framework's version of the reference assemblies, language packs, and IntelliSense files for use in an integrated development environment such as Visual Studio. If you are using Visual Studio, the developer pack or targeting pack also adds the installed version of the .NET Framework to the target choices when you create a new project. Choose one of the following: +The developer pack for .NET Framework 4.5.1 or 4.5.2, the targeting pack for .NET Framework 4.6, and the developer pack for .NET Framework 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, or 4.8 provides a particular .NET Framework's version of the reference assemblies, language packs, and IntelliSense files for use in an integrated development environment such as Visual Studio. If you're using Visual Studio, the developer pack or targeting pack also adds the installed version of .NET Framework to the target choices when you create a new project. Choose one of the following: - [.NET Framework 4.8](https://dotnet.microsoft.com/download/dotnet-framework/net48) - [.NET Framework 4.7.2](https://dotnet.microsoft.com/download/dotnet-framework/net472) @@ -74,17 +76,17 @@ The developer pack for .NET Framework 4.5.1 or 4.5.2, the targeting pack for .NE - [.NET Framework 4.5.2](https://dotnet.microsoft.com/download/dotnet-framework/net452) to install version 4.5.2 on Windows 8.1 or earlier, Visual Studio 2013, Visual Studio 2012, or other IDEs. - [.NET Framework 4.5.1](https://dotnet.microsoft.com/download/dotnet-framework/net451) to install version 4.5.1 on Visual Studio 2012 or other IDEs. -From the developer pack download page, choose **Download**. Next choose **Run** or **Save**, and follow the instructions when prompted. You can also install the developer pack or targeting pack for a specific version of the .NET Framework by selecting it from the optional components in the **.NET desktop development** workload in the Visual Studio Installer, as the following figure shows. +From the developer pack download page, choose **Download**. Next, choose **Run** or **Save**, and follow the instructions when prompted. You can also install the developer pack or targeting pack for a specific version of .NET Framework by selecting it from the optional components in the **.NET desktop development** workload in the Visual Studio Installer, as the following figure shows. ![Visual Studio Installer with the .NET desktop development workload](./media/visual-studio-installer.jpg) -When you target a particular version of the .NET Framework, your application is built by using the reference assemblies that are included with that version's developer pack. At runtime, assemblies are resolved from the Global Assembly Cache, and the reference assemblies are not used. +When you target a particular version of .NET Framework, your application is built by using the reference assemblies that are included with that version's developer pack. At runtime, assemblies are resolved from the Global Assembly Cache, and the reference assemblies are not used. -When building an application from Visual Studio or using MSBuild from the command line, MSBuild may display error MSB3644, "The reference assemblies for framework "*framework-version*" were not found." To address the error, download the developer pack or the targeting pack for that version of the .NET Framework. +When building an application from Visual Studio or using MSBuild from the command line, MSBuild may display error MSB3644, "The reference assemblies for framework "*framework-version*" were not found." To address the error, download the developer pack or the targeting pack for that version of .NET Framework. ### To install or download the .NET Framework redistributable -Installers download the .NET Framework components for an app or control that targets those versions of the .NET Framework. These components must be installed on each computer where the app or control runs. These installers are redistributable, so you can include them in the setup program for your app. +Installers download .NET Framework components for an app or control that targets those versions of .NET Framework. These components must be installed on each computer where the app or control runs. These installers are redistributable, so you can include them in the setup program for your app. The download page is provided in several languages, but most of the downloads are provided in English only. For additional language support, you must install a language pack. @@ -92,7 +94,7 @@ Two types of redistributable installers are available: - **Web installer** (web bootstrapper) downloads the required components and the language pack that matches the operating system of the installation computer from the web. This package is much smaller than the offline installer but requires a consistent Internet connection. You can download the [standalone language packs](#to-install-language-packs) to install additional language support. -- **Offline installer** (standalone redistributable) contains all the required components for installing the .NET Framework but doesn't contain language packs. This download is larger than the web installer. The offline installer doesn't require an Internet connection. After you run the offline installer, you can download the [standalone language packs](#to-install-language-packs) to install language support. Use the offline installer if you can't rely on having a consistent Internet connection. +- **Offline installer** (standalone redistributable) contains all the required components for installing .NET Framework but doesn't contain language packs. This download is larger than the web installer. The offline installer doesn't require an internet connection. After you run the offline installer, you can download the [standalone language packs](#to-install-language-packs) to install language support. Use the offline installer if you can't rely on having a consistent Internet connection. Both web and offline installers are designed for x86-based and x64-based computers (see [system requirements](../get-started/system-requirements.md)), but do not support Itanium-based computers. @@ -109,17 +111,17 @@ Both web and offline installers are designed for x86-based and x64-based compute - [.NET Framework 4.5.1](https://dotnet.microsoft.com/download/dotnet-framework/net451) - [.NET Framework 4.5](https://dotnet.microsoft.com/download/dotnet-framework/net45) -1. Select the language for the download page. This option does not download the localized resources of the .NET Framework; it only affects the text displayed on the download page. +1. Select the language for the download page. This option does not download the localized resources of .NET Framework; it only affects the text displayed on the download page. 1. Choose **Download**. 1. If prompted, select the download that matches your system architecture, and then choose **Next**. -1. When the download prompt appears do **ONE** of the following: +1. When the download prompt appears, do *one* of the following: - - If you want to install the .NET Framework on your computer, choose **Run**, and then follow the prompts on your screen. + - If you want to install .NET Framework on your computer, choose **Run**, and then follow the prompts on your screen. - - If you want to download the .NET Framework for redistribution, choose **Save**, and then follow the prompts on your screen. + - If you want to download .NET Framework for redistribution, choose **Save**, and then follow the prompts on your screen. 1. If you want to download resources for additional languages, follow the instructions in the next section to install one or more language packs. @@ -191,15 +193,15 @@ The following table lists the supported languages. ## Next steps -- If you're new to the .NET Framework, see the [overview](../get-started/overview.md) for an introduction to key concepts and components. +- If you're new to .NET Framework, see the [overview](../get-started/overview.md) for an introduction to key concepts and components. -- For new features and improvements in the .NET Framework 4.5 and all later versions, see [What's New](../whats-new/index.md). +- For new features and improvements in .NET Framework 4.5 and all later versions, see [What's New](../whats-new/index.md). -- For detailed information about deploying the .NET Framework with your app, see [Deployment Guide for Developers](../deployment/deployment-guide-for-developers.md). +- For detailed information about deploying .NET Framework with your app, see [Deployment Guide for Developers](../deployment/deployment-guide-for-developers.md). -- For changes that affect the deployment of the .NET Framework with your app, see [Reducing System Restarts During .NET Framework 4.5 Installations](../deployment/reducing-system-restarts.md). +- For changes that affect the deployment of .NET Framework with your app, see [Reducing System Restarts During .NET Framework 4.5 Installations](../deployment/reducing-system-restarts.md). -- For information about migrating your app from the .NET Framework 4 to .NET Framework 4.5 or later versions, see the [migration guide](../migration-guide/index.md). +- For information about migrating your app from .NET Framework 4 to .NET Framework 4.5 or later versions, see the [migration guide](../migration-guide/index.md). - See [.NET Framework Reference Source](https://referencesource.microsoft.com/) to browse through .NET Framework source code online. The reference source is also available on [GitHub](https://github.com/Microsoft/referencesource). You can [download the reference source](https://referencesource.microsoft.com/download.html) for offline viewing and step through the sources (including patches and updates) during debugging. For more information, see the blog entry [A new look for .NET Reference Source](https://devblogs.microsoft.com/dotnet/a-new-look-for-net-reference-source/). diff --git a/docs/framework/interop/how-to-create-com-wrappers.md b/docs/framework/interop/how-to-create-com-wrappers.md index c8496c9eefd06..08f1292593003 100644 --- a/docs/framework/interop/how-to-create-com-wrappers.md +++ b/docs/framework/interop/how-to-create-com-wrappers.md @@ -9,13 +9,13 @@ ms.assetid: bdf89bea-1623-45ee-a57b-cf7c90395efa --- # How to: Create COM Wrappers -You can create Component Object Model (COM) wrappers by using Visual Studio 2005 features or the .NET Framework tools Tlbimp.exe and Regasm.exe. Both methods generate two types of COM wrappers: +You can create Component Object Model (COM) wrappers by using Visual Studio features or the .NET Framework tools Tlbimp.exe and Regasm.exe. Both methods generate two types of COM wrappers: - A [Runtime Callable Wrapper](../../standard/native-interop/runtime-callable-wrapper.md) from a type library to run a COM object in managed code. - A [COM Callable Wrapper](../../standard/native-interop/com-callable-wrapper.md) with the required registry settings to run a managed object in a native application. -In Visual Studio 2005, you can add the COM wrapper as a reference to your project. +In Visual Studio, you can add the COM wrapper as a reference to your project. ## Wrap COM Objects in a Managed Application @@ -56,7 +56,7 @@ You can now write code to access the COM object. You can begin by declaring the 4. Select the **Register for COM interop** check box. - When you build the project, the assembly is automatically registered for COM interop. If you are building a native application in Visual Studio 2005, you can use the assembly by clicking **Add Reference** on the **Project** menu. + When you build the project, the assembly is automatically registered for COM interop. If you are building a native application in Visual Studio, you can use the assembly by clicking **Add Reference** on the **Project** menu. ### To create a COM callable wrapper using .NET Framework tools diff --git a/docs/framework/migration-guide/mitigation-product-versioning.md b/docs/framework/migration-guide/mitigation-product-versioning.md index 74707074163bf..5f96b70f89dc5 100644 --- a/docs/framework/migration-guide/mitigation-product-versioning.md +++ b/docs/framework/migration-guide/mitigation-product-versioning.md @@ -4,9 +4,9 @@ description: In this article, learn how .NET Framework 4.6 and later product ver ms.date: "03/30/2017" ms.assetid: 1c4de9d7-9aba-427a-8f38-0ab9bfb8f85e --- -# Mitigation: Product Versioning +# Mitigation: Product versioning -In the .NET Framework 4.6 and later, product versioning has changed from the previous releases of the .NET Framework (the .NET Framework 4, 4.5, 4.5.1, and 4.5.2). +In .NET Framework 4.6 and later versions, product versioning has changed from the previous releases of .NET Framework (.NET Framework 4, 4.5, 4.5.1, and 4.5.2). ## Product versioning changes diff --git a/docs/framework/migration-guide/versions-and-dependencies.md b/docs/framework/migration-guide/versions-and-dependencies.md index d33a56d9b0bbd..f6951c5863bba 100644 --- a/docs/framework/migration-guide/versions-and-dependencies.md +++ b/docs/framework/migration-guide/versions-and-dependencies.md @@ -156,6 +156,8 @@ The tables that follow summarize .NET Framework version history and correlate ea |**Windows Server versions**|✔️ 2012 R2

➕ 2012
➕ 2008 R2 SP1
➕ 2008 SP2| |**To determine installed .NET version**|Use `Release` DWORD:

- 378675 (Windows 8.1)
- 378758 (all other)

(See [instructions](how-to-determine-which-versions-are-installed.md))| +[!INCLUDE [net-framework-vs](../../../includes/net-framework-vs.md)] + ### .NET Framework 4.5 - [New features](../whats-new/index.md#whats-new-in-net-framework-45) @@ -169,6 +171,8 @@ The tables that follow summarize .NET Framework version history and correlate ea |**Windows Server versions**|✔️ 2012
➕ 2008 R2 SP1
➕ 2008 SP2| |**To determine installed .NET version**|Use `Release` DWORD 378389

(See [instructions](how-to-determine-which-versions-are-installed.md))| +[!INCLUDE [net-framework-vs](../../../includes/net-framework-vs.md)] + ### .NET Framework 4 [New features](/previous-versions/dotnet/netframework-4.0/ms171868(v=vs.100)) @@ -181,6 +185,8 @@ The tables that follow summarize .NET Framework version history and correlate ea |**Windows Server versions**|➕ 2008 R2 SP1
➕ 2008 SP2
➕ 2003| |**To determine installed .NET version**|See [instructions](how-to-determine-which-versions-are-installed.md)| +[!INCLUDE [net-framework-vs](../../../includes/net-framework-vs.md)] + ### .NET Framework 3.5 [New features](/previous-versions/visualstudio/visual-studio-2008/ms171868\(v=vs.90\)): @@ -289,6 +295,8 @@ Some changes in .NET Framework may require changes to your app code; see [Applic In addition, if your app targets version 2.0, 3.0, or 3.5, your users may be required to enable .NET Framework 3.5 on a Windows 8, Windows 8.1, or Windows 10 computer before they can run your app. For more information, see [Install the .NET Framework 3.5 on Windows 10, Windows 8.1, and Windows 8](../install/dotnet-35-windows-10.md). +[!INCLUDE [net-framework-vs](../../../includes/net-framework-vs.md)] + ## Next steps - If you're new to the .NET Framework, see the [overview](../get-started/overview.md) for an introduction to key concepts and features. diff --git a/docs/framework/tools/winmdexp-exe-windows-runtime-metadata-export-tool.md b/docs/framework/tools/winmdexp-exe-windows-runtime-metadata-export-tool.md index 91c8bab817773..ef1cda4c85314 100644 --- a/docs/framework/tools/winmdexp-exe-windows-runtime-metadata-export-tool.md +++ b/docs/framework/tools/winmdexp-exe-windows-runtime-metadata-export-tool.md @@ -9,7 +9,7 @@ ms.assetid: d2ce0683-343d-403e-bb8d-209186f7a19d --- # Winmdexp.exe (Windows Runtime Metadata Export Tool) -The Windows Runtime Metadata Export Tool (Winmdexp.exe) transforms a .NET Framework module into a file that contains Windows Runtime metadata. Although .NET Framework assemblies and Windows Runtime metadata files use the same physical format, there are differences in the content of the metadata tables, which means that .NET Framework assemblies are not automatically usable as Windows Runtime Components. The process of turning a .NET Framework module into a Windows Runtime component is referred to as *exporting*. In the .NET Framework 4.5 and .NET Framework 4.5.1, the resulting Windows metadata (.winmd) file contains both metadata and implementation. +The Windows Runtime Metadata Export Tool (Winmdexp.exe) transforms a .NET Framework module into a file that contains Windows Runtime metadata. Although .NET Framework assemblies and Windows Runtime metadata files use the same physical format, there are differences in the content of the metadata tables, which means that .NET Framework assemblies are not automatically usable as Windows Runtime Components. The process of turning a .NET Framework module into a Windows Runtime component is referred to as *exporting*. In .NET Framework 4.5 and 4.5.1, the resulting Windows metadata (.winmd) file contains both metadata and implementation. When you use the **Windows Runtime Component** template, which is located under **Windows Store** for C# and Visual Basic in Visual Studio 2013 or Visual Studio 2012, the compiler target is a .winmdobj file, and a subsequent build step calls Winmdexp.exe to export the .winmdobj file to a .winmd file. This is the recommended way to build a Windows Runtime component. Use Winmdexp.exe directly when you want more control over the build process than Visual Studio provides. diff --git a/includes/net-framework-retired-versions.md b/includes/net-framework-retired-versions.md index 6c7594b937262..2d599d0001f26 100644 --- a/includes/net-framework-retired-versions.md +++ b/includes/net-framework-retired-versions.md @@ -6,4 +6,4 @@ > > If you're using .NET Framework 4.5.2, 4.6, or 4.6.1, update your deployed runtime to a more recent version, such as **.NET Framework 4.6.2**, before _April 26, 2022_ in order to continue to receive updates and technical support. > -> Updated SHA2 signed installers will be available for .NET Framework 3.5 SP1, and 4.6.2 through 4.8. For more information, see the [SHA1 retirement plan](https://support.microsoft.com/topic/-net-framework-retiring-sha-1-content-9750f20d-a9ef-4d43-853f-2075f0a9d7da), the [.NET 4.5.2, 4.6, and 4.6.1 lifecycle update blog post](https://devblogs.microsoft.com/dotnet/net-framework-4-5-2-4-6-4-6-1-will-reach-end-of-support-on-april-26-2022/) and the [FAQ](https://support.microsoft.com/topic/-net-framework-4-5-2-4-6-4-6-1-end-of-support-faq-72b7d8ca-3057-4f0c-8404-67305d40cc04) for more details. +> Updated SHA2 signed installers will be available for .NET Framework 3.5 SP1, and 4.6.2 through 4.8. For more information, see the [SHA1 retirement plan](https://support.microsoft.com/topic/-net-framework-retiring-sha-1-content-9750f20d-a9ef-4d43-853f-2075f0a9d7da), the [.NET 4.5.2, 4.6, and 4.6.1 lifecycle update blog post](https://devblogs.microsoft.com/dotnet/net-framework-4-5-2-4-6-4-6-1-will-reach-end-of-support-on-april-26-2022/), and the [FAQ](https://support.microsoft.com/topic/-net-framework-4-5-2-4-6-4-6-1-end-of-support-faq-72b7d8ca-3057-4f0c-8404-67305d40cc04). diff --git a/includes/net-framework-vs.md b/includes/net-framework-vs.md new file mode 100644 index 0000000000000..7b466f69c8653 --- /dev/null +++ b/includes/net-framework-vs.md @@ -0,0 +1,2 @@ +> [!IMPORTANT] +> Starting with Visual Studio 2022, Visual Studio no longer includes .NET Framework components for .NET Framework 4.0 - 4.5.1 because these versions are no longer supported. Visual Studio 2022 and later versions can't build apps that target .NET Framework 4.0 through .NET Framework 4.5.1. To continue building these apps, you can use Visual Studio 2019 or an earlier version. From 7aec90a293a4bbe6c909edbfc62c605c719ca92f Mon Sep 17 00:00:00 2001 From: Mika Dumont <46729679+mikadumont@users.noreply.github.com> Date: Tue, 15 Jun 2021 08:49:43 -0700 Subject: [PATCH 022/105] started source generator documentation (#24644) * started source generator documentation * updated overview * fixed dupe paragraph * Update docs/csharp/roslyn-sdk/source-generators-overview.md Co-authored-by: Andy (Steve) De George <67293991+adegeo@users.noreply.github.com> * Update docs/csharp/roslyn-sdk/source-generators-overview.md Co-authored-by: Andy (Steve) De George <67293991+adegeo@users.noreply.github.com> * Update docs/csharp/roslyn-sdk/source-generators-overview.md Co-authored-by: Andy (Steve) De George <67293991+adegeo@users.noreply.github.com> * Update docs/csharp/roslyn-sdk/source-generators-overview.md Co-authored-by: Andy (Steve) De George <67293991+adegeo@users.noreply.github.com> * Update docs/csharp/roslyn-sdk/source-generators-overview.md Co-authored-by: Andy (Steve) De George <67293991+adegeo@users.noreply.github.com> * Update docs/csharp/roslyn-sdk/source-generators-overview.md Co-authored-by: Andy (Steve) De George <67293991+adegeo@users.noreply.github.com> * Update docs/csharp/roslyn-sdk/source-generators-overview.md Co-authored-by: Bill Wagner * Update docs/csharp/roslyn-sdk/source-generators-overview.md Co-authored-by: Bill Wagner * Update docs/csharp/roslyn-sdk/source-generators-overview.md Co-authored-by: Bill Wagner * Update docs/csharp/roslyn-sdk/source-generators-overview.md Co-authored-by: Bill Wagner * fixed code snippet indentation * Update docs/csharp/roslyn-sdk/source-generators-overview.md Co-authored-by: Bill Wagner * Update docs/csharp/roslyn-sdk/source-generators-overview.md Co-authored-by: Bill Wagner Co-authored-by: Andy (Steve) De George <67293991+adegeo@users.noreply.github.com> Co-authored-by: Bill Wagner --- .../source-generator-visualization.png | Bin 0 -> 82626 bytes .../roslyn-sdk/source-generators-overview.md | 158 ++++++++++++++++++ docs/csharp/toc.yml | 2 + 3 files changed, 160 insertions(+) create mode 100644 docs/csharp/roslyn-sdk/media/source-generators/source-generator-visualization.png create mode 100644 docs/csharp/roslyn-sdk/source-generators-overview.md diff --git a/docs/csharp/roslyn-sdk/media/source-generators/source-generator-visualization.png b/docs/csharp/roslyn-sdk/media/source-generators/source-generator-visualization.png new file mode 100644 index 0000000000000000000000000000000000000000..8e658d8e373f57a7ff26ebdd725bc6e1b80ad80c GIT binary patch literal 82626 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�a`KhR$tqtYLCX?rvL6iRc-a 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 literal 0 HcmV?d00001 diff --git a/docs/csharp/roslyn-sdk/source-generators-overview.md b/docs/csharp/roslyn-sdk/source-generators-overview.md new file mode 100644 index 0000000000000..71c8f661785c5 --- /dev/null +++ b/docs/csharp/roslyn-sdk/source-generators-overview.md @@ -0,0 +1,158 @@ +--- +title: Source Generators +description: Source Generators is a C# compiler feature that lets C# developers inspect user code as it is being compiled and generates new C# source files on the fly that are added to the user's compilation. +ms.date: 06/11/2021 +ms.topic: tutorial +ms.custom: mvc, vs-dotnet, source-generators +--- +# Source Generators + +This article provides an overview of Source Generators that ships as part of the .NET Compiler Platform ("Roslyn") SDK. Source Generators is a C# compiler feature that lets C# developers inspect user code as it is being compiled and generates new C# source files on the fly that are added to the user's compilation. + +A Source Generator is a piece of code that runs during compilation and can inspect your program to produce additional source files that are compiled together with the rest of your code. + +A Source Generator is a new kind of component that C# developers can write that lets you do two major things: + +1. Retrieve a *compilation object* that represents all user code that is being compiled. This object can be inspected, and you can write code that works with the syntax and semantic models for the code being compiled, just like with analyzers today. + +2. Generate C# source files that can be added to a compilation object during the course of compilation. In other words, you can provide additional source code as input to a compilation while the code is being compiled. + +When combined, these two things are what make Source Generators so useful. You can inspect user code with all of the rich metadata that the compiler builds up during compilation, then emit C# code back into the same compilation that is based on the data you’ve analyzed! If you’re familiar with Roslyn Analyzers, you can think of Source Generators as analyzers that can emit C# source code. + +Source generators run as a phase of compilation visualized below: + +:::image type="content" source="media/source-generators/source-generator-visualization.png" alt-text="Graphic describing the different parts of source generation"::: + +A Source Generator is a .NET Standard 2.0 assembly that is loaded by the compiler along with any analyzers. It is usable in environments where .NET Standard components can be loaded and run. + +## Common scenarios + +Today, there are three general approaches to inspecting user code and generating information or code based on that analysis used by technologies today: runtime reflection, IL weaving, and juggling MSBuild tasks. Source Generators can be an improvement over each approach. +Runtime reflection is a powerful technology that was added to .NET a long time ago. There are countless scenarios for using it. A very common scenario is to perform some analysis of user code when an app starts up and use that data to generate things. + +For example, ASP.NET Core uses reflection when your web service first runs to discover constructs you’ve defined so that it can “wire up” things like controllers and razor pages. Although this enables you to write straightforward code with powerful abstractions, it comes with a performance penalty at runtime: when your web service or app first starts up, it cannot accept any requests until all the runtime reflection code that discovers information about your code is finished running! Although this performance penalty is not enormous, it is somewhat of a fixed cost that you cannot improve yourself in your own app. + +With a Source Generator, the controller discovery phase of startup could instead happen at compile time by analyzing your source code and emitting the code it needs to "wire up" your app. This could result in some faster startup times, since an action happening at runtime today could get pushed into compile time. +Source Generators can improve performance in ways that aren’t limited to reflection at runtime to discover types as well. Some scenarios involve calling the MSBuild C# task (called CSC) multiple times so they can inspect data from a compilation. As you might imagine, calling the compiler more than once affects the total time it takes to build your app! We’re investigating how Source Generators can be used to obviate the need for juggling MSBuild tasks like this, since Source generators don’t just offer some performance benefits, but also allows tools to operate at the right level of abstraction. + +Another capability Source Generators can offer is obviating the use of some “stringly-typed” APIs, such as how ASP.NET Core routing between controllers and razor pages work. With a Source Generator, routing can be strongly typed with the necessary strings being generated as a compile-time detail. This would reduce the amount of times a mistyped string literal leads to a request not hitting the correct controller. + +## Get started with source generators + +In this guide, you'll explore the creation of a source generator using the API. + +1. Create a standard .NET Core console application. + +2. Replace the Program class with the following: + + ```csharp + partial class Program + { + static void Main(string[] args) + { + HelloFrom("Generated Code"); + } + static partial void HelloFrom(string name); + } + ``` + + > [!NOTE] + > You can run this sample as-is, but nothing will happen yet. + +3. Next, we'll create a source generator that will fill in the contents of the HelloFrom method. + +4. Create a .NET standard library project that looks like this: + + ```xml + + + + netstandard2.0 + + + + + + + + + ``` + +5. Modify or create a C# file that specifies your own Source Generator like so: + + ```csharp + using Microsoft.CodeAnalysis; + + namespace MyGenerator + { + [Generator] + public class MySourceGenerator : ISourceGenerator + { + public void Execute(GeneratorExecutionContext context) + { + // Code generation goes here + } + + public void Initialize(GeneratorInitializationContext context) + { + // No initialization required for this one + } + } + } + ``` + +6. Replace the contents of the execute method, so that it looks like the following: + + ```csharp + public void Execute(GeneratorExecutionContext context) + { + // find the main method + var mainMethod = context.Compilation.GetEntryPoint(context.CancellationToken); + + // build up the source code + string source = $@" + using System; + + namespace {mainMethod.ContainingNamespace.Name} + {{ + public static partial class {mainMethod.ContainingType.Name} + {{ + static partial void HelloFrom(string name) + {{ + Console.WriteLine($""Generator says: Hi from '{{name}}'""); + }} + }} + }} + + "; + // add the source code to the compilation + context.AddSource("generatedSource", source); + } + ``` + +7. We now have a functioning generator, but need to connect it to our console application. Edit the original console application project and add the following, replacing the project path with the one from the .NET Standard project you created above: + + ```xml + + + + + + ``` + +8. Now, when you run the console application, you should see that the generated code gets run and prints to the screen. + + > [!NOTE] + > You will currently need to restart Visual Studio to see IntelliSense and get rid of errors with the early tooling experience. + +## Next steps + +The [Source Generators Cookbook](https://github.com/dotnet/roslyn/blob/master/docs/features/source-generators.cookbook.md) goes over some of these examples with some recommended approaches to solving them. Additionally, we have a [set of samples available on GitHub](https://github.com/dotnet/roslyn-sdk/tree/master/samples/CSharp/SourceGenerators) that you can try on your own. + +You can learn more about Source Generators in these topics: + +- [Source Generators design document](https://github.com/dotnet/roslyn/blob/master/docs/features/source-generators.md) +- [Source Generators cookbook](https://github.com/dotnet/roslyn/blob/master/docs/features/source-generators.cookbook.md) diff --git a/docs/csharp/toc.yml b/docs/csharp/toc.yml index c5f3ae094238c..15b703881c856 100644 --- a/docs/csharp/toc.yml +++ b/docs/csharp/toc.yml @@ -329,6 +329,8 @@ items: href: roslyn-sdk/work-with-workspace.md - name: Explore code with the syntax visualizer href: roslyn-sdk/syntax-visualizer.md + - name: Source Generators + href: roslyn-sdk/source-generators-overview.md - name: Quick starts items: - name: Syntax analysis From 294e6f289aaac627ae256f502e1e79797a699345 Mon Sep 17 00:00:00 2001 From: Genevieve Warren <24882762+gewarren@users.noreply.github.com> Date: Tue, 15 Jun 2021 09:50:52 -0700 Subject: [PATCH 023/105] Fixes #24658 (#24666) --- docs/fundamentals/code-analysis/code-style-rule-options.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/fundamentals/code-analysis/code-style-rule-options.md b/docs/fundamentals/code-analysis/code-style-rule-options.md index 37a8ed17ff0df..ef0b65e39166c 100644 --- a/docs/fundamentals/code-analysis/code-style-rule-options.md +++ b/docs/fundamentals/code-analysis/code-style-rule-options.md @@ -32,7 +32,7 @@ Each of these subcategories defines its own syntax for specifying options. For m To help you get started, here is an example *.editorconfig* file with the default options. > [!TIP] -> In Visual Studio, you can generate this file and save it to a project at **Tools** > **Options** > **Text Editor** > [**C#** or **Basic**] > **Code Style** > **General**. Then, click the **Generate .editorconfig file from settings** button. For more information, see [Code style preferences](/visualstudio/ide/code-styles-and-code-cleanup). +> In Visual Studio 2019 and later versions (on Windows), you can generate this file and save it to a project at **Tools** > **Options** > **Text Editor** > [**C#** or **Basic**] > **Code Style** > **General**. Then, click the **Generate .editorconfig file from settings** button. For more information, see [Code style preferences](/visualstudio/ide/code-styles-and-code-cleanup). ```ini # Remove the line below if you want to inherit .editorconfig settings from higher directories From da061e98244a4efbb0bdd5905d5fe801a697eee2 Mon Sep 17 00:00:00 2001 From: Jack Kendall <68479543+jkendall327@users.noreply.github.com> Date: Wed, 16 Jun 2021 14:25:04 +0100 Subject: [PATCH 024/105] Issue #24577: edit commonly-used-collection-types.md (#24614) * Update commonly-used-collection-types.md Copy-edit document for readability and flow by introducing more paragraph breaks, bulletpoints, headings and simplified language. * Apply suggestions from code review Apply typographical suggestions Co-authored-by: Genevieve Warren <24882762+gewarren@users.noreply.github.com> * Add suggested changes - Add periods to bulletpoints - Remove sorting header - Revert to old phrasing for sorted/unsorted collections * A few more tweaks * Remove trailing spaces Co-authored-by: Genevieve Warren <24882762+gewarren@users.noreply.github.com> --- .../commonly-used-collection-types.md | 65 ++++++++++++++++--- 1 file changed, 56 insertions(+), 9 deletions(-) diff --git a/docs/standard/collections/commonly-used-collection-types.md b/docs/standard/collections/commonly-used-collection-types.md index acd602b48fe40..bdbf9b1a46c6a 100644 --- a/docs/standard/collections/commonly-used-collection-types.md +++ b/docs/standard/collections/commonly-used-collection-types.md @@ -1,7 +1,7 @@ --- title: "Commonly Used Collection Types" description: Learn about commonly used collection types in .NET, such as hash tables, queues, stacks, bags, dictionaries, and lists. -ms.date: "03/30/2017" +ms.date: "06/09/2021" helpviewer_keywords: - "collections [.NET], generic" - "objects [.NET], grouping in collections" @@ -13,19 +13,66 @@ helpviewer_keywords: - "generic collections" ms.assetid: f5d4c6a4-0d7b-4944-a9fb-3b12d9ebfd55 --- -# Commonly Used Collection Types +# Commonly used collection types -Collection types are the common variations of data collections, such as hash tables, queues, stacks, bags, dictionaries, and lists. - - Collections are based on the interface, the interface, the interface, or their generic counterparts. The interface and the interface are both derived from the interface; therefore, all collections are based on the interface either directly or indirectly. In collections based on the interface (such as , , or ) or directly on the interface (such as , , , , or ), every element contains only a value. In collections based on the interface (such as the and classes, the and generic classes), or the classes, every element contains both a key and a value. The class is unique because it is a list of values with keys embedded within the values and, therefore, it behaves like a list and like a dictionary. +Collection types represent different ways to collect data, such as hash tables, queues, stacks, bags, dictionaries, and lists. + +All collections are based on the or interfaces, either directly or indirectly. and and their generic counterparts all derive from these two interfaces. + +In collections based on or directly on , every element contains only a value. These types include: + +- +- +- +- +- +- +- +- + +In collections based on the interface, every element contains both a key and a value. These types include: + +- +- +- +- +- + +The class is unique because it is a list of values with keys embedded within the values. As a result, it behaves both like a list and like a dictionary. + +When you need efficient multi-threaded collection access, use the generic collections in the namespace. + +The and classes provide first-in-first-out lists. The and classes provide last-in-first-out lists. + +## Strong typing + +Generic collections are the best solution to strong typing. For example, adding an element of any type other than an to a `List` collection causes a compile-time error. However, if your language does not support generics, the namespace includes abstract base classes that you can extend to create collection classes that are strongly typed. These base classes include: + +- +- +- + +## How collections vary - Generic collections are the best solution to strong typing. However, if your language does not support generics, the namespace includes base collections, such as , , and , which are abstract base classes that can be extended to create collection classes that are strongly typed. When efficient multi-threaded collection access is required, use the generic collections in the namespace. +Collections vary in how they store, sort, and compare elements, and how they perform searches. + +The class and the generic class provide sorted versions of the class and the generic class. + +All collections use zero-based indexes except , which allows arrays that are not zero-based. + +You can access the elements of a or a by either the key or the element's index. You can only access the elements of a or a by the element's key. + +## Use LINQ with collection types - Collections can vary, depending on how the elements are stored, how they are sorted, how searches are performed, and how comparisons are made. The class and the generic class provide first-in-first-out lists, while the class and the generic class provide last-in-first-out lists. The class and the generic class provide sorted versions of the class and the generic class. The elements of a or a are accessible only by the key of the element, but the elements of a or a are accessible either by the key or by the index of the element. The indexes in all collections are zero-based, except , which allows arrays that are not zero-based. +The LINQ to Objects feature provides a common pattern for accessing in-memory objects of any type that implements or . LINQ queries have several benefits over standard constructs like `foreach` loops: + +- They are concise and easier to understand. +- They can filter, order, and group data. +- They can improve performance. - The LINQ to Objects feature allows you to use LINQ queries to access in-memory objects as long as the object type implements or . LINQ queries provide a common pattern for accessing data; are typically more concise and readable than standard `foreach` loops; and provide filtering, ordering, and grouping capabilities. LINQ queries can also improve performance. For more information, see [LINQ to Objects (C#)](../../csharp/programming-guide/concepts/linq/linq-to-objects.md), [LINQ to Objects (Visual Basic)](../../visual-basic/programming-guide/concepts/linq/linq-to-objects.md), and [Parallel LINQ (PLINQ)](../parallel-programming/introduction-to-plinq.md). +For more information, see [LINQ to Objects (C#)](../../csharp/programming-guide/concepts/linq/linq-to-objects.md), [LINQ to Objects (Visual Basic)](../../visual-basic/programming-guide/concepts/linq/linq-to-objects.md), and [Parallel LINQ (PLINQ)](../parallel-programming/introduction-to-plinq.md). -## Related Topics +## Related topics |Title|Description| |-----------|-----------------| From a3e77c728bf7c2283d193961ceb93c74059e8f8c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jun 2021 09:52:42 -0400 Subject: [PATCH 025/105] Bump Microsoft.CodeAnalysis.CSharp.Workspaces (#24684) Bumps [Microsoft.CodeAnalysis.CSharp.Workspaces](https://github.com/dotnet/roslyn) from 3.9.0 to 3.10.0. - [Release notes](https://github.com/dotnet/roslyn/releases) - [Changelog](https://github.com/dotnet/roslyn/blob/main/docs/Breaking%20API%20Changes.md) - [Commits](https://github.com/dotnet/roslyn/compare/v3.9.0...v3.10.0) --- updated-dependencies: - dependency-name: Microsoft.CodeAnalysis.CSharp.Workspaces dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../SyntaxQuickStart/SyntaxWalker/SyntaxWalker.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/csharp/roslyn-sdk/SyntaxQuickStart/SyntaxWalker/SyntaxWalker.csproj b/samples/snippets/csharp/roslyn-sdk/SyntaxQuickStart/SyntaxWalker/SyntaxWalker.csproj index b1dfecb305ba0..7372e21095eb9 100644 --- a/samples/snippets/csharp/roslyn-sdk/SyntaxQuickStart/SyntaxWalker/SyntaxWalker.csproj +++ b/samples/snippets/csharp/roslyn-sdk/SyntaxQuickStart/SyntaxWalker/SyntaxWalker.csproj @@ -6,7 +6,7 @@ - + From 47ebc1d48e393053b81511b1fc5bbd27f150f04a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jun 2021 09:53:06 -0400 Subject: [PATCH 026/105] Bump Microsoft.CodeAnalysis.CSharp.Workspaces (#24685) Bumps [Microsoft.CodeAnalysis.CSharp.Workspaces](https://github.com/dotnet/roslyn) from 3.9.0 to 3.10.0. - [Release notes](https://github.com/dotnet/roslyn/releases) - [Changelog](https://github.com/dotnet/roslyn/blob/main/docs/Breaking%20API%20Changes.md) - [Commits](https://github.com/dotnet/roslyn/compare/v3.9.0...v3.10.0) --- updated-dependencies: - dependency-name: Microsoft.CodeAnalysis.CSharp.Workspaces dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../roslyn-sdk/SemanticQuickStart/SemanticQuickStart.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/csharp/roslyn-sdk/SemanticQuickStart/SemanticQuickStart.csproj b/samples/snippets/csharp/roslyn-sdk/SemanticQuickStart/SemanticQuickStart.csproj index b1dfecb305ba0..7372e21095eb9 100644 --- a/samples/snippets/csharp/roslyn-sdk/SemanticQuickStart/SemanticQuickStart.csproj +++ b/samples/snippets/csharp/roslyn-sdk/SemanticQuickStart/SemanticQuickStart.csproj @@ -6,7 +6,7 @@ - + From 02da1d915ce05691abed96708fe20a3c1c96ba09 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jun 2021 09:56:42 -0400 Subject: [PATCH 027/105] Bump Microsoft.CodeAnalysis.CSharp.Workspaces (#24687) Bumps [Microsoft.CodeAnalysis.CSharp.Workspaces](https://github.com/dotnet/roslyn) from 3.9.0 to 3.10.0. - [Release notes](https://github.com/dotnet/roslyn/releases) - [Changelog](https://github.com/dotnet/roslyn/blob/main/docs/Breaking%20API%20Changes.md) - [Commits](https://github.com/dotnet/roslyn/compare/v3.9.0...v3.10.0) --- updated-dependencies: - dependency-name: Microsoft.CodeAnalysis.CSharp.Workspaces dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../TransformationCS/TransformationCS.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/csharp/roslyn-sdk/SyntaxTransformationQuickStart/TransformationCS/TransformationCS.csproj b/samples/snippets/csharp/roslyn-sdk/SyntaxTransformationQuickStart/TransformationCS/TransformationCS.csproj index b1dfecb305ba0..7372e21095eb9 100644 --- a/samples/snippets/csharp/roslyn-sdk/SyntaxTransformationQuickStart/TransformationCS/TransformationCS.csproj +++ b/samples/snippets/csharp/roslyn-sdk/SyntaxTransformationQuickStart/TransformationCS/TransformationCS.csproj @@ -6,7 +6,7 @@ - + From 8e9152a499ea810d469466491aee7a2bfa7d4a8a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jun 2021 10:01:29 -0400 Subject: [PATCH 028/105] Bump Microsoft.CodeAnalysis (#24686) Bumps [Microsoft.CodeAnalysis](https://github.com/dotnet/roslyn) from 3.9.0 to 3.10.0. - [Release notes](https://github.com/dotnet/roslyn/releases) - [Changelog](https://github.com/dotnet/roslyn/blob/main/docs/Breaking%20API%20Changes.md) - [Commits](https://github.com/dotnet/roslyn/compare/v3.9.0...v3.10.0) --- updated-dependencies: - dependency-name: Microsoft.CodeAnalysis dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../ConstructionCS/ConstructionCS.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/csharp/roslyn-sdk/SyntaxTransformationQuickStart/ConstructionCS/ConstructionCS.csproj b/samples/snippets/csharp/roslyn-sdk/SyntaxTransformationQuickStart/ConstructionCS/ConstructionCS.csproj index 1c63713d0e4d8..0a0311c37c0ee 100644 --- a/samples/snippets/csharp/roslyn-sdk/SyntaxTransformationQuickStart/ConstructionCS/ConstructionCS.csproj +++ b/samples/snippets/csharp/roslyn-sdk/SyntaxTransformationQuickStart/ConstructionCS/ConstructionCS.csproj @@ -6,7 +6,7 @@ - + From 5a419b15cd83311fd49d7e9a5598bd797e18af54 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jun 2021 10:01:43 -0400 Subject: [PATCH 029/105] Bump Microsoft.CodeAnalysis.CSharp.Workspaces (#24688) Bumps [Microsoft.CodeAnalysis.CSharp.Workspaces](https://github.com/dotnet/roslyn) from 3.9.0 to 3.10.0. - [Release notes](https://github.com/dotnet/roslyn/releases) - [Changelog](https://github.com/dotnet/roslyn/blob/main/docs/Breaking%20API%20Changes.md) - [Commits](https://github.com/dotnet/roslyn/compare/v3.9.0...v3.10.0) --- updated-dependencies: - dependency-name: Microsoft.CodeAnalysis.CSharp.Workspaces dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../SyntaxQuickStart/HelloSyntaxTree/HelloSyntaxTree.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/snippets/csharp/roslyn-sdk/SyntaxQuickStart/HelloSyntaxTree/HelloSyntaxTree.csproj b/samples/snippets/csharp/roslyn-sdk/SyntaxQuickStart/HelloSyntaxTree/HelloSyntaxTree.csproj index b1dfecb305ba0..7372e21095eb9 100644 --- a/samples/snippets/csharp/roslyn-sdk/SyntaxQuickStart/HelloSyntaxTree/HelloSyntaxTree.csproj +++ b/samples/snippets/csharp/roslyn-sdk/SyntaxQuickStart/HelloSyntaxTree/HelloSyntaxTree.csproj @@ -6,7 +6,7 @@ - + From c0f2bc8655c72ea0f3e888838acd87513d7c24d1 Mon Sep 17 00:00:00 2001 From: Jacob Scherber Date: Wed, 16 Jun 2021 12:30:26 -0400 Subject: [PATCH 030/105] Extra 1 character (typo) (#24680) --- ...svcutil-exe-to-export-metadata-from-compiled-service-code.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/framework/wcf/feature-details/how-to-use-svcutil-exe-to-export-metadata-from-compiled-service-code.md b/docs/framework/wcf/feature-details/how-to-use-svcutil-exe-to-export-metadata-from-compiled-service-code.md index 4524c0b206cec..d3b2f4866da6d 100644 --- a/docs/framework/wcf/feature-details/how-to-use-svcutil-exe-to-export-metadata-from-compiled-service-code.md +++ b/docs/framework/wcf/feature-details/how-to-use-svcutil-exe-to-export-metadata-from-compiled-service-code.md @@ -19,7 +19,7 @@ Svcutil.exe can export metadata for services, contracts, and data types in compi ### To export metadata for compiled service contracts -1. Compile your service contract implementations into one or more class libraries.1 +1. Compile your service contract implementations into one or more class libraries. 2. Run Svcutil.exe on the compiled assemblies. From 2cdb10a5eeb8610bd24acf2fed9a86f52372197d Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 16 Jun 2021 18:38:43 +0100 Subject: [PATCH 031/105] Proposed modification to colon formatting guide based on discussion (#24643) --- docs/fsharp/style-guide/formatting.md | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/docs/fsharp/style-guide/formatting.md b/docs/fsharp/style-guide/formatting.md index 39eca12a76381..d8e9657d85186 100644 --- a/docs/fsharp/style-guide/formatting.md +++ b/docs/fsharp/style-guide/formatting.md @@ -248,30 +248,40 @@ This is a way to avoid too long lines (in case return type might have long name) ### Type annotations -#### Right-pad function argument type annotations +#### Right-pad value and function argument type annotations -When defining arguments with type annotations, use white space after the `:` symbol: +When defining values or arguments with type annotations, use white space after the `:` symbol, but not before: ```fsharp // OK let complexFunction (a: int) (b: int) c = a + b + c +let expensiveToCompute: int = 0 // Type annotation for let-bound value + +type C() = + member _.Property: int = 1 // Bad let complexFunctionBad (a :int) (b :int) (c:int) = a + b + c +let expensiveToComputeBad1:int = 1 +let expensiveToComputeBad2 :int = 2 ``` #### Surround return type annotations with white space -In a let-bound function or value type annotation (return type in the case of a function), use white space before and after the `:` symbol: +In function or member return type annotations, use white space before and after the `:` symbol: ```fsharp // OK -let expensiveToCompute : int = 0 // Type annotation for let-bound value let myFun (a: decimal) b c : decimal = a + b + c // Type annotation for the return type of a function +let anotherFun (arg: int) : unit = () // Type annotation for return type of a function +type C() = + member _.SomeMethod(x: int) : int = 1 // Type annotation for return type of a member + // Bad -let expensiveToComputeBad1:int = 1 -let expensiveToComputeBad2 :int = 2 let myFunBad (a: decimal) b c:decimal = a + b + c +let anotherFunBad (arg: int): unit = () +type C() = + member _.SomeMethod(x: int): int = 1 ``` ### Formatting bindings @@ -1302,7 +1312,7 @@ The guidelines below apply to both functions, members, and type definitions. Keep generic type arguments and constraints on a single line if it’s not too long: ```fsharp -let f<'a, 'b when 'a : equality and 'b : comparison> param = +let f<'a, 'b when 'a: equality and 'b: comparison> param = // function body ``` From d53cf569945114414955777817534146dd4ab936 Mon Sep 17 00:00:00 2001 From: Azure SDK Bot <53356347+azure-sdk@users.noreply.github.com> Date: Wed, 16 Jun 2021 12:52:25 -0700 Subject: [PATCH 032/105] Update package index with latest published versions (#24678) --- docs/azure/includes/dotnet-all.md | 24 ++++++++++++------------ docs/azure/includes/dotnet-new.md | 8 ++++---- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/docs/azure/includes/dotnet-all.md b/docs/azure/includes/dotnet-all.md index b12ea4f61c559..39b27490ac48a 100644 --- a/docs/azure/includes/dotnet-all.md +++ b/docs/azure/includes/dotnet-all.md @@ -32,10 +32,10 @@ | Form Recognizer | NuGet [3.1.1](https://www.nuget.org/packages/Azure.AI.FormRecognizer/3.1.1) | [docs](/dotnet/api/overview/azure/AI.FormRecognizer-readme) | GitHub [3.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.FormRecognizer_3.1.1/sdk/formrecognizer/Azure.AI.FormRecognizer/) | | Identity | NuGet [1.4.0](https://www.nuget.org/packages/Azure.Identity/1.4.0)
NuGet [1.5.0-beta.1](https://www.nuget.org/packages/Azure.Identity/1.5.0-beta.1) | [docs](/dotnet/api/overview/azure/Identity-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Identity_1.4.0/sdk/identity/Azure.Identity/)
GitHub [1.5.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Identity_1.5.0-beta.1/sdk/identity/Azure.Identity/) | | IoT Device Update | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.IoT.DeviceUpdate/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/IoT.DeviceUpdate-readme-pre) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.IoT.DeviceUpdate_1.0.0-beta.2/sdk/deviceupdate/Azure.Iot.DeviceUpdate/) | -| Key Vault - Administration | NuGet [4.0.0-beta.5](https://www.nuget.org/packages/Azure.Security.KeyVault.Administration/4.0.0-beta.5) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Administration-readme-pre) | GitHub [4.0.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Administration_4.0.0-beta.5/sdk/keyvault/Azure.Security.KeyVault.Administration/) | -| Key Vault - Certificates | NuGet [4.1.1](https://www.nuget.org/packages/Azure.Security.KeyVault.Certificates/4.1.1)
NuGet [4.2.0-beta.6](https://www.nuget.org/packages/Azure.Security.KeyVault.Certificates/4.2.0-beta.6) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Certificates-readme) | GitHub [4.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Certificates_4.1.1/sdk/keyvault/Azure.Security.KeyVault.Certificates/)
GitHub [4.2.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Certificates_4.2.0-beta.6/sdk/keyvault/Azure.Security.KeyVault.Certificates/) | -| Key Vault - Keys | NuGet [4.1.1](https://www.nuget.org/packages/Azure.Security.KeyVault.Keys/4.1.1)
NuGet [4.2.0-beta.6](https://www.nuget.org/packages/Azure.Security.KeyVault.Keys/4.2.0-beta.6) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Keys-readme) | GitHub [4.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Keys_4.1.1/sdk/keyvault/Azure.Security.KeyVault.Keys/)
GitHub [4.2.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Keys_4.2.0-beta.6/sdk/keyvault/Azure.Security.KeyVault.Keys/) | -| Key Vault - Secrets | NuGet [4.1.1](https://www.nuget.org/packages/Azure.Security.KeyVault.Secrets/4.1.1)
NuGet [4.2.0-beta.5](https://www.nuget.org/packages/Azure.Security.KeyVault.Secrets/4.2.0-beta.5) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Secrets-readme) | GitHub [4.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Secrets_4.1.1/sdk/keyvault/Azure.Security.KeyVault.Secrets/)
GitHub [4.2.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Secrets_4.2.0-beta.5/sdk/keyvault/Azure.Security.KeyVault.Secrets/) | +| Key Vault - Administration | NuGet [4.0.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Administration/4.0.0) | | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Administration_4.0.0/sdk/keyvault/Azure.Security.KeyVault.Administration/) | +| Key Vault - Certificates | NuGet [4.2.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Certificates/4.2.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Certificates-readme) | GitHub [4.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Certificates_4.2.0/sdk/keyvault/Azure.Security.KeyVault.Certificates/) | +| Key Vault - Keys | NuGet [4.2.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Keys/4.2.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Keys-readme) | GitHub [4.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Keys_4.2.0/sdk/keyvault/Azure.Security.KeyVault.Keys/) | +| Key Vault - Secrets | NuGet [4.2.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Secrets/4.2.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Secrets-readme) | GitHub [4.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Secrets_4.2.0/sdk/keyvault/Azure.Security.KeyVault.Secrets/) | | Media Analytics Edge | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Media.Analytics.Edge/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Media.Analytics.Edge-readme-pre) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Media.Analytics.Edge_1.0.0-beta.1/sdk/mediaservices/Azure.Media.Analytics.Edge) | | Metrics Advisor | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.AI.MetricsAdvisor/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/AI.MetricsAdvisor-readme-pre) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.MetricsAdvisor_1.0.0-beta.4/sdk/metricsadvisor/Azure.AI.MetricsAdvisor/) | | Monitor OpenTelemetry Exporter | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Monitor.OpenTelemetry.Exporter/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Monitor.OpenTelemetry.Exporter-readme-pre) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.OpenTelemetry.Exporter_1.0.0-beta.2/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/) | @@ -111,7 +111,7 @@ | Microsoft.Azure.Management.ServiceFabricManagedClusters | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.Management.ServiceFabricManagedClusters/1.0.0)
NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Microsoft.Azure.Management.ServiceFabricManagedClusters/1.0.0-beta.1) | | | | Microsoft.Azure.Management.StoragePool | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.Management.StoragePool/1.0.0) | | | | Microsoft.Azure.Management.VideoAnalyzer | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Microsoft.Azure.Management.VideoAnalyzer/1.0.0-beta.1) | | | -| Microsoft.Azure.Messaging.EventGrid.CloudNativeCloudEvents | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Microsoft.Azure.Messaging.EventGrid.CloudNativeCloudEvents/1.0.0-beta.1) | | | +| Microsoft.Azure.Messaging.EventGrid.CloudNativeCloudEvents | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Microsoft.Azure.Messaging.EventGrid.CloudNativeCloudEvents/1.0.0-beta.2) | | | | Microsoft.Azure.SignalR.Emulator | NuGet [1.0.0-preview1-10767](https://www.nuget.org/packages/Microsoft.Azure.SignalR.Emulator/1.0.0-preview1-10767) | | | | Anomaly Detector | NuGet [3.0.0-preview.3](https://www.nuget.org/packages/Azure.AI.AnomalyDetector/3.0.0-preview.3) | [docs](/dotnet/api/overview/azure/AI.AnomalyDetector-readme-pre) | GitHub [3.0.0-preview.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.AnomalyDetector_3.0.0-preview.3/sdk/anomalydetector/Azure.AI.AnomalyDetector/) | | Anomaly Detector | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.CognitiveServices.AnomalyDetector/1.0.0)
NuGet [1.0.0-preview.1](https://www.nuget.org/packages/Microsoft.Azure.CognitiveServices.AnomalyDetector/1.0.0-preview.1) | | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.CognitiveServices.AnomalyDetector_1.0.0-preview.1/sdk/cognitiveservices/AnomalyDetector) | @@ -197,7 +197,7 @@ | Document Translation | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.AI.Translation.Document/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/AI.Translation.Document-readme-pre) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Translation.Document_1.0.0-beta.2/sdk/translation/Azure.AI.Translation.Document/) | | Entity Search | NuGet [2.0.0](https://www.nuget.org/packages/Microsoft.Azure.CognitiveServices.Search.EntitySearch/2.0.0) | | | | Event Grid | NuGet [4.3.0](https://www.nuget.org/packages/Azure.Messaging.EventGrid/4.3.0) | [docs](/dotnet/api/overview/azure/Messaging.EventGrid-readme) | GitHub [4.3.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.EventGrid_4.3.0/sdk/eventgrid/Azure.Messaging.EventGrid/) | -| Event Grid | NuGet [3.2.0](https://www.nuget.org/packages/Microsoft.Azure.EventGrid/3.2.0) | [docs](/dotnet/api/overview/azure/eventgrid) | GitHub [3.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.EventGrid_3.2.0/sdk/eventgrid/Microsoft.Azure.EventGrid/) | +| Event Grid | NuGet [3.2.1](https://www.nuget.org/packages/Microsoft.Azure.EventGrid/3.2.1) | [docs](/dotnet/api/overview/azure/eventgrid) | GitHub [3.2.1](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.EventGrid_3.2.1/sdk/eventgrid/Microsoft.Azure.EventGrid/) | | Event Hubs | NuGet [5.4.1](https://www.nuget.org/packages/Azure.Messaging.EventHubs/5.4.1)
NuGet [5.5.0-beta.1](https://www.nuget.org/packages/Azure.Messaging.EventHubs/5.5.0-beta.1) | [docs](/dotnet/api/overview/azure/Messaging.EventHubs-readme) | GitHub [5.4.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.EventHubs_5.4.1/sdk/eventhub/Azure.Messaging.EventHubs/)
GitHub [5.5.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.EventHubs_5.5.0-beta.1/sdk/eventhub/Azure.Messaging.EventHubs/) | | Event Hubs | NuGet [4.3.2](https://www.nuget.org/packages/Microsoft.Azure.EventHubs/4.3.2) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.EventHubs-readme) | GitHub [4.3.2](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.EventHubs_4.3.2/sdk/eventhub/Microsoft.Azure.EventHubs/) | | Event Hubs - Event Processor | NuGet [5.4.1](https://www.nuget.org/packages/Azure.Messaging.EventHubs.Processor/5.4.1)
NuGet [5.5.0-beta.1](https://www.nuget.org/packages/Azure.Messaging.EventHubs.Processor/5.5.0-beta.1) | [docs](/dotnet/api/overview/azure/Messaging.EventHubs.Processor-readme) | GitHub [5.4.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.EventHubs.Processor_5.4.1/sdk/eventhub/Azure.Messaging.EventHubs.Processor/)
GitHub [5.5.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Messaging.EventHubs.Processor_5.5.0-beta.1/sdk/eventhub/Azure.Messaging.EventHubs.Processor/) | @@ -227,13 +227,13 @@ | Jobs - Core | NuGet [0.3.2-beta](https://www.nuget.org/packages/Microsoft.Azure.Jobs.Core/0.3.2-beta) | | GitHub [0.3.2-beta](https://github.com/Azure/azure-webjobs-sdk) | | Jobs - Service Bus | NuGet [0.3.2-beta](https://www.nuget.org/packages/Microsoft.Azure.Jobs.ServiceBus/0.3.2-beta) | | GitHub [0.3.2-beta](https://github.com/Azure/azure-webjobs-sdk) | | Key Vault | NuGet [3.0.5](https://www.nuget.org/packages/Microsoft.Azure.KeyVault/3.0.5) | | GitHub [3.0.5](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.KeyVault_3.0.5/sdk/keyvault/Microsoft.Azure.KeyVault/) | -| Key Vault - Administration | NuGet [4.0.0-beta.5](https://www.nuget.org/packages/Azure.Security.KeyVault.Administration/4.0.0-beta.5) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Administration-readme-pre) | GitHub [4.0.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Administration_4.0.0-beta.5/sdk/keyvault/Azure.Security.KeyVault.Administration/) | -| Key Vault - Certificates | NuGet [4.1.1](https://www.nuget.org/packages/Azure.Security.KeyVault.Certificates/4.1.1)
NuGet [4.2.0-beta.6](https://www.nuget.org/packages/Azure.Security.KeyVault.Certificates/4.2.0-beta.6) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Certificates-readme) | GitHub [4.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Certificates_4.1.1/sdk/keyvault/Azure.Security.KeyVault.Certificates/)
GitHub [4.2.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Certificates_4.2.0-beta.6/sdk/keyvault/Azure.Security.KeyVault.Certificates/) | +| Key Vault - Administration | NuGet [4.0.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Administration/4.0.0) | | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Administration_4.0.0/sdk/keyvault/Azure.Security.KeyVault.Administration/) | +| Key Vault - Certificates | NuGet [4.2.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Certificates/4.2.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Certificates-readme) | GitHub [4.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Certificates_4.2.0/sdk/keyvault/Azure.Security.KeyVault.Certificates/) | | Key Vault - Core | NuGet [3.0.5](https://www.nuget.org/packages/Microsoft.Azure.KeyVault.Core/3.0.5) | | GitHub [3.0.5](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.KeyVault.Core_3.0.5/sdk/keyvault/Microsoft.Azure.KeyVault.Core/) | | Key Vault - Cryptography | NuGet [3.0.5](https://www.nuget.org/packages/Microsoft.Azure.KeyVault.Cryptography/3.0.5) | | GitHub [3.0.5](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.KeyVault.Cryptography_3.0.5/sdk/keyvault/Microsoft.Azure.KeyVault.Cryptography/) | | Key Vault - Extensions | NuGet [3.0.5](https://www.nuget.org/packages/Microsoft.Azure.KeyVault.Extensions/3.0.5) | | GitHub [3.0.5](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.KeyVault.Extensions_3.0.5/sdk/keyvault/Microsoft.Azure.KeyVault.Extensions/) | -| Key Vault - Keys | NuGet [4.1.1](https://www.nuget.org/packages/Azure.Security.KeyVault.Keys/4.1.1)
NuGet [4.2.0-beta.6](https://www.nuget.org/packages/Azure.Security.KeyVault.Keys/4.2.0-beta.6) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Keys-readme) | GitHub [4.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Keys_4.1.1/sdk/keyvault/Azure.Security.KeyVault.Keys/)
GitHub [4.2.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Keys_4.2.0-beta.6/sdk/keyvault/Azure.Security.KeyVault.Keys/) | -| Key Vault - Secrets | NuGet [4.1.1](https://www.nuget.org/packages/Azure.Security.KeyVault.Secrets/4.1.1)
NuGet [4.2.0-beta.5](https://www.nuget.org/packages/Azure.Security.KeyVault.Secrets/4.2.0-beta.5) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Secrets-readme) | GitHub [4.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Secrets_4.1.1/sdk/keyvault/Azure.Security.KeyVault.Secrets/)
GitHub [4.2.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Secrets_4.2.0-beta.5/sdk/keyvault/Azure.Security.KeyVault.Secrets/) | +| Key Vault - Keys | NuGet [4.2.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Keys/4.2.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Keys-readme) | GitHub [4.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Keys_4.2.0/sdk/keyvault/Azure.Security.KeyVault.Keys/) | +| Key Vault - Secrets | NuGet [4.2.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Secrets/4.2.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Secrets-readme) | GitHub [4.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Secrets_4.2.0/sdk/keyvault/Azure.Security.KeyVault.Secrets/) | | Key Vault - WebKey | NuGet [3.0.5](https://www.nuget.org/packages/Microsoft.Azure.KeyVault.WebKey/3.0.5) | | GitHub [3.0.5](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.KeyVault.WebKey_3.0.5/sdk/keyvault/Microsoft.Azure.KeyVault.WebKey/) | | Kinect Developer Kit | NuGet [1.0.1](https://www.nuget.org/packages/Microsoft.Azure.Kinect.BodyTracking/1.0.1) | | | | Kinect Developer Kit | NuGet [1.4.1](https://www.nuget.org/packages/Microsoft.Azure.Kinect.Sensor/1.4.1) | | GitHub [1.4.1](https://github.com/Microsoft/Azure-Kinect-Sensor-SDK) | @@ -288,7 +288,7 @@ | SignalR - ASP.NET | NuGet [1.8.2](https://www.nuget.org/packages/Microsoft.Azure.SignalR.AspNet/1.8.2) | | GitHub [1.8.2](https://github.com/Azure/azure-signalr/tree/v1.5.0/src/Microsoft.Azure.SignalR.AspNet) | | SignalR - Benchmark | NuGet [1.0.0-preview1-10415](https://www.nuget.org/packages/Microsoft.Azure.SignalR.Benchmark/1.0.0-preview1-10415) | | GitHub [1.0.0-preview1-10415](https://github.com/azure/azure-signalr-bench) | | SignalR - Protocols | NuGet [1.8.2](https://www.nuget.org/packages/Microsoft.Azure.SignalR.Protocols/1.8.2) | | GitHub [1.8.2](https://github.com/Azure/azure-signalr/tree/v1.5.0/src/Microsoft.Azure.SignalR.Protocols) | -| SignalR - Serverless Protocols | NuGet [1.4.1](https://www.nuget.org/packages/Microsoft.Azure.SignalR.Serverless.Protocols/1.4.1) | | GitHub [1.4.1](https://github.com/Azure/azure-functions-signalrservice-extension/tree/v1.2.0/src/Microsoft.Azure.SignalR.Serverless.Protocols) | +| SignalR - Serverless Protocols | NuGet [1.4.2](https://www.nuget.org/packages/Microsoft.Azure.SignalR.Serverless.Protocols/1.4.2) | | GitHub [1.4.2](https://github.com/Azure/azure-functions-signalrservice-extension/tree/v1.2.0/src/Microsoft.Azure.SignalR.Serverless.Protocols) | | Speech | NuGet [1.17.0](https://www.nuget.org/packages/Microsoft.CognitiveServices.Speech/1.17.0) | | | | Speech Remoteconversation | NuGet [1.17.0](https://www.nuget.org/packages/Microsoft.CognitiveServices.Speech.Remoteconversation/1.17.0) | | | | Speech Xamarin iOS | NuGet [1.17.0](https://www.nuget.org/packages/Microsoft.CognitiveServices.Speech.Xamarin.iOS/1.17.0) | | | @@ -366,7 +366,7 @@ | WebJobs Extensions - RabbitMQ | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.RabbitMQ/1.0.0)
NuGet [1.0.0-beta](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.RabbitMQ/1.0.0-beta) | | GitHub [1.0.0](https://github.com/Azure/azure-functions-rabbitmq-extension/tree/v0.2.2029-beta) | | WebJobs Extensions - SendGrid | NuGet [3.0.2](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.SendGrid/3.0.2) | | GitHub [3.0.2](https://github.com/Azure/azure-webjobs-sdk-extensions/tree/v3.0.0/src/WebJobs.Extensions.SendGrid) | | WebJobs Extensions - Service Bus | NuGet [5.0.0-beta.3](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.ServiceBus/5.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.ServiceBus-readme-pre) | GitHub [5.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.WebJobs.Extensions.ServiceBus_5.0.0-beta.3/sdk/servicebus/Microsoft.Azure.WebJobs.Extensions.ServiceBus/) | -| WebJobs Extensions - SignalR Service | NuGet [1.4.1](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.SignalRService/1.4.1) | | GitHub [1.4.1](https://github.com/Azure/azure-functions-signalrservice-extension/tree/v1.2.0/src/SignalRServiceExtension) | +| WebJobs Extensions - SignalR Service | NuGet [1.4.2](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.SignalRService/1.4.2) | | GitHub [1.4.2](https://github.com/Azure/azure-functions-signalrservice-extension/tree/v1.2.0/src/SignalRServiceExtension) | | WebJobs Extensions - Storage | NuGet [4.0.3](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Storage/4.0.3)
NuGet [5.0.0-beta.4](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Storage/5.0.0-beta.4) | | GitHub [4.0.3](https://github.com/Azure/azure-webjobs-sdk/tree/master/src/Microsoft.Azure.WebJobs.Extensions.Storage) | | WebJobs Extensions - Storage Blobs | NuGet [5.0.0-beta.4](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs/5.0.0-beta.4) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.Storage.Blobs-readme-pre) | | | WebJobs Extensions - Storage Queues | NuGet [5.0.0-beta.4](https://www.nuget.org/packages/Microsoft.Azure.WebJobs.Extensions.Storage.Queues/5.0.0-beta.4) | [docs](/dotnet/api/overview/azure/Microsoft.Azure.WebJobs.Extensions.Storage.Queues-readme-pre) | | diff --git a/docs/azure/includes/dotnet-new.md b/docs/azure/includes/dotnet-new.md index 99b914dea77ab..c3f509529e204 100644 --- a/docs/azure/includes/dotnet-new.md +++ b/docs/azure/includes/dotnet-new.md @@ -32,10 +32,10 @@ | Form Recognizer | NuGet [3.1.1](https://www.nuget.org/packages/Azure.AI.FormRecognizer/3.1.1) | [docs](/dotnet/api/overview/azure/AI.FormRecognizer-readme) | GitHub [3.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.FormRecognizer_3.1.1/sdk/formrecognizer/Azure.AI.FormRecognizer/) | | Identity | NuGet [1.4.0](https://www.nuget.org/packages/Azure.Identity/1.4.0)
NuGet [1.5.0-beta.1](https://www.nuget.org/packages/Azure.Identity/1.5.0-beta.1) | [docs](/dotnet/api/overview/azure/Identity-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Identity_1.4.0/sdk/identity/Azure.Identity/)
GitHub [1.5.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Identity_1.5.0-beta.1/sdk/identity/Azure.Identity/) | | IoT Device Update | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.IoT.DeviceUpdate/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/IoT.DeviceUpdate-readme-pre) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.IoT.DeviceUpdate_1.0.0-beta.2/sdk/deviceupdate/Azure.Iot.DeviceUpdate/) | -| Key Vault - Administration | NuGet [4.0.0-beta.5](https://www.nuget.org/packages/Azure.Security.KeyVault.Administration/4.0.0-beta.5) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Administration-readme-pre) | GitHub [4.0.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Administration_4.0.0-beta.5/sdk/keyvault/Azure.Security.KeyVault.Administration/) | -| Key Vault - Certificates | NuGet [4.1.1](https://www.nuget.org/packages/Azure.Security.KeyVault.Certificates/4.1.1)
NuGet [4.2.0-beta.6](https://www.nuget.org/packages/Azure.Security.KeyVault.Certificates/4.2.0-beta.6) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Certificates-readme) | GitHub [4.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Certificates_4.1.1/sdk/keyvault/Azure.Security.KeyVault.Certificates/)
GitHub [4.2.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Certificates_4.2.0-beta.6/sdk/keyvault/Azure.Security.KeyVault.Certificates/) | -| Key Vault - Keys | NuGet [4.1.1](https://www.nuget.org/packages/Azure.Security.KeyVault.Keys/4.1.1)
NuGet [4.2.0-beta.6](https://www.nuget.org/packages/Azure.Security.KeyVault.Keys/4.2.0-beta.6) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Keys-readme) | GitHub [4.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Keys_4.1.1/sdk/keyvault/Azure.Security.KeyVault.Keys/)
GitHub [4.2.0-beta.6](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Keys_4.2.0-beta.6/sdk/keyvault/Azure.Security.KeyVault.Keys/) | -| Key Vault - Secrets | NuGet [4.1.1](https://www.nuget.org/packages/Azure.Security.KeyVault.Secrets/4.1.1)
NuGet [4.2.0-beta.5](https://www.nuget.org/packages/Azure.Security.KeyVault.Secrets/4.2.0-beta.5) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Secrets-readme) | GitHub [4.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Secrets_4.1.1/sdk/keyvault/Azure.Security.KeyVault.Secrets/)
GitHub [4.2.0-beta.5](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Secrets_4.2.0-beta.5/sdk/keyvault/Azure.Security.KeyVault.Secrets/) | +| Key Vault - Administration | NuGet [4.0.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Administration/4.0.0) | | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Administration_4.0.0/sdk/keyvault/Azure.Security.KeyVault.Administration/) | +| Key Vault - Certificates | NuGet [4.2.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Certificates/4.2.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Certificates-readme) | GitHub [4.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Certificates_4.2.0/sdk/keyvault/Azure.Security.KeyVault.Certificates/) | +| Key Vault - Keys | NuGet [4.2.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Keys/4.2.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Keys-readme) | GitHub [4.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Keys_4.2.0/sdk/keyvault/Azure.Security.KeyVault.Keys/) | +| Key Vault - Secrets | NuGet [4.2.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Secrets/4.2.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Secrets-readme) | GitHub [4.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Secrets_4.2.0/sdk/keyvault/Azure.Security.KeyVault.Secrets/) | | Media Analytics Edge | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Media.Analytics.Edge/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Media.Analytics.Edge-readme-pre) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Media.Analytics.Edge_1.0.0-beta.1/sdk/mediaservices/Azure.Media.Analytics.Edge) | | Metrics Advisor | NuGet [1.0.0-beta.4](https://www.nuget.org/packages/Azure.AI.MetricsAdvisor/1.0.0-beta.4) | [docs](/dotnet/api/overview/azure/AI.MetricsAdvisor-readme-pre) | GitHub [1.0.0-beta.4](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.MetricsAdvisor_1.0.0-beta.4/sdk/metricsadvisor/Azure.AI.MetricsAdvisor/) | | Monitor OpenTelemetry Exporter | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.Monitor.OpenTelemetry.Exporter/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/Monitor.OpenTelemetry.Exporter-readme-pre) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Monitor.OpenTelemetry.Exporter_1.0.0-beta.2/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/) | From fb112ac7bdf39eaca9cc72ae82e5fd8e8a8907a3 Mon Sep 17 00:00:00 2001 From: Tom Dykstra Date: Wed, 16 Jun 2021 13:48:54 -0700 Subject: [PATCH 033/105] Fix template name (#24704) --- docs/core/tutorials/testing-library-with-visual-studio.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/core/tutorials/testing-library-with-visual-studio.md b/docs/core/tutorials/testing-library-with-visual-studio.md index e2b89e42dd6f7..a548ae0fffb34 100644 --- a/docs/core/tutorials/testing-library-with-visual-studio.md +++ b/docs/core/tutorials/testing-library-with-visual-studio.md @@ -30,7 +30,7 @@ Unit tests provide automated software testing during your development and publis 1. On the **Add a new project** page, enter **mstest** in the search box. Choose **C#** or **Visual Basic** from the Language list, and then choose **All platforms** from the Platform list. - 1. Choose the **Unit Test Project** template, and then choose **Next**. + 1. Choose the **MSTest Test Project** template, and then choose **Next**. 1. On the **Configure your new project** page, enter **StringLibraryTest** in the **Project name** box. Then choose **Next**. From 1804307977d4e66eaaea37ce05e2d3a827367985 Mon Sep 17 00:00:00 2001 From: Tom Dykstra Date: Wed, 16 Jun 2021 13:49:17 -0700 Subject: [PATCH 034/105] fix project_path description (#24703) --- docs/core/tools/dotnet-sln.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/core/tools/dotnet-sln.md b/docs/core/tools/dotnet-sln.md index 48216080b55d5..20f0cd835a5a0 100644 --- a/docs/core/tools/dotnet-sln.md +++ b/docs/core/tools/dotnet-sln.md @@ -86,6 +86,16 @@ dotnet sln add [-h|--help] The path to the project or projects to add to the solution. Unix/Linux shell [globbing pattern](https://en.wikipedia.org/wiki/Glob_(programming)) expansions are processed correctly by the `dotnet sln` command. + If `PROJECT_PATH` includes folders, the folders portion of the path is used to create [solution folders](/visualstudio/ide/solutions-and-projects-in-visual-studio#solution-folder). For example, the following commands create a solution with `myapp` in solution folder `folder1/folder2`: + + ```dotnetcli + dotnet new sln + dotnet new console --output folder1/folder2/myapp + dotnet sln add folder1/folder2/myapp + ``` + + You can override this default behavior by using the `--in-root` or the `-s|--solution-folder ` option. + #### Options - **`-h|--help`** @@ -94,11 +104,11 @@ dotnet sln add [-h|--help] - **`--in-root`** - Places the projects in the root of the solution, rather than creating a [solution folder](/visualstudio/ide/solutions-and-projects-in-visual-studio#solution-folder). Can't be used with `-s|--solution-folder`. If you omit this option and `-s|--solution-folder`, the result is the same as specifying this option. Available since .NET Core 3.0 SDK. + Places the projects in the root of the solution, rather than creating a [solution folder](/visualstudio/ide/solutions-and-projects-in-visual-studio#solution-folder). Can't be used with `-s|--solution-folder`. Available since .NET Core 3.0 SDK. - **`-s|--solution-folder `** - The destination [solution folder](/visualstudio/ide/solutions-and-projects-in-visual-studio#solution-folder) path to add the projects to. Can't be used with `--in-root`. If you omit this option and `--in-root`, the result is the same as specifying `--in-root`. Available since .NET Core 3.0 SDK. + The destination [solution folder](/visualstudio/ide/solutions-and-projects-in-visual-studio#solution-folder) path to add the projects to. Can't be used with `--in-root`. Available since .NET Core 3.0 SDK. ### `remove` From 2ae13e018e4c2493c5f7f040374ba2664fbd5e15 Mon Sep 17 00:00:00 2001 From: Genevieve Warren <24882762+gewarren@users.noreply.github.com> Date: Wed, 16 Jun 2021 20:28:47 -0700 Subject: [PATCH 035/105] Delete XslTransform docs (#24682) --- .openpublishing.redirection.json | 82 +++- ...ary-behaviors-in-the-xsltransform-class.md | 83 ---- .../xslt-transformation-architecture.gif | Bin 10765 -> 0 bytes .../data/xml/node-sets-in-transformations.md | 74 ---- .../data/xml/outputs-from-an-xsltransform.md | 56 --- ...xternal-xslt-style-sheets-and-documents.md | 53 --- ...result-tree-fragment-in-transformations.md | 191 --------- ...support-for-the-msxsl-node-set-function.md | 53 --- docs/standard/data/xml/toc.yml | 39 +- .../xmldatadocument-input-to-xsltransform.md | 27 -- .../xml/xmldocument-input-to-xsltransform.md | 52 --- .../xpathdocument-input-to-xsltransform.md | 37 -- .../xml/xpathnavigator-in-transformations.md | 115 ------ .../xpathnodeiterator-in-transformations.md | 156 -------- ...stylesheet-scripting-using-msxsl-script.md | 231 ----------- ...t-transformations-over-different-stores.md | 18 - ...sformations-with-the-xsltransform-class.md | 98 ----- ...-sheet-parameters-and-extension-objects.md | 369 ------------------ ...orm-class-implements-the-xslt-processor.md | 240 ------------ 19 files changed, 85 insertions(+), 1889 deletions(-) delete mode 100644 docs/standard/data/xml/implementation-of-discretionary-behaviors-in-the-xsltransform-class.md delete mode 100644 docs/standard/data/xml/media/xslt-transformations-with-the-xsltransform-class/xslt-transformation-architecture.gif delete mode 100644 docs/standard/data/xml/node-sets-in-transformations.md delete mode 100644 docs/standard/data/xml/outputs-from-an-xsltransform.md delete mode 100644 docs/standard/data/xml/resolving-external-xslt-style-sheets-and-documents.md delete mode 100644 docs/standard/data/xml/result-tree-fragment-in-transformations.md delete mode 100644 docs/standard/data/xml/support-for-the-msxsl-node-set-function.md delete mode 100644 docs/standard/data/xml/xmldatadocument-input-to-xsltransform.md delete mode 100644 docs/standard/data/xml/xmldocument-input-to-xsltransform.md delete mode 100644 docs/standard/data/xml/xpathdocument-input-to-xsltransform.md delete mode 100644 docs/standard/data/xml/xpathnavigator-in-transformations.md delete mode 100644 docs/standard/data/xml/xpathnodeiterator-in-transformations.md delete mode 100644 docs/standard/data/xml/xslt-stylesheet-scripting-using-msxsl-script.md delete mode 100644 docs/standard/data/xml/xslt-transformations-over-different-stores.md delete mode 100644 docs/standard/data/xml/xslt-transformations-with-the-xsltransform-class.md delete mode 100644 docs/standard/data/xml/xsltargumentlist-for-style-sheet-parameters-and-extension-objects.md delete mode 100644 docs/standard/data/xml/xsltransform-class-implements-the-xslt-processor.md diff --git a/.openpublishing.redirection.json b/.openpublishing.redirection.json index df4e5d995e731..fa266451dfc35 100644 --- a/.openpublishing.redirection.json +++ b/.openpublishing.redirection.json @@ -1009,7 +1009,7 @@ "source_path": "docs/csharp/how-to/safely-cast-using-pattern-matching-is-and-as-operators.md", "redirect_url": "/dotnet/csharp/fundamentals/tutorials/safely-cast-using-pattern-matching-is-and-as-operators" }, - + { "source_path": "docs/csharp/implicitly-typed-lambda-expressions.md", "redirect_url": "/dotnet/csharp/language-reference/operators/lambda-expressions" @@ -12498,6 +12498,86 @@ "source_path": "docs/standard/data/index.md", "redirect_url": "/dotnet/standard/data/xml/index" }, + { + "source_path": "docs/standard/data/xml/xslt-transformations-with-the-xsltransform-class.md", + "redirect_url": "/previous-versions/dotnet/framework/data/xml/xslt/xslt-transformations-with-the-xsltransform-class", + "redirect_document_id": false + }, + { + "source_path": "docs/standard/data/xml/implementation-of-discretionary-behaviors-in-the-xsltransform-class.md", + "redirect_url": "/previous-versions/dotnet/framework/data/xml/xslt/implementation-of-discretionary-behaviors-in-the-xsltransform-class", + "redirect_document_id": false + }, + { + "source_path": "docs/standard/data/xml/xsltransform-class-implements-the-xslt-processor.md", + "redirect_url": "/previous-versions/dotnet/framework/data/xml/xslt/xsltransform-class-implements-the-xslt-processor", + "redirect_document_id": false + }, + { + "source_path": "docs/standard/data/xml/outputs-from-an-xsltransform.md", + "redirect_url": "/previous-versions/dotnet/framework/data/xml/xslt/outputs-from-an-xsltransform", + "redirect_document_id": false + }, + { + "source_path": "docs/standard/data/xml/xslt-transformations-over-different-stores.md", + "redirect_url": "/previous-versions/dotnet/framework/data/xml/xslt/xslt-transformations-over-different-stores", + "redirect_document_id": false + }, + { + "source_path": "docs/standard/data/xml/resolving-external-xslt-style-sheets-and-documents.md", + "redirect_url": "/previous-versions/dotnet/framework/data/xml/xslt/resolving-external-xslt-style-sheets-and-documents", + "redirect_document_id": false + }, + { + "source_path": "docs/standard/data/xml/xsltargumentlist-for-style-sheet-parameters-and-extension-objects.md", + "redirect_url": "/previous-versions/dotnet/framework/data/xml/xslt/xsltargumentlist-for-style-sheet-parameters-and-extension-objects", + "redirect_document_id": false + }, + { + "source_path": "docs/standard/data/xml/xslt-stylesheet-scripting-using-msxsl-script.md", + "redirect_url": "/previous-versions/dotnet/framework/data/xml/xslt/xslt-stylesheet-scripting-using-msxsl-script", + "redirect_document_id": false + }, + { + "source_path": "docs/standard/data/xml/support-for-the-msxsl-node-set-function.md", + "redirect_url": "/previous-versions/dotnet/framework/data/xml/xslt/support-for-the-msxsl-node-set-function", + "redirect_document_id": false + }, + { + "source_path": "docs/standard/data/xml/node-sets-in-transformations.md", + "redirect_url": "/previous-versions/dotnet/framework/data/xml/xslt/node-sets-in-transformations", + "redirect_document_id": false + }, + { + "source_path": "docs/standard/data/xml/result-tree-fragment-in-transformations.md", + "redirect_url": "/previous-versions/dotnet/framework/data/xml/xslt/result-tree-fragment-in-transformations", + "redirect_document_id": false + }, + { + "source_path": "docs/standard/data/xml/xpathnavigator-in-transformations.md", + "redirect_url": "/previous-versions/dotnet/framework/data/xml/xslt/xpathnavigator-in-transformations", + "redirect_document_id": false + }, + { + "source_path": "docs/standard/data/xml/xpathnodeiterator-in-transformations.md", + "redirect_url": "/previous-versions/dotnet/framework/data/xml/xslt/xpathnodeiterator-in-transformations", + "redirect_document_id": false + }, + { + "source_path": "docs/standard/data/xml/xpathdocument-input-to-xsltransform.md", + "redirect_url": "/previous-versions/dotnet/framework/data/xml/xslt/xpathdocument-input-to-xsltransform", + "redirect_document_id": false + }, + { + "source_path": "docs/standard/data/xml/xmldatadocument-input-to-xsltransform.md", + "redirect_url": "/previous-versions/dotnet/framework/data/xml/xslt/xmldatadocument-input-to-xsltransform", + "redirect_document_id": false + }, + { + "source_path": "docs/standard/data/xml/xmldocument-input-to-xsltransform.md", + "redirect_url": "/previous-versions/dotnet/framework/data/xml/xslt/xmldocument-input-to-xsltransform", + "redirect_document_id": false + }, { "source_path": "docs/standard/design-guidelines/choosing-between-anonymous-and-tuple.md", "redirect_url": "/dotnet/standard/base-types/choosing-between-anonymous-and-tuple" diff --git a/docs/standard/data/xml/implementation-of-discretionary-behaviors-in-the-xsltransform-class.md b/docs/standard/data/xml/implementation-of-discretionary-behaviors-in-the-xsltransform-class.md deleted file mode 100644 index 55a05f2043894..0000000000000 --- a/docs/standard/data/xml/implementation-of-discretionary-behaviors-in-the-xsltransform-class.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -description: "Learn more about: Implementation of Discretionary Behaviors in the XslTransform Class" -title: "Implementation of Discretionary Behaviors in the XslTransform Class" -ms.date: "03/30/2017" -ms.assetid: d2758ea1-03f6-47bd-88d2-0fb7ccdb2fab ---- -# Implementation of Discretionary Behaviors in the XslTransform Class - -> [!NOTE] -> The class is obsolete in the .NET Framework 2.0. You can perform Extensible Stylesheet Language for Transformations (XSLT) transformations using the class. See [Using the XslCompiledTransform Class](using-the-xslcompiledtransform-class.md) and [Migrating From the XslTransform Class](migrating-from-the-xsltransform-class.md) for more information. - -Discretionary behaviors are described as behaviors listed in the [World Wide Web Consortium (W3C) XSL Transformations (XSLT) Version 1.0 Recommendation](https://www.w3.org/TR/1999/REC-xslt-19991116), in which the implementation provider chooses one of several possible options as a way to handle a situation. For example, in section 7.3 Creating Processing Instructions, the W3C Recommendation says that it is an error if instantiating the content of `xsl:processing-instruction` creates nodes other than text nodes. For some problems, the W3C tells what decision should be made if the processor decides to recover from the error. For the problem given in section 7.3, the W3C says that the implementation can recover from this error by ignoring the nodes and their content. - -Therefore, for each of the discretionary behaviors allowed by the W3C, the table below lists the discretionary behaviors implemented for the .NET Framework implementation of the class, and what section in the W3C XSLT 1.0 Recommendation that this problem is discussed. - -|Problem|Behavior|Section| -|-------------|--------------|-------------| -|A text node matches both `xsl:strip-space` and `xsl:preserve-space`.|Recover|3.4| -|A source node matches more than one template rule.|Recover|5.5| -|A namespace Uniform Resource Identifier (URI) is declared to be an alias for multiple namespace URIs, all having the same import precedence.|Recover|7.1.1| -|The name attribute in `xsl:attribute` and `xsl:element` generated from an attribute value template is not a valid qualified name (QName).|Exception thrown|7.1.2 and 7.1.3| -|Adding an attribute to an element after child nodes have already been added to the element node.|Recover|7.1.3| -|Adding an attribute to anything other than an element node.|Recover|7.1.3| -|Instantiation of the content of the `xsl:attribute` element is not a text node.|Recover|7.1.3| -|Two attribute sets have the same import precedence and expanded name. Both have the same attribute, and there is no other attribute set containing the common attribute with the same name with higher importance.|Recover|7.1.4| -|`xsl:processing-instruction` name attribute does not yield both a no-colon name (NCName) and a Processing Instruction target.|Recover|7.3| -|Instantiating the content of `xsl:processing-instruction` creates nodes other than text nodes.|Recover|7.3| -|Results of instantiating the content of the `xsl:processing-instruction` contains the string "`?>`".|Recover|7.3| -|Results of instantiating the content of the `xsl:comment` contains the string "--", or ends with "-".|Recover|7.4| -|Results of instantiating the content of the `xsl:comment` creates nodes other than text nodes.|Recover|7.4| -|The template within a variable-binding element returns an attribute node or a namespace node.|Recover|11.2| -|There is an error retrieving the resource from the URI passed into the document function.|Exception thrown|12.1| -|The URI reference in the document function contains a fragment identifier, and there is an error processing the fragment identifier.|Exception thrown|12.1| -|There are multiple attributes with the same name that are not named `cdata-section-elements` in `xls:output`, and these attributes have the same import precedence.|Recover|16| -|The processor does not support the character encoding value given in the `encoding` attribute of the `xsl:output` element.|Recover|16.1| -|`disable-output-escaping` is used for a text node, and that text node is used to create something other than a text node in the result tree.|`disable-output-escaping` attribute is ignored|16.4| -|Converting a result tree fragment to a number or string if the result tree fragment contains a text node with output escaping enabled.|Ignored|16.4| -|Output escaping is disabled for characters that cannot be represented in the encoding that the XSLT processor is using for output.|Ignored|16.4| -|Adding a namespace node to an element after children have been added to it or after attributes have been added to it|Recover|Errata e25| -|`xsl:number` is NaN, infinite, or less than 0.5.|Recover|Errata e24| -|The second argument node-set to the document function is empty and the URI reference is relative|Recover|Errata e14| - -Sections from the errata can be found in the W3C [XSL Transformations (XSLT) Version 1.0 Specification Errata](https://www.w3.org/1999/11/REC-xslt-19991116-errata/). - -## Custom-Defined Implementation Behaviors - -There are behaviors unique to the class implementation. This section discusses the provider-specific implementation of the `xsl:sort` and optional features that are supported by the class. - -## xsl:sort - -When using a transformation to sort, the W3C XSLT 1.0 Recommendation makes some observations. They are: - -- Two XSLT processors may be conforming processors, but still may sort differently. - -- Not all XSLT processors support the same languages. - -- With regard to languages, different processors may vary on their sorting on a particular language not specified on the `xsl:sort.` - -The following table shows the sorting behavior implemented for each data type in the .NET Framework implementation of a transformation using : - -|Data type|Sorting behavior| -|---------------|----------------------| -|Text|Data is sorted using the common language runtime (CLR) String.Compare method, and the cultural locale. When the data type equals "text", sorting in the class behaves identically to the string comparison behaviors of the CLR.| -|Number|Numeric values are treated as XML Path Language (XPath) numbers and are sorted according to the details outlined in the W3C [XML Path Language (XPath) Version 1.0 Recommendation, Section 3.5](https://www.w3.org/TR/1999/REC-xpath-19991116/#numbers).| - -## Optional Features Supported - -The following table shows the features that are optional for an XSLT processor to implement and are implemented in the class. - -|Feature|Reference location|Notes| -|-------------|------------------------|-----------| -|`disable-output-escaping` attribute on `` and `` tags.|W3C XSLT 1.0 Recommendation,

Section 16.4|The `disable-output-escaping` attribute is ignored when the `xsl:text` or `xsl:value-of` elements are used in an `xsl:comment`, `xsl:processing-instruction`, or `xsl:attribute` element.

Result tree fragments that contain text and the text output that has been escaped are not supported.

The disable-output-escaping attribute is ignored when transforming to an or object.| - -## See also - -- -- [XslTransform Class Implements the XSLT Processor](xsltransform-class-implements-the-xslt-processor.md) -- [XSLT Transformations with the XslTransform Class](xslt-transformations-with-the-xsltransform-class.md) -- [XPathNavigator in Transformations](xpathnavigator-in-transformations.md) -- [XPathNodeIterator in Transformations](xpathnodeiterator-in-transformations.md) -- [XPathDocument Input to XslTransform](xpathdocument-input-to-xsltransform.md) -- [XmlDataDocument Input to XslTransform](xmldatadocument-input-to-xsltransform.md) -- [XmlDocument Input to XslTransform](xmldocument-input-to-xsltransform.md) diff --git a/docs/standard/data/xml/media/xslt-transformations-with-the-xsltransform-class/xslt-transformation-architecture.gif b/docs/standard/data/xml/media/xslt-transformations-with-the-xsltransform-class/xslt-transformation-architecture.gif deleted file mode 100644 index 796592c307e845eb34eb5209d48b922fd4d4657c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10765 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 diff --git a/docs/standard/data/xml/node-sets-in-transformations.md b/docs/standard/data/xml/node-sets-in-transformations.md deleted file mode 100644 index 88cb234e5f1df..0000000000000 --- a/docs/standard/data/xml/node-sets-in-transformations.md +++ /dev/null @@ -1,74 +0,0 @@ ---- -description: "Learn more about: Node Sets in Transformations" -title: "Node Sets in Transformations" -ms.date: "03/30/2017" -ms.assetid: ad034f0e-ff8b-4a71-9a4c-528c754263c4 ---- -# Node Sets in Transformations - -Node sets are one of four basic data types that are returned from XML Path Language (XPath) expressions. A node set, which is an unordered collection of nodes without duplicates, created in document order, can be assigned to a variable in a style sheet. - -> [!NOTE] -> The class is obsolete in the .NET Framework 2.0. You can perform Extensible Stylesheet Language for Transformations (XSLT) transformations using the class. See [Using the XslCompiledTransform Class](using-the-xslcompiledtransform-class.md) and [Migrating From the XslTransform Class](migrating-from-the-xsltransform-class.md) for more information. - - Node sets are one of four basic data types that are returned from XPath expressions. A node set, which is an unordered collection of nodes without duplicates, created in document order, can be assigned to a variable in a style sheet. This node set, which is a result of an XPath expression used in a `select` attribute in a transformation, has the same behavior as a node set from the XML Document Object Model (DOM). You can navigate a node set using a set of methods shown in [Node Set Navigation Using XPathNavigator](node-set-navigation-using-xpathnavigator.md), unlike a result tree fragment or result tree fragment, which uses the for navigation. - - The following code sample shows how to iterate over a node set when a `variable` or `parameter` element in a style sheet evaluates to a node set. - -## Style Sheet - -```xml - - - - - - - ****** - - ****** - - - - -``` - -## Input - -```xml - - - Seven Years in Trenton - - - - Seven Years in Trenton2 - - - - History of Trenton Vol 3 - - -``` - -## Output - -```output -****** -Seven Years in Trenton -****** - -****** -Seven Years in Trenton2 -****** - -****** -History of Trenton Vol 3 -****** -``` - -## See also - -- -- [XSLT Transformations with the XslTransform Class](xslt-transformations-with-the-xsltransform-class.md) -- [XslTransform Class Implements the XSLT Processor](xsltransform-class-implements-the-xslt-processor.md) diff --git a/docs/standard/data/xml/outputs-from-an-xsltransform.md b/docs/standard/data/xml/outputs-from-an-xsltransform.md deleted file mode 100644 index 5613c2a949892..0000000000000 --- a/docs/standard/data/xml/outputs-from-an-xsltransform.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -description: "Learn more about: Outputs from an XslTransform" -title: "Outputs from an XslTransform" -ms.date: "03/30/2017" -ms.topic: reference ---- -# Outputs from an XslTransform - -Since style sheets can determine the output format using an `` statement with the `method` attribute, the following table describes what the output format is when the method is used to write the output, and the output format is declared as a or . - -> [!NOTE] -> The class is obsolete in the .NET Framework 2.0. You can perform Extensible Stylesheet Language for Transformations (XSLT) transformations using the class. See [Using the XslCompiledTransform Class](using-the-xslcompiledtransform-class.md) and [Migrating From the XslTransform Class](migrating-from-the-xsltransform-class.md) for more information. - - Since style sheets can determine the output format using an `` statement with the `method` attribute, the following table describes what the output format is when the method is used to write the output, and the output format is declared as a or . The following table describes what happens when an output type is declared by the method in conjunction with the use of an `` statement: - -|\ attribute|Result format| -|-----------------------------------------|-------------------| -|method="xml"|XML| -|method="html"|HTML| -|method="text"|Text| - -> [!NOTE] -> Note: The `` statement is ignored when the output of the method is an or . - - The following attributes are supported when the method output is a or : - -- encoding* - -- omit-xml-declaration - -- standalone - -- doctype-public - -- doctype-system - -- cdata-section-elements - -- indent - - > [!NOTE] - > \*The encoding attribute is ignored when the method is sending its output to a . The encoding property on the is used instead. - - The following attribute is ignored when the method output is a : - -- version: the version is always 1.0 - -- media-type: the media-type - -## Escaping Special Characters - - The `` tag is used to indicate whether or not special characters need to be escaped into an XML form (for example, using `<<>` in place of the `"<"` symbol) or left in the present condition. The `disable-output-escaping` attribute is ignored when transforming to an or object and has no effect on special characters. - -## See also - -- [XslTransform Class Implements the XSLT Processor](xsltransform-class-implements-the-xslt-processor.md) diff --git a/docs/standard/data/xml/resolving-external-xslt-style-sheets-and-documents.md b/docs/standard/data/xml/resolving-external-xslt-style-sheets-and-documents.md deleted file mode 100644 index 8e6381887fc11..0000000000000 --- a/docs/standard/data/xml/resolving-external-xslt-style-sheets-and-documents.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -description: "Learn more about: Resolving External XSLT Style Sheets and Documents" -title: "Resolving External XSLT Style Sheets and Documents" -ms.date: "03/30/2017" -ms.assetid: 920cfe3b-d525-4bb2-abf6-9431651f9cf9 ---- -# Resolving External XSLT Style Sheets and Documents - -There are several times during a transformation when you may need to resolve external resources. - -> [!NOTE] -> The class is obsolete in the .NET Framework 2.0. You can perform Extensible Stylesheet Language for Transformations (XSLT) transformations using the class. - - There are several times during a transformation when you may need to resolve external resources: - -- During the to locate an external style sheet. - -- During to resolve any `` or `` elements found in the style sheet. - -- During to resolve any `document()` functions. - -## Using the XmlResolver Class - - If authentication is required to access a network resource, use the methods that have an parameter to pass the object, which has the necessary credential properties set. - - If you have a custom that you want to use, or if you need to specify different credentials, the following table lists the task required, depending on when the external resource needs resolution. - -|What process requires resolution|Task required| -|--------------------------------------|-------------------| -|During to locate the style sheet.|Specify the overloaded method that takes, as a parameter, an if the style sheet is on a resource that requires credentials.| -|During to resolve `` or ``.|Specify the overloaded method that takes, as a parameter, an . The is used to load the style sheets referenced by the `import` or `include` statements. If you pass in `null`, the external resources are not resolved.| -|During a transformation to resolve any `document()` functions.|Specify the during the transformation by using the method that takes an argument.| - - The `document()` function retrieves other XML resources from a style sheet, in addition to the initial XML data provided by the input stream. Since this function allows the inclusion of XML data that can be located elsewhere, an with a `null` value supplied to the method prevents the `document()` function from executing. If you want to use the `document()` function, use the method that takes an as a parameter, in addition to having the appropriate permission set. - - For more information on the method and its use of the , see . - - When the method is called, permissions are calculated against the evidence provided at load time, and that permission set is assigned to the entire transformation process. If the `document()` function attempts to initiate an action that requires permissions not found in the set, an exception is thrown. - -## See also - -- [XSLT Transformations with the XslTransform Class](xslt-transformations-with-the-xsltransform-class.md) -- [XslTransform Class Implements the XSLT Processor](xsltransform-class-implements-the-xslt-processor.md) -- [Outputs from an XslTransform](outputs-from-an-xsltransform.md) -- [XSLT Transformations Over Different Stores](xslt-transformations-over-different-stores.md) -- [XsltArgumentList for Style Sheet Parameters and Extension Objects](xsltargumentlist-for-style-sheet-parameters-and-extension-objects.md) -- [XSLT Stylesheet Scripting Using \](xslt-stylesheet-scripting-using-msxsl-script.md) -- [Support for the msxsl:node-set() Function](support-for-the-msxsl-node-set-function.md) -- [XPathNavigator in Transformations](xpathnavigator-in-transformations.md) -- [XPathNodeIterator in Transformations](xpathnodeiterator-in-transformations.md) -- [XPathDocument Input to XslTransform](xpathdocument-input-to-xsltransform.md) -- [XmlDataDocument Input to XslTransform](xmldatadocument-input-to-xsltransform.md) -- [XmlDocument Input to XslTransform](xmldocument-input-to-xsltransform.md) diff --git a/docs/standard/data/xml/result-tree-fragment-in-transformations.md b/docs/standard/data/xml/result-tree-fragment-in-transformations.md deleted file mode 100644 index 647beac69828c..0000000000000 --- a/docs/standard/data/xml/result-tree-fragment-in-transformations.md +++ /dev/null @@ -1,191 +0,0 @@ ---- -description: "Learn more about: Result Tree Fragment in Transformations" -title: "Result Tree Fragment in Transformations" -ms.date: "03/30/2017" -ms.assetid: df363480-ba02-4233-9ddf-8434e421c4f1 ---- -# Result Tree Fragment in Transformations - -> [!NOTE] -> The class is obsolete in the .NET Framework 2.0. You can perform Extensible Stylesheet Language for Transformations (XSLT) transformations using the class. See [Using the XslCompiledTransform Class](using-the-xslcompiledtransform-class.md) and [Migrating From the XslTransform Class](migrating-from-the-xsltransform-class.md) for more information. - - Result tree fragments, also known as result tree fragments, are nothing more than a special type of node set. You can perform any function on them that can be performed on a node set. Or, you can also convert a result tree fragment to a node set using the `node-set()` function and subsequently use it any place that a node set can be used. - - A result tree fragment is created as a result of using an `` or `` element in a specific manner in a style sheet. The syntax for the `variable` and `parameter` elements is as follows: - -```xml - - template body - - - - template body - -``` - -For the `parameter` element, the value is assigned to the qualified name (`Qname`) in several ways. You can assign a default value to the parameter by returning content from the XML Path Language (XPath) expression in the `select` attribute, or by assigning it the contents of the template body. - -For the `variable` element, the value is also assigned in several ways. You can assign it by returning content from the XPath expression in the `select` attribute, or by assigning it the contents of the template body. - -For both the `parameter` and `variable` elements, if a value is assigned by the XPath expression, then one of the four basic XPath types will be returned: Boolean, string, number, or node set. When the value is given by using a non-empty template body, then a non-XPath data type is returned, and that will be a result tree fragment. - -When a variable is bound to a result tree fragment instead of one of the four basic XPath data types, this is the only time that an XPath query returns a type that is not one of the four XPath object types. Result tree fragments and their behavior are discussed in the [World Wide Web Consortium (W3C) specification](https://www.w3.org/TR/xslt-10/), [section 11.1 Result Tree Fragments](https://www.w3.org/TR/xslt-10/#section-Result-Tree-Fragments) through [section 11.6 Passing Parameters to Templates](https://www.w3.org/TR/xslt-10/#section-Passing-Parameters-to-Templates). Also, [section 1 Introduction](https://www.w3.org/TR/xslt-10/#section-Introduction) discusses how templates can contain elements from the XSLT namespace that return or create result tree fragments. - -A result tree fragment, in concept, behaves like a node set with nothing more than a single root node. However, the rest of the nodes returned are child nodes. To programmatically see the child nodes, copy the result tree fragment to the result tree using the `` element. When the copy-of is performed, all the child nodes are also copied to the result tree in sequence. Until a `copy` or `copy-of` is used, a result tree fragment is not part of the result tree or the output from the transformation. - -To iterate over the returned nodes of a result tree fragment, an is used. The following code sample shows how to create a result tree fragment within a style sheet by calling the function with a parameter `fragment`, which contains XML. - -```xml - - - - - - - - - function NodeFragment(XPathNavigator nav) - { - if (nav.HasSelection == false) - XPathNavigator.MoveToNext(); - return; - } - - - - - - -``` - -Here is another sample showing a variable, which is in Rich Text Format (RTF), and hence, a type of result tree fragment, that is not converted to a node set. Instead, it is passed to a script function, and the is used to navigate over the nodes. - -```xml - - - - - - Book1 - Book2 - Book3 - Book4 - - - - - - - - - - - - - - - -``` - -The result of transforming any XML with this style sheet is shown in the following output. - -## Output - -```xml -Book1 -``` - -As stated above, the `node-set` function enables you to convert a result tree fragment into a node set. The resulting node always contains a single node that is the root node of the tree. If you convert a result tree fragment to a node set, then you can use it anywhere a regular node set is used, such as in a for-each statement or in the value of a `select` attribute. The following lines of code show the fragment being converted to a node set and used as a node set: - -`` - -`` - -When a fragment is converted to a node set, you no longer use the to navigate over it. For a node set, you use the instead. - -In the following example, `$var` is a variable that is a node tree in the style sheet. The for-each statement, combined with the `node-set` function, allows the user to iterate over this tree as a node set. - -```xml - - - AL - CA - CO - WA - - - - - - -``` - -Here is another example of a variable that is in RTF, and hence of type result tree fragment, that is converted to a node set before being passed to a script function as XPathNodeIterator. - -```xml - - - - - - Book1 - Book2 - Book3 - Book4 - - - - - - - - - - - - - - -``` - -The following is the result of transforming XML with this style sheet: - -```xml -Book1Book2Book3Book4 -``` - -## See also - -- -- [XSLT Transformations with the XslTransform Class](xslt-transformations-with-the-xsltransform-class.md) -- [XslTransform Class Implements the XSLT Processor](xsltransform-class-implements-the-xslt-processor.md) diff --git a/docs/standard/data/xml/support-for-the-msxsl-node-set-function.md b/docs/standard/data/xml/support-for-the-msxsl-node-set-function.md deleted file mode 100644 index b942a7ab0a05e..0000000000000 --- a/docs/standard/data/xml/support-for-the-msxsl-node-set-function.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -description: "Learn more about: Support for the msxsl:node-set() Function" -title: "Support for the msxsl:node-set() Function" -ms.date: "03/30/2017" -ms.assetid: d0cbf517-d9f6-4097-9851-4fa62903decd ---- -# Support for the msxsl:node-set() Function - -The `msxsl:node-set` function enables you to convert a result tree fragment into a node set. The resulting node set always contains a single node and is the root node of the tree. - -> [!NOTE] -> The class is obsolete in the .NET Framework 2.0. You can perform Extensible Stylesheet Language for Transformations (XSLT) transformations using the class. See [Using the XslCompiledTransform Class](using-the-xslcompiledtransform-class.md) and [Migrating From the XslTransform Class](migrating-from-the-xsltransform-class.md) for more information. - - The `msxsl:node-set` function enables you to convert a result tree fragment into a node set. The resulting node set always contains a single node and is the root node of the tree. - -## Example - - In the following example, `$books` is a variable that is a node tree in the style sheet. The for-each statement combined with the `node-set` function allows the user to iterate over this node tree as a node set. - -## nodeset.xsl - -```xml - - - Writing Secure Code - XSLT Reference - - - - - - - - - - -``` - -## Output - - The output of the transformation is - -```xml - -Michael HowardMichael Kay -``` - -## See also - -- [XslTransform Class Implements the XSLT Processor](xsltransform-class-implements-the-xslt-processor.md) diff --git a/docs/standard/data/xml/toc.yml b/docs/standard/data/xml/toc.yml index 5276786ced637..dbcfe5332d16c 100644 --- a/docs/standard/data/xml/toc.yml +++ b/docs/standard/data/xml/toc.yml @@ -166,58 +166,27 @@ href: xslt-extension-objects.md - name: XSLT Parameters href: xslt-parameters.md - - name: "Script Blocks Using msxsl:script" + - name: Script Blocks Using msxsl:script href: script-blocks-using-msxsl-script.md - name: Recoverable XSLT Errors href: recoverable-xslt-errors.md - - name: "How to: Transform a Node Fragment" + - name: 'How to: Transform a Node Fragment' href: how-to-transform-a-node-fragment.md - name: Migrating From the XslTransform Class href: migrating-from-the-xsltransform-class.md items: - - name: "How to: Migrate Your XslTransform Code" + - name: 'How to: Migrate Your XslTransform Code' href: how-to-migrate-your-xsltransform-code.md - name: XSLT Security Considerations href: xslt-security-considerations.md - name: XSLT Compiler (xsltc.exe) href: xslt-compiler-xsltc-exe.md items: - - name: "How to: Perform an XSLT Transformation by Using an Assembly" + - name: 'How to: Perform an XSLT Transformation by Using an Assembly' href: how-to-perform-an-xslt-transformation-by-using-an-assembly.md - name: XSLT Transformations with the XslTransform Class - href: xslt-transformations-with-the-xsltransform-class.md items: - - name: Implementation of Discretionary Behaviors in the XslTransform Class - href: implementation-of-discretionary-behaviors-in-the-xsltransform-class.md - name: XslTransform Class Implements the XSLT Processor - href: xsltransform-class-implements-the-xslt-processor.md - items: - - name: Outputs from an XslTransform - href: outputs-from-an-xsltransform.md - - name: XSLT Transformations Over Different Stores - href: xslt-transformations-over-different-stores.md - - name: Resolving External XSLT Style Sheets and Documents - href: resolving-external-xslt-style-sheets-and-documents.md - - name: XsltArgumentList for Style Sheet Parameters and Extension Objects - href: xsltargumentlist-for-style-sheet-parameters-and-extension-objects.md - - name: "XSLT Stylesheet Scripting Using " - href: xslt-stylesheet-scripting-using-msxsl-script.md - - name: "Support for the msxsl:node-set() Function" - href: support-for-the-msxsl-node-set-function.md - - name: Node Sets in Transformations - href: node-sets-in-transformations.md - - name: Result Tree Fragment in Transformations - href: result-tree-fragment-in-transformations.md - - name: XPathNavigator in Transformations - href: xpathnavigator-in-transformations.md - - name: XPathNodeIterator in Transformations - href: xpathnodeiterator-in-transformations.md - - name: XPathDocument Input to XslTransform - href: xpathdocument-input-to-xsltransform.md - - name: XmlDataDocument Input to XslTransform - href: xmldatadocument-input-to-xsltransform.md - - name: XmlDocument Input to XslTransform - href: xmldocument-input-to-xsltransform.md - name: Working with XML Schemas href: working-with-xml-schemas.md items: diff --git a/docs/standard/data/xml/xmldatadocument-input-to-xsltransform.md b/docs/standard/data/xml/xmldatadocument-input-to-xsltransform.md deleted file mode 100644 index d30ec233b784b..0000000000000 --- a/docs/standard/data/xml/xmldatadocument-input-to-xsltransform.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -description: "Learn more about: XmlDataDocument Input to XslTransform" -title: "XmlDataDocument Input to XslTransform" -ms.date: "03/30/2017" -ms.assetid: a0b536b6-cdb3-4a44-86c2-3b2ebc7bd4c9 ---- -# XmlDataDocument Input to XslTransform - -> [!NOTE] -> The class is obsolete in the .NET Framework 2.0. You can perform Extensible Stylesheet Language for Transformations (XSLT) transformations using the class. See [Using the XslCompiledTransform Class](using-the-xslcompiledtransform-class.md) and [Migrating From the XslTransform Class](migrating-from-the-xsltransform-class.md) for more information. - - The Microsoft .NET Framework implements the XML Document Object Model (DOM) to provide access to data in XML documents and additional classes to read, write, and navigate in XML documents. The , found in the namespace, provides relational access to data with its ability to synchronize with the relational data in the . You can simultaneously view and manipulate structured XML through the relational representation of the or manipulate the semi-structured XML through the DOM representation of the . The therefore crosses the boundaries of the XML and the relational worlds. - - If data is stored in a relational structure and you want it to be input to an XSLT transformation, you can load the relational data into a and associate it with the . The , the input to the , is implemented on the through the interface. By taking relational data, loading it into a , and using the synchronizing within the , the relational data can now have XSLT transformations performed on it. - - For more information on applying a transform to relational data, see [Applying an XSLT Transform to a DataSet](../../../framework/data/adonet/dataset-datatable-dataview/applying-an-xslt-transform-to-a-dataset.md). - -## See also - -- -- [DataSet and XmlDataDocument Synchronization](../../../framework/data/adonet/dataset-datatable-dataview/dataset-and-xmldatadocument-synchronization.md) -- [XSLT Transformations with the XslTransform Class](xslt-transformations-with-the-xsltransform-class.md) -- [XslTransform Class Implements the XSLT Processor](xsltransform-class-implements-the-xslt-processor.md) -- [XPathNavigator in Transformations](xpathnavigator-in-transformations.md) -- [XPathNodeIterator in Transformations](xpathnodeiterator-in-transformations.md) -- [XPathDocument Input to XslTransform](xpathdocument-input-to-xsltransform.md) -- [XmlDocument Input to XslTransform](xmldocument-input-to-xsltransform.md) diff --git a/docs/standard/data/xml/xmldocument-input-to-xsltransform.md b/docs/standard/data/xml/xmldocument-input-to-xsltransform.md deleted file mode 100644 index 3697655a7bac0..0000000000000 --- a/docs/standard/data/xml/xmldocument-input-to-xsltransform.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -description: "Learn more about: XmlDocument Input to XslTransform" -title: "XmlDocument Input to XslTransform" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -ms.assetid: 97115892-410a-4657-ab47-1e14dfba73f8 ---- -# XmlDocument Input to XslTransform - -The class provides editing capabilities for an XML document. If the XML needs to be edited or modified before being sent to the method, load the XML into an , edit it, and send it in to the . - -> [!NOTE] -> The class is obsolete in the .NET Framework 2.0. You can perform Extensible Stylesheet Language for Transformations (XSLT) transformations using the class. See [Using the XslCompiledTransform Class](using-the-xslcompiledtransform-class.md) and [Migrating From the XslTransform Class](migrating-from-the-xsltransform-class.md) for more information. - - The implements the interface, so the document can be passed to the method after editing. - - Due to the editing capability of the , using the class as input to a transformation is slower than using an for the Extensible Stylesheet Language for Transformations (XSLT) transformations, as the is optimized for XML Path Language (XPath) queries due to the internal storage. - -## Example - - The following code example shows how an can be supplied to the , with the output sent to an . - -```vb -Dim doc as XmlDocument = new XmlDocument() -doc.Load("books.xml") -Dim trans As XslTransform = new XslTransform() -trans.Load("book.xsl") -Dim rdr As XmlReader = trans.Transform(doc, Nothing, Nothing) -while (rdr.Read()) -end while -``` - -```csharp -XmlDocument doc = new XmlDocument(); -doc.Load("books.xml"); -XslTransform trans = new XslTransform(); -trans.Load("book.xsl"); -XmlReader rdr = trans.Transform(doc, null, null); -while (rdr.Read()) {} -``` - -## See also - -- -- [XSLT Transformations with the XslTransform Class](xslt-transformations-with-the-xsltransform-class.md) -- [XslTransform Class Implements the XSLT Processor](xsltransform-class-implements-the-xslt-processor.md) -- [XPathNavigator in Transformations](xpathnavigator-in-transformations.md) -- [XPathNodeIterator in Transformations](xpathnodeiterator-in-transformations.md) -- [XPathDocument Input to XslTransform](xpathdocument-input-to-xsltransform.md) -- [XmlDataDocument Input to XslTransform](xmldatadocument-input-to-xsltransform.md) diff --git a/docs/standard/data/xml/xpathdocument-input-to-xsltransform.md b/docs/standard/data/xml/xpathdocument-input-to-xsltransform.md deleted file mode 100644 index 3a1d8e5e20d73..0000000000000 --- a/docs/standard/data/xml/xpathdocument-input-to-xsltransform.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -description: "Learn more about: XPathDocument Input to XslTransform" -title: "XPathDocument Input to XslTransform" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -ms.assetid: 7d1bbe8b-ed43-4e62-a5ba-d602d244f4ae ---- -# XPathDocument Input to XslTransform - -The is a read-only cache, for processing documents with . It is structurally similar to the XML Document Object Model (DOM), but it is highly optimized for Extensible Stylesheet Language for Transformations (XSLT) processing and the XML Path Language (XPath) data model using the XPath optimization functions on the . - -> [!NOTE] -> The class is obsolete in the .NET Framework 2.0. You can perform Extensible Stylesheet Language for Transformations (XSLT) transformations using the class. See [Using the XslCompiledTransform Class](using-the-xslcompiledtransform-class.md) and [Migrating From the XslTransform Class](migrating-from-the-xsltransform-class.md) for more information. - - The following code sample creates an as input to a transform. - -```vb -Dim xslt as XslTransform = new XslTransform() -Xslt.Load(someStylesheet) -Dim doc as XPathDocument = New XPathDocument("books.xml") -Dim fs as StringWriter = new StringWriter() -Xslt.Transform(doc, Nothing, fs, Nothing); -``` - -```csharp -XslTransform xslt = new XslTransform(); -Xslt.Load(someStylesheet); -XPathDocument doc = XPathDocument("books.xml"); -StringWriter fs = new StringWriter(); -Xslt.Transform(doc, null, fs, null); -``` - -## See also - -- [XslTransform Class Implements the XSLT Processor](xsltransform-class-implements-the-xslt-processor.md) diff --git a/docs/standard/data/xml/xpathnavigator-in-transformations.md b/docs/standard/data/xml/xpathnavigator-in-transformations.md deleted file mode 100644 index 7be6d072fdc8d..0000000000000 --- a/docs/standard/data/xml/xpathnavigator-in-transformations.md +++ /dev/null @@ -1,115 +0,0 @@ ---- -description: "Learn more about: XPathNavigator in Transformations" -title: "XPathNavigator in Transformations" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -ms.assetid: 118f97d1-7110-4d1b-b0bd-4143252c0bb0 ---- -# XPathNavigator in Transformations - -The class provides read-only random access to data and is designed for use as an input to Extensible Stylesheet Language for Transformations (XSLT). It is implemented on the , , and . The is based upon the World Wide Web Consortium (W3C) Data Model as described in section 5 of the XML Path Language (XPath) recommendation. - - The defines a cursor model over any store and provides fast, read-only XPath queries over any data store. The is also the class to use for iterating over result tree fragments. - - The API enables you to get information from the current node in the store and move to connected nodes. The is a cursor style model that performs traversal over a store using a set of **Move** methods. The is always positioned on a node. Any **Move** method that fails leaves the unchanged. - - The is the class to use for iterating over result tree fragments. The following code sample creates a result tree fragment within a style sheet by calling the function with the parameter, `fragment`, which contains XML. - -## test.xsl - -```xml - - - - - Joe - - - - - - - - - - - - -``` - -## test.xml - -```xml -Some text -``` - - The following code uses the **test.xsl** style sheet and **test.xml** input data. - -```vb -Imports System -Imports System.IO -Imports System.Xml -Imports System.Xml.Xsl -Imports System.Xml.XPath -Imports System.Text -Public Class sample - - Public Shared Sub Main() - Dim xslt As New XslTransform() - xslt.Load("test.xsl") - - Dim xd As New XPathDocument("test.xml") - - Dim strmTemp = New FileStream("out.xml", FileMode.Create, FileAccess.ReadWrite) - xslt.Transform(xd, Nothing, strmTemp, Nothing) - End Sub 'Main -End Class 'sample -``` - -```csharp -using System; -using System.IO; -using System.Xml; -using System.Xml.Xsl; -using System.Xml.XPath; -using System.Text; - -public class sample -{ - public static void Main() - { - XslTransform xslt = new XslTransform(); - xslt.Load("test.xsl"); - - XPathDocument xd = new XPathDocument("test.xml"); - - Stream strmTemp = new FileStream("out.xml", FileMode.Create, FileAccess.ReadWrite); - xslt.Transform(xd, null, strmTemp, null); - } -} -``` - -## Output - - The result of the transformation is found in the file **out.xml**: - -```xml -Joe -``` - -## See also - -- [XslTransform Class Implements the XSLT Processor](xsltransform-class-implements-the-xslt-processor.md) diff --git a/docs/standard/data/xml/xpathnodeiterator-in-transformations.md b/docs/standard/data/xml/xpathnodeiterator-in-transformations.md deleted file mode 100644 index aa463c7fa4358..0000000000000 --- a/docs/standard/data/xml/xpathnodeiterator-in-transformations.md +++ /dev/null @@ -1,156 +0,0 @@ ---- -description: "Learn more about: XPathNodeIterator in Transformations" -title: "XPathNodeIterator in Transformations" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -ms.assetid: 2bc6ddc6-674a-4f75-b264-abc35e4e5857 ---- -# XPathNodeIterator in Transformations - -The provides methods to iterate over a set of nodes created as the result of an XML Path Language (XPath) query or a result tree fragment converted to a node set by use of the node-set method. The enables you to iterate over the nodes within that node set. Once a node set is retrieved, the class provides a read-only, forward-only cursor to the selected set of nodes. The node set is created in document order, so calling this method moves to the next node in document order. does not build a node tree of all the nodes in the set. Instead, it provides a single node window into the data, exposing the underlying node it points to as you move around in the tree. The methods and properties available from the class enable you to get information from the current node. For a list of the available methods and properties, see . - - Since an moves over a set of nodes created from an XPath query and moves forward only, the way to move is by using the method. The return type of this method is `Boolean`, returning `true` if it moves to the next selected node, and `false` if there are no more selected nodes. If it returns `true`, the following list shows the properties available: - -- - -- - -- - - When you are looking at a node set for the first time, a call to must be made to position the on the first node of the selected set. This allows a while loop to be written. - - The following code example shows how to pass an to an as a parameter in the . The input to the code is **books.xml**, and the style sheet is **text.xsl**. The file **test.xml** is the . - -```vb -Imports System -Imports System.IO -Imports System.Xml -Imports System.Xml.Xsl -Imports System.Xml.XPath -Imports System.Text - -Public Class sample - - Public Shared Sub Main() - Dim Doc As New XPathDocument("books.xml") - Dim nav As XPathNavigator = Doc.CreateNavigator() - Dim Iterator As XPathNodeIterator = nav.Select("/bookstore/book") - - Dim arg As New XsltArgumentList() - arg.AddParam("param1", "", Iterator) - - Dim xslt As New XslTransform() - xslt.Load("test.xsl") - - Dim xd As New XPathDocument("test.xml") - - Dim strmTemp = New FileStream("out.xml", FileMode.Create, FileAccess.ReadWrite) - xslt.Transform(xd, arg, strmTemp, Nothing) - End Sub 'Main -End Class 'sample -``` - -```csharp -using System; -using System.IO; -using System.Xml; -using System.Xml.Xsl; -using System.Xml.XPath; -using System.Text; - -public class sample -{ - public static void Main() - { - XPathDocument Doc = new XPathDocument("books.xml"); - XPathNavigator nav = Doc.CreateNavigator(); - XPathNodeIterator Iterator = nav.Select("/bookstore/book"); - - XsltArgumentList arg = new XsltArgumentList(); - arg.AddParam("param1", "", Iterator); - - XslTransform xslt = new XslTransform(); - xslt.Load("test.xsl"); - - XPathDocument xd = new XPathDocument("test.xml"); - - Stream strmTemp = new FileStream("out.xml", FileMode.Create, FileAccess.ReadWrite); - xslt.Transform(xd, arg, strmTemp, null); - } -} -``` - -## books.xml - -```xml - - - - - Seven Years in Trenton - - Jay - Adams - Trenton Literary Review Honorable Mention - USA - - 12 - - - History of Trenton - - Kim - Akers - - Selected Short Stories of - Scott - Bishop - US - - - 55 - - -``` - -## test.xsl - -```xml - - - - - - - - - <xsl:value-of select="."/> - - - - - -``` - -## test.xml - -```xml -this is a test -``` - -## Output (out.xml) - -```xml - - - Seven Years in Trenton - History of Trenton - -``` - -## See also - -- [XslTransform Class Implements the XSLT Processor](xsltransform-class-implements-the-xslt-processor.md) diff --git a/docs/standard/data/xml/xslt-stylesheet-scripting-using-msxsl-script.md b/docs/standard/data/xml/xslt-stylesheet-scripting-using-msxsl-script.md deleted file mode 100644 index 7b166c4bef2c9..0000000000000 --- a/docs/standard/data/xml/xslt-stylesheet-scripting-using-msxsl-script.md +++ /dev/null @@ -1,231 +0,0 @@ ---- -description: "Learn more about: XSLT Stylesheet Scripting Using " -title: "XSLT Stylesheet Scripting Using " -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -ms.assetid: 60e2541b-0cea-4b2e-a4fa-85f4c50f1bef ---- -# XSLT Stylesheet Scripting Using \ - -The class supports embedded scripting using the `script` element. - -> [!NOTE] -> The class is obsolete in the .NET Framework 2.0. You can perform Extensible Stylesheet Language for Transformations (XSLT) transformations using the class. See [Using the XslCompiledTransform Class](using-the-xslcompiledtransform-class.md) and [Migrating From the XslTransform Class](migrating-from-the-xsltransform-class.md) for more information. - - The class supports embedded scripting using the `script` element. When the style sheet is loaded, any defined functions are compiled to Microsoft intermediate language (MSIL) by being wrapped in a class definition and have no performance loss as a result. - - The `` element is defined below: - -```xml - -``` - - where `msxsl` is a prefix bound to the namespace `urn:schemas-microsoft-com:xslt`. - - The `language` attribute is not mandatory, but if specified, its value must be one of the following: `C#`, `VB`, `JScript`, `JavaScript`, `VisualBasic`, or `CSharp`. If not specified, the language defaults to JScript. The `language-name` is not case-sensitive, so 'JavaScript' and 'javascript' are equivalent. - - The `implements-prefix` attribute is mandatory. This attribute is used to declare a namespace and associate it with the script block. The value of this attribute is the prefix that represents the namespace. This namespace can be defined somewhere in a style sheet. - - Because the `msxsl:script` element belongs to the namespace `urn:schemas-microsoft-com:xslt`, the style sheet must include the namespace declaration `xmlns:msxsl=urn:schemas-microsoft-com:xslt`. - - If the caller of the script does not have access permission, then the script in a style sheet will never compile and the call to will fail. - - If the caller has `UnmanagedCode` permission, the script compiles, but the operations that are allowed are dependent on the evidence that is supplied at load time. - - If you are using one of the methods that take an or to load the style sheet, you need to use the overload that takes an parameter as one of its arguments. To provide evidence, the caller must have permission to supply `Evidence` for the script assembly. If the caller does not have this permission, then they can set the `Evidence` parameter to `null`. This causes the function to fail if it finds script. The `ControlEvidence` permission is considered a very powerful permission that should only be granted to highly trusted code. - - To get the evidence from your assembly, use `this.GetType().Assembly.Evidence`. To get the evidence from a Uniform Resource Identifier (URI), use `Evidence e = XmlSecureResolver.CreateEvidenceForUrl(stylesheetURI)`. - - If you use methods that take an but no `Evidence`, the security zone for the assembly defaults to Full Trust. For more information, see and [Named Permission Sets](/previous-versions/dotnet/netframework-4.0/4652tyx7(v=vs.100)). - - Functions can be declared within the `msxsl:script` element. The following table shows the namespaces that are supported by default. You can use classes outside the listed namespaces. However, these classes must be fully qualified. - -|Default Namespaces|Description| -|------------------------|-----------------| -|System|System class.| -|System.Collection|Collection classes.| -|System.Text|Text classes.| -|System.Text.RegularExpressions|Regular expression classes.| -|System.Xml|Core XML classes.| -|System.Xml.Xsl|XSLT classes.| -|System.Xml.XPath|XML Path Language (XPath) classes.| -|Microsoft.VisualBasic|Classes for Microsoft Visual Basic scripts.| - - When a function is declared, it is contained in a script block. Style sheets can contain multiple script blocks, each operating independent of the other. That means that if you are executing inside a script block, you cannot call a function that you defined in another script block unless it is declared to have the same namespace and the same scripting language. Because each script block can be in its own language, and the block is parsed according to the grammar rules of that language parser, you must use the correct syntax for the language in use. For example, if you are in a C# script block, then it is an error to use an XML comment node `` in the block. - - The supplied arguments and return values defined by the script functions must be one of the World Wide Web Consortium (W3C) XPath or XSLT types. The following table shows the corresponding W3C types, the equivalent .NET Framework classes (Type), and whether the W3C type is an XPath type or XSLT type. - -|Type|Equivalent .NET Framework Class (Type)|XPath type or XSLT type| -|----------|----------------------------------------------|-----------------------------| -|String|System.String|XPath| -|Boolean|System.Boolean|XPath| -|Number|System.Double|XPath| -|Result Tree Fragment|System.Xml.XPath.XPathNavigator|XSLT| -|Node Set|System.Xml.XPath.XPathNodeIterator|XPath| - - If the script function utilizes one of the following numeric types: Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, or Decimal, they are forced to Double, which maps to the W3C XPath type number. All other types are forced to a string by calling the `ToString` method. - - If the script function utilizes a type other than the ones mentioned above, or if the function does not compile when the style sheet is loaded into the object, an exception is thrown. - - When using the `msxsl:script` element, it is highly recommended that the script, regardless of language, be placed inside a CDATA section. For example, the following XML shows the template of the CDATA section where your code is placed. - -```xml - - - -``` - - It is highly recommended that all script content be placed in a CDATA section, because operators, identifiers, or delimiters for a given language have the potential of being misinterpreted as XML. The following example shows the use of the logical AND operator in script. - -```xml - - public string book(string abc, string xyz) - { - if ((abc == bar) && (abc == xyz)) return bar + xyz; - else return null; - } - -``` - - This throws an exception because the ampersands are not escaped. The document is loaded as XML, and no special treatment is applied to the text between the `msxsl:script` element tags. - -## Example - - The following example uses an embedded script to calculate the circumference of a circle given its radius. - -```vb -Imports System -Imports System.IO -Imports System.Xml -Imports System.Xml.XPath -Imports System.Xml.Xsl - -Public Class Sample - - Private Const filename As String = "number.xml" - Private Const stylesheet As String = "calc.xsl" - - Public Shared Sub Main() - - 'Create the XslTransform and load the style sheet. - Dim xslt As XslTransform = New XslTransform - xslt.Load(stylesheet) - - 'Load the XML data file. - Dim doc As XPathDocument = New XPathDocument(filename) - - 'Create an XmlTextWriter to output to the console. - Dim writer As XmlTextWriter = New XmlTextWriter(Console.Out) - writer.Formatting = Formatting.Indented - - 'Transform the file. - xslt.Transform(doc, Nothing, writer, Nothing) - writer.Close() - End Sub -End Class -``` - -```csharp -using System; -using System.IO; -using System.Xml; -using System.Xml.XPath; -using System.Xml.Xsl; - -public class Sample -{ - private const String filename = "number.xml"; - private const String stylesheet = "calc.xsl"; - - public static void Main() - { - //Create the XslTransform and load the style sheet. - XslTransform xslt = new XslTransform(); - xslt.Load(stylesheet); - - //Load the XML data file. - XPathDocument doc = new XPathDocument(filename); - - //Create an XmlTextWriter to output to the console. - XmlTextWriter writer = new XmlTextWriter(Console.Out); - writer.Formatting = Formatting.Indented; - - //Transform the file. - xslt.Transform(doc, null, writer, null); - writer.Close(); - } -} -``` - -## Input - - number.xml - -```xml - - - - 12 - - - 37.5 - - -``` - - calc.xsl - -```xml - - - - - - - - - - - - - - - - - - - - -``` - -## Output - -```xml - - - 12 - 75.36 - - - 37.5 - 235.5 - - -``` - -## See also - -- [XslTransform Class Implements the XSLT Processor](xsltransform-class-implements-the-xslt-processor.md) diff --git a/docs/standard/data/xml/xslt-transformations-over-different-stores.md b/docs/standard/data/xml/xslt-transformations-over-different-stores.md deleted file mode 100644 index 56609a0f495a3..0000000000000 --- a/docs/standard/data/xml/xslt-transformations-over-different-stores.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -description: "Learn more about: XSLT Transformations Over Different Stores" -title: "XSLT Transformations Over Different Stores" -ms.date: "03/30/2017" -ms.assetid: 369850e9-004a-45d2-b5c3-5060d9135adb ---- -# XSLT Transformations Over Different Stores - -> [!NOTE] -> The class is obsolete in the .NET Framework 2.0. You can perform Extensible Stylesheet Language for Transformations (XSLT) transformations using the class. See [Using the XslCompiledTransform Class](using-the-xslcompiledtransform-class.md) and [Migrating From the XslTransform Class](migrating-from-the-xsltransform-class.md) for more information. - - The ADO.NET and the XML classes in the .NET Framework provide a unified programming model to access data. That data is represented as both XML data, which is text delimited by tags, and relational data, which is tables consisting of rows and columns. The XML in the .NET Framework reads XML data from any data stream into XML Document Object Model (DOM) node trees, where data can be accessed programmatically, while ADO.NET provides the means to access and manipulate relational data within a object. - - The XML DOM provides access to data in XML documents and additional classes to read, write, and navigate in XML documents. These classes are supported in the namespace, which also unifies the XML DOM with the data access services provided by ADO.NET. The provides relational access to data. The maps XML to relational data in an ADO.NET . Any .NET Framework-based application can use the classes in the namespace to access and manipulate both XML documents and relational data in the . This implementation supports n-tiered architectures for collecting and distributing data. For more information, see [XML Integration with Relational Data and ADO.NET](xml-integration-with-relational-data-and-adonet.md). - -## See also - -- [XslTransform Class Implements the XSLT Processor](xsltransform-class-implements-the-xslt-processor.md) diff --git a/docs/standard/data/xml/xslt-transformations-with-the-xsltransform-class.md b/docs/standard/data/xml/xslt-transformations-with-the-xsltransform-class.md deleted file mode 100644 index 118a7907795b3..0000000000000 --- a/docs/standard/data/xml/xslt-transformations-with-the-xsltransform-class.md +++ /dev/null @@ -1,98 +0,0 @@ ---- -description: "Learn more about: XSLT Transformations with the XslTransform Class" -title: "XSLT Transformations with the XslTransform Class" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -ms.assetid: 500335af-f9b5-413b-968a-e6d9a824478c ---- -# XSLT Transformations with the XslTransform Class - -> [!NOTE] -> The class is obsolete in the .NET Framework 2.0. You can perform Extensible Stylesheet Language for Transformations (XSLT) transformations using the class. See [Using the XslCompiledTransform Class](using-the-xslcompiledtransform-class.md) and [Migrating From the XslTransform Class](migrating-from-the-xsltransform-class.md) for more information. - -The goal of the XSLT is to transform the content of a source XML document into another document that is different in format or structure (for example, to transform XML into HTML for use on a Web site or to transform it into a document that contains only the fields required by an application). This transformation process is specified by the World Wide Web Consortium (W3C)[XSLT version 1.0 recommendation](https://www.w3.org/TR/1999/REC-xslt-19991116). In the .NET Framework, the class, found in the namespace, is the XSLT processor that implements the functionality of this specification. There are a small number of features that have not been implemented from the W3C XSLT 1.0 recommendation, listed in [Outputs from an XslTransform](outputs-from-an-xsltransform.md). The following figure shows the transformation architecture of the .NET Framework. - -## Overview - -![Diagram that shows the XSLT transformation architecture.](./media/xslt-transformations-with-the-xsltransform-class/xslt-transformation-architecture.gif) - -The XSLT recommendation uses XML Path Language (XPath) to select parts of an XML document, where XPath is a query language used to navigate nodes of a document tree. As shown in the diagram, the .NET Framework implementation of XPath is used to select parts of XML stored in several classes, such as an , an , and an . An is an optimized XSLT data store, and when used with , it provides XSLT transformations with good performance. - -The following table list commonly uses classes when working with and XPath and their function. - -|Class or Interface|Function| -|------------------------|--------------| -||It is an API that provides a cursor style model for navigating over a store, along with XPath query support. It does not provide editing of the underlying store. For editing, use the class.| -||It is an interface that provides a `CreateNavigator` method to an for the store.| -||It enables editing of this document. It implements , allowing document-editing scenarios where XSLT transformations are subsequently required. For more information, see [XmlDocument Input to XslTransform](xmldocument-input-to-xsltransform.md).| -||It is derived from the . It bridges the relational and XML worlds by using a to optimize storage of structured data within the XML document according to specified mappings on the . It implements , allowing scenarios where XSLT transformations can be performed over relational data retrieved from a database. For more information, see [XML Integration with Relational Data and ADO.NET](xml-integration-with-relational-data-and-adonet.md).| -||This class is optimized for processing and XPath queries, and it provides a read-only high performance cache. It implements and is the preferred store to use for XSLT transformations.| -||It provides navigation over XPath node sets. All XPath selection methods on the return an . Multiple objects can be created over the same store, each representing a selected set of nodes.| - -## MSXML XSLT Extensions - -The `msxsl:script` and `msxsl:node-set` functions are the only Microsoft XML Core Services (MSXML) XSLT extensions supported by the class. - -## Example - -The following code example loads an XSLT style sheet, reads a file called mydata.xml into an , and performs a transformation on the data on a fictitious file called myStyleSheet.xsl, sending the formatted output to the console. - -```vb -Imports System.IO -Imports System.Xml -Imports System.Xml.XPath -Imports System.Xml.Xsl - -Public Class Sample - Private filename As [String] = "mydata.xml" - Private stylesheet As [String] = "myStyleSheet.xsl" - - Public Shared Sub Main() - Dim xslt As New XslTransform() - xslt.Load(stylesheet) - Dim xpathdocument As New XPathDocument(filename) - Dim writer As New XmlTextWriter(Console.Out) - writer.Formatting = Formatting.Indented - - xslt.Transform(xpathdocument, Nothing, writer, Nothing) - End Sub 'Main -End Class 'Sample -``` - -```csharp -using System; -using System.IO; -using System.Xml; -using System.Xml.XPath; -using System.Xml.Xsl; - -public class Sample -{ - private const String filename = "mydata.xml"; - private const String stylesheet = "myStyleSheet.xsl"; - - public static void Main() - { - XslTransform xslt = new XslTransform(); - xslt.Load(stylesheet); - XPathDocument xpathdocument = new XPathDocument(filename); - XmlTextWriter writer = new XmlTextWriter(Console.Out); - writer.Formatting = Formatting.Indented; - - xslt.Transform(xpathdocument, null, writer, null); - } -} -``` - -## See also - -- -- [XslTransform Class Implements the XSLT Processor](xsltransform-class-implements-the-xslt-processor.md) -- [Implementation of Discretionary Behaviors in the XslTransform Class](implementation-of-discretionary-behaviors-in-the-xsltransform-class.md) -- [XPathNavigator in Transformations](xpathnavigator-in-transformations.md) -- [XPathNodeIterator in Transformations](xpathnodeiterator-in-transformations.md) -- [XPathDocument Input to XslTransform](xpathdocument-input-to-xsltransform.md) -- [XmlDataDocument Input to XslTransform](xmldatadocument-input-to-xsltransform.md) -- [XmlDocument Input to XslTransform](xmldocument-input-to-xsltransform.md) diff --git a/docs/standard/data/xml/xsltargumentlist-for-style-sheet-parameters-and-extension-objects.md b/docs/standard/data/xml/xsltargumentlist-for-style-sheet-parameters-and-extension-objects.md deleted file mode 100644 index 922404c39405d..0000000000000 --- a/docs/standard/data/xml/xsltargumentlist-for-style-sheet-parameters-and-extension-objects.md +++ /dev/null @@ -1,369 +0,0 @@ ---- -description: "Learn more about: XsltArgumentList for Style Sheet Parameters and Extension Objects" -title: "XsltArgumentList for Style Sheet Parameters and Extension Objects" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -ms.assetid: de2f0dce-6b98-4908-bba7-ed150cc50355 ---- -# XsltArgumentList for Style Sheet Parameters and Extension Objects - -The class contains Extensible Stylesheet Language for Transformations (XSLT) parameters and XSLT extension objects. When passed into the method, these parameters and extension objects can be invoked from style sheets. - -> [!NOTE] -> The and classes are obsolete in the .NET Framework 2.0. You can perform XSLT transformations using the class. See [Using the XslCompiledTransform Class](using-the-xslcompiledtransform-class.md) and [Migrating From the XslTransform Class](migrating-from-the-xsltransform-class.md) for more information. - - The class contains XSLT parameters and XSLT extension objects. When passed into the method, these parameters and extension objects can be invoked from style sheets. - - The following are advantages to passing an object rather than using an embedded script: - -- Provides better encapsulation and reuse of classes. - -- Allows style sheets to be smaller and more maintainable. - -- Supports calling methods on classes belonging to namespaces other than those defined within the set of supported namespaces. - -- Supports passing result tree fragments to the style sheet with the use of the . - -## XSLT Style Sheet Parameters - - XSLT parameters are added to the using the method. A qualified name and namespace Uniform Resource Identifier (URI) are associated with the parameter object at that time. - - The parameter object should correspond to a World Wide Web Consortium (W3C) type. The following table shows the corresponding W3C types, the equivalent .NET Framework classes (type), and whether the W3C type is an XML Path Language (XPath) type or XSLT type. - -|W3C Type|Equivalent .NET Framework class (type)|XPath type or XSLT type| -|--------------|----------------------------------------------|-----------------------------| -|String|System.String|XPath| -|Boolean|System.Boolean|XPath| -|Number|System.Double|XPath| -|Result Tree Fragment|System.Xml.XPath.XPathNavigator|XSLT| -|Node Set|System.Xml.XPath.XPathNodeIterator|XPath| - - If the parameter object is not one of the above classes, it is forced to either a Double or String, as appropriate. Int16, UInt16, Int32, UInt32, Int64, UInt64, Single and Decimal types are forced to a Double. All other types are forced to a String using the `ToString` method. - -#### To use the XSLT parameter, the user needs to do the following: - -1. Create an and add the objects using . - -2. Call the parameters from the style sheet. - -3. Pass the to the method. - -### Example - - The following example uses the method to create a parameter to hold a calculated discount date. The discount date is calculated to be 20 days from the order date. - -```vb -Imports System -Imports System.IO -Imports System.Xml -Imports System.Xml.XPath -Imports System.Xml.Xsl - -Public class Sample - - Private Const filename As String = "order.xml" - Private Const stylesheet As String = "discount.xsl" - - Public Shared Sub Main() - - 'Create the XslTransform and load the style sheet. - Dim xslt As XslTransform = New XslTransform - xslt.Load(stylesheet) - - 'Load the XML data file. - Dim doc As XPathDocument = New XPathDocument(filename) - - 'Create an XsltArgumentList. - Dim xslArg As XsltArgumentList = New XsltArgumentList - - 'Calculate the discount date. - Dim today As DateTime = DateTime.Now - Dim d As DateTime = today.AddDays(20) - xslArg.AddParam("discount", "", d.ToString()) - - 'Create an XmlTextWriter to handle the output. - Dim writer As XmlTextWriter = New XmlTextWriter("orderout.xml", Nothing) - - 'Transform the file. - xslt.Transform(doc, xslArg, writer, Nothing) - - writer.Close() - - End Sub -End Class -``` - -```csharp -using System; -using System.IO; -using System.Xml; -using System.Xml.XPath; -using System.Xml.Xsl; - -public class Sample -{ - private const String filename = "order.xml"; - private const String stylesheet = "discount.xsl"; - - public static void Main() { - - //Create the XslTransform and load the style sheet. - XslTransform xslt = new XslTransform(); - xslt.Load(stylesheet); - - //Load the XML data file. - XPathDocument doc = new XPathDocument(filename); - - //Create an XsltArgumentList. - XsltArgumentList xslArg = new XsltArgumentList(); - - //Calculate the discount date. - DateTime today = DateTime.Now; - DateTime d = today.AddDays(20); - xslArg.AddParam("discount", "", d.ToString()); - - //Create an XmlTextWriter to handle the output. - XmlTextWriter writer = new XmlTextWriter("orderout.xml", null); - - //Transform the file. - xslt.Transform(doc, xslArg, writer, null); - writer.Close(); - } -} -``` - -### Input - - order.xml - -```xml - - - - The Handmaid's Tale - 19.95 - - - Americana - 16.95 - - -``` - - discount.xsl - -```xml - - - - - - - 15% discount if paid by: - - - -``` - -### Output - -```xml - - 36.9 - 15% discount if paid by: 5/6/2001 5:01:15 PM - -``` - -## XSLT Extension Objects - - XSLT extension objects are added to the using the method. A qualified name and namespace URI are associated with the extension object at that time. - - When an object is added, the caller of the must be fully trusted in the security policy. If the caller is semi-trusted, the addition will fail. - - Though an object is added successfully, it does not guarantee that the execution will be successful. When the method is called, permissions are calculated against the evidence provided at time, and that permission set is assigned to the entire transformation process. If an extension object attempts to initiate an action that requires permissions not found in the set, an exception is thrown. - - The data types returned from extension objects are one of the four basic XPath data types of number, string, Boolean, and node set. - -#### To use the XSLT extension object, the user needs to do the following: - -1. Create an and add the extension object using . - -2. Invoke the extension object from the style sheet. - -3. Pass the to the method. - -### Example - - The following example calculates the circumference of a circle given its radius. - -```vb -Imports System -Imports System.IO -Imports System.Xml -Imports System.Xml.XPath -Imports System.Xml.Xsl - -Public Class Sample - Private Const filename As String = "number.xml" - Private Const stylesheet As String = "circle.xsl" - - Public Shared Sub Main() - Dim test As Sample = New Sample - End Sub - - Public Sub New() - 'Create the XslTransform and load the style sheet. - Dim xslt As XslTransform = New XslTransform - xslt.Load(stylesheet) - - 'Load the XML data file. - Dim doc As XPathDocument = New XPathDocument(filename) - - 'Create an XsltArgumentList. - Dim xslArg As XsltArgumentList = New XsltArgumentList - - 'Add an object to calculate the circumference of the circle. - Dim obj As Calculate = New Calculate - xslArg.AddExtensionObject("urn:myObj", obj) - - 'Create an XmlTextWriter to output to the console. - Dim writer As XmlTextWriter = New XmlTextWriter(Console.Out) - - 'Transform the file. - xslt.Transform(doc, xslArg, writer, Nothing) - writer.Close() - - End Sub - - 'Calculates the circumference of a circle given the radius. - Public Class Calculate - - Private circ As double = 0 - - Public Function Circumference(radius As Double) As Double - circ = Math.PI*2*radius - Return circ - End Function - End Class -End Class -``` - -```csharp -using System; -using System.IO; -using System.Xml; -using System.Xml.XPath; -using System.Xml.Xsl; - -public class Sample -{ - private const String filename = "number.xml"; - private const String stylesheet = "circle.xsl"; - - public static void Main() { - - Sample test = new Sample(); - } - - public Sample() { - - //Create the XslTransform and load the style sheet. - XslTransform xslt = new XslTransform(); - xslt.Load(stylesheet); - - //Load the XML data file. - XPathDocument doc = new XPathDocument(filename); - - //Create an XsltArgumentList. - XsltArgumentList xslArg = new XsltArgumentList(); - - //Add an object to calculate the circumference of the circle. - Calculate obj = new Calculate(); - xslArg.AddExtensionObject("urn:myObj", obj); - - //Create an XmlTextWriter to output to the console. - XmlTextWriter writer = new XmlTextWriter(Console.Out); - - //Transform the file. - xslt.Transform(doc, xslArg, writer, null); - writer.Close(); - - } - - //Calculates the circumference of a circle given the radius. - public class Calculate { - - private double circ = 0; - - public double Circumference(double radius){ - circ = Math.PI*2*radius; - return circ; - } - } -} -``` - -### Input - - number.xml - -```xml - - - - 12 - - - 37.5 - - -``` - - circle.xsl - -```xml - - - - - - - - - - - - - - - -``` - -### Output - - `` - - `` - - `12` - - `75.398223686155` - - `` - - `` - - `37.5` - - `235.61944901923448` - - `` - - `` - -## See also - -- [XslTransform Class Implements the XSLT Processor](xsltransform-class-implements-the-xslt-processor.md) diff --git a/docs/standard/data/xml/xsltransform-class-implements-the-xslt-processor.md b/docs/standard/data/xml/xsltransform-class-implements-the-xslt-processor.md deleted file mode 100644 index f5eff42a3539c..0000000000000 --- a/docs/standard/data/xml/xsltransform-class-implements-the-xslt-processor.md +++ /dev/null @@ -1,240 +0,0 @@ ---- -description: "Learn more about: XslTransform Class Implements the XSLT Processor" -title: "XslTransform Class Implements the XSLT Processor" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -ms.assetid: 88373fe2-4a6b-44f9-8a62-8a3e348e3a46 ---- -# XslTransform Class Implements the XSLT Processor - -> [!NOTE] -> The class is obsolete in the .NET Framework 2.0. You can perform Extensible Stylesheet Language for Transformations (XSLT) transformations using the class. See [Using the XslCompiledTransform Class](using-the-xslcompiledtransform-class.md) and [Migrating From the XslTransform Class](migrating-from-the-xsltransform-class.md) for more information. - -The class is an XSLT processor implementing the XSL Transformations (XSLT) Version 1.0 recommendation. The method locates and reads style sheets, and the method transforms the given source document. Any store that implements the interface can be used as the source document for the . The .NET Framework currently implements the interface on the , the , and the , so all of these can be used as the input source document to a transformation. - -The object in the .NET Framework only supports the XSLT 1.0 specification, defined with the following namespace: - -```xml - -``` - -The style sheet can be loaded, using the method, from one of the following classes: - -- XPathNavigator - -- XmlReader - -- A string representing a URL - -There is a different method for each of the above input classes. Some methods take in a combination of one of these classes and the class as arguments. The locates resources referenced by `` or `` found in the style sheet. The following methods take a string, , or as input. - -```vb -Overloads Public Sub Load(String) -``` - -```csharp -public void Load(string); -``` - -```vb -Overloads Public Sub Load(String, XmlResolver) -``` - -```csharp -public void Load(string, XmlResolver); -``` - -```vb -Overloads Public Sub Load(XmlReader, XmlResolver, Evidence) -``` - -```csharp -public void Load(XmlReader, XmlResolver, Evidence); -``` - -```vb -Overloads Public Sub Load(XPathNavigator, XmlResolver, Evidence) -``` - -```csharp -public void Load(XPathNavigator, XmlResolver, Evidence); -``` - -Most of the methods shown above take an as a parameter. The is used to load the style sheet and any style sheet(s) referenced in xsl:import and xsl:include elements. - -Most of the methods also take evidence as a parameter. The evidence parameter is the that is associated with the style sheet. The security level of the style sheet affects the security level of any subsequent resources it references, such as the script it contains, any `document()` functions it uses, and any extension objects used by the . - -If the style sheet is loaded using a method that contains a URL parameter and no evidence is provided, the evidence of the style sheet is calculated by combining the given URL with its site and zone. - -If no URI or evidence is provided, then the evidence set for the style sheet is fully trusted. Do not load style sheets from untrusted sources, or add untrusted extension objects into the . - -For more information about security levels and evidence and how it affects scripting, see [XSLT Stylesheet Scripting Using \](xslt-stylesheet-scripting-using-msxsl-script.md). For information about security levels and evidence and how it affects extension objects, see [XsltArgumentList for Style Sheet Parameters and Extension Objects](xsltargumentlist-for-style-sheet-parameters-and-extension-objects.md). - -For information about security levels and evidence and how it affects the `document()` function, see [Resolving External XSLT Style Sheets and Documents](resolving-external-xslt-style-sheets-and-documents.md). - -A style sheet can be supplied with a number of input parameters. The style sheet can also call functions on extension objects. Both parameters and extension objects are supplied to the style sheet using the class. For more information about the , see . - -## Recommended Secure Use of XslTransform Class - -The security privileges of the style sheet depend on the evidence provided. The following table summarizes the location of the style sheet and gives an explanation of what type of evidence to give. - -- The XSLT style sheet has no external references, or the style sheet comes from a code base that you trust. - - - Provide the evidence from your assembly: - - ```vb - Dim xslt = New XslTransform() xslt.Load(stylesheet, resolver, Me.GetType().Assembly.Evidence) - - XsltTransform xslt = new XslTransform(); xslt.Load(stylesheet, resolver, this.GetType().Assembly.Evidence); - ``` - -- The XSLT style sheet comes from an outside source. The origin of the source is known and there is a verifiable URI. - - - Create evidence using the URI. - - ```vb - Dim xslt As New XslTransform() Dim ev As Evidence = XmlSecureResolver.CreateEvidenceForUrl(stylesheetUri) xslt.Load(stylesheet, resolver, evidence) - - XslTransform xslt = new XslTransform(); Evidence ev = XmlSecureResolver.CreateEvidenceForUrl(stylesheetUri); xslt.Load(stylesheet, resolver, evidence); - ``` - -- The XSLT style sheet comes from an outside source. The origin of the source is not known. - - - Set evidence to `null`. Script blocks are not processed, the XSLT `document()` function is not supported, and privileged extension objects are disallowed. - - Additionally, you can also set the `resolver` parameter to `null` This ensures that `xsl:import` and `xsl:include` elements are not processed. - -- The XSLT style sheet comes from an outside source. The origin of the source is not known, but you require script support. - - - Request evidence from the caller. - -## Transformation of XML Data - -Once a style sheet is loaded, the transformation starts by calling one of the methods and supplying an input source document. The method is overloaded to provide different transformation outputs. The transformation can result in the following output formats: - -- - -- - -- - -- - -- String URL of file - -This last format, the string URL, provides for a commonly used scenario in transforming an input document located in a URL and writing the document to the output URL. This method is a convenience method to load an XML document from a file, perform the XSLT transformation, and write the output to a file. This prevents you from having to create and load the input source document, and then write to a file stream. The following code sample shows this use of the method using the string URL as input and output: - -```vb -Dim xsltransform As XslTransform = New XslTransform() -xsltransform.Load("favorite.xsl") -xsltransform.Transform("MyDocument.Xml", "TransformResult.xml", Nothing) -``` - -```csharp -XslTransform xsltransform = new XslTransform(); -xsltransform.Load("favorite.xsl"); -xsltransform.Transform("MyDocument.xml", "TransformResult.xml", null); -``` - -## Transforming a Section of an XML Document - -Transformations apply to the document as a whole. In other words, if you pass in a node other than the document root node, this does not prevent the transformation process from accessing all nodes in the loaded document. To transform a result tree fragment, you must create an containing just the result tree fragment and pass that to the method. The following example performs a transformation on a result tree fragment. - -```vb -Dim xslt As New XslTransform() -xslt.Load("print_root.xsl") -Dim doc As New XmlDocument() -doc.Load("library.xml") -' Create a new document containing just the result tree fragment. -Dim testNode As XmlNode = doc.DocumentElement.FirstChild -Dim tmpDoc As New XmlDocument() -tmpDoc.LoadXml(testNode.OuterXml) -' Pass the document containing the result tree fragment -' to the Transform method. -Console.WriteLine(("Passing " + tmpDoc.OuterXml + " to print_root.xsl")) -xslt.Transform(tmpDoc, Nothing, Console.Out, Nothing) -``` - -```csharp -XslTransform xslt = new XslTransform(); -xslt.Load("print_root.xsl"); -XmlDocument doc = new XmlDocument(); -doc.Load("library.xml"); -// Create a new document containing just the result tree fragment. -XmlNode testNode = doc.DocumentElement.FirstChild; -XmlDocument tmpDoc = new XmlDocument(); -tmpDoc.LoadXml(testNode.OuterXml); -// Pass the document containing the result tree fragment -// to the Transform method. -Console.WriteLine("Passing " + tmpDoc.OuterXml + " to print_root.xsl"); -xslt.Transform(tmpDoc, null, Console.Out, null); -``` - -The example uses the library.xml and print_root.xsl files as input and outputs the following to the console: - -```console -Passing Pride And Prejudice to print_root.xsl -Root node is book. -``` - -library.xml - -```xml - - - Pride And Prejudice - - - Hook - - -``` - -print_root.xsl - -```xml - - - - -``` - -## Migration of XSLT from .NET Framework version 1.0 to .NET Framework version 1.1 - -The following table shows the obsolete .NET Framework version 1.0 methods and new .NET Framework version 1.1 methods for the method. The new methods enable you to limit the permissions of the style sheet by specifying evidence. - -|Obsolete .NET Framework version 1.0 Load Methods|Replacement .NET Framework version 1.1 Load Methods| -|------------------------------------------------------|---------------------------------------------------------| -|Load(XPathNavigator input);

Load(XPathNavigator input, XmlResolver resolver);|Load(XPathNavigator stylesheet, XmlResolver resolver, Evidence evidence);| -|Load(IXPathNavigable stylesheet);

Load(IXPathNavigable stylesheet, XmlResolver resolver);|Load(IXPathNavigable stylesheet, XmlResolver resolver, Evidence evidence);| -|Load(XmlReader stylesheet);

Load(XmlReader stylesheet, XmlResolver resolver);|Load(XmlReader stylesheet, XmlResolver resolver, Evidence evidence);| - -The following table shows the obsolete and new methods for the method. The new methods take an object. - -|Obsolete .NET Framework version 1.0 Transform Methods|Replacement .NET Framework version Transform 1.1 Methods| -|-----------------------------------------------------------|--------------------------------------------------------------| -|XmlReader Transform(XPathNavigator input, XsltArgumentList args)|XmlReader Transform(XPathNavigator input, XsltArgumentList args, XmlResolver resolver)| -|XmlReader Transform(IXPathNavigable input, XsltArgumentList args)|XmlReader Transform(IXPathNavigable input, XsltArgumentList args, XmlResolver resolver)| -|Void Transform(XPathNavigator input, XsltArgumentList args, XmlWriter output)|Void Transform(XPathNavigator input, XsltArgumentList args, XmlWriter output, XmlResolver resolver)| -|Void Transform(IXPathNavigable input, XsltArgumentList args, XmlWriter output)|Void Transform(IXpathNavigable input, XsltArgumentList args, XmlWriter output, XmlResolver resolver)| -|Void Transform(XPathNavigator input, XsltArgumentList args, TextWriter output)|Void Transform(XPathNavigator input, XsltArgumentList args, TextWriter output, XmlResolver resolver)| -|Void Transform(IXPathNavigable input, XsltArgumentList args, TextWriter output)|Void Transform(IXPathNavigable input, XsltArgumentList args, TextWriter output, XmlResolver resolver)| -|Void Transform(XPathNavigator input, XsltArgumentList args, Stream output)|Void Transform(XPathNavigator input, XsltArgumentList args, Stream output, XmlResolver resolver)| -|Void Transform(IXPathNavigable input, XsltArgumentList args, Stream output)|Void Transform(IXPathNavigable input, XsltArgumentList args, Stream output, XmlResolver resolver)| -|Void Transform(String input, String output);|Void Transform(String input, String output, XmlResolver resolver);| - -The property is obsolete in .NET Framework version 1.1. Instead, use the new overloads which take an object. - -## See also - -- -- [XSLT Transformations with the XslTransform Class](xslt-transformations-with-the-xsltransform-class.md) -- [XPathNavigator in Transformations](xpathnavigator-in-transformations.md) -- [XPathNodeIterator in Transformations](xpathnodeiterator-in-transformations.md) -- [XPathDocument Input to XslTransform](xpathdocument-input-to-xsltransform.md) -- [XmlDataDocument Input to XslTransform](xmldatadocument-input-to-xsltransform.md) -- [XmlDocument Input to XslTransform](xmldocument-input-to-xsltransform.md) From 486aa2266bd63187ef19d3fb91bca62cd6a82148 Mon Sep 17 00:00:00 2001 From: Benjamin Michaelis Date: Thu, 17 Jun 2021 06:33:50 -0700 Subject: [PATCH 036/105] Fix northwnd typo (#24700) Northwnd to northwind --- .../DLinqOverrideDefaultSproc/cs/northwind.cs | 16 ++++++++-------- .../DLinqOverrideDefaultSproc/vb/Module1.vb | 2 +- .../DLinqOverrideDefaultSproc/vb/northwind.vb | 6 +++--- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/samples/snippets/csharp/VS_Snippets_Data/DLinqOverrideDefaultSproc/cs/northwind.cs b/samples/snippets/csharp/VS_Snippets_Data/DLinqOverrideDefaultSproc/cs/northwind.cs index 79e3ab2a5ee39..e9ad24aa036b3 100644 --- a/samples/snippets/csharp/VS_Snippets_Data/DLinqOverrideDefaultSproc/cs/northwind.cs +++ b/samples/snippets/csharp/VS_Snippets_Data/DLinqOverrideDefaultSproc/cs/northwind.cs @@ -20,8 +20,8 @@ -[System.Data.Linq.Mapping.DatabaseAttribute(Name="northwnd")] -public partial class Northwnd : System.Data.Linq.DataContext +[System.Data.Linq.Mapping.DatabaseAttribute(Name="northwind")] +public partial class Northwind : System.Data.Linq.DataContext { private static System.Data.Linq.Mapping.MappingSource mappingSource = new AttributeMappingSource(); @@ -69,29 +69,29 @@ public partial class Northwnd : System.Data.Linq.DataContext partial void DeleteTerritory(Territory instance); #endregion - static Northwnd() + static Northwind() { } - public Northwnd(string connection) : + public Northwind(string connection) : base(connection, mappingSource) { OnCreated(); } - public Northwnd(System.Data.IDbConnection connection) : + public Northwind(System.Data.IDbConnection connection) : base(connection, mappingSource) { OnCreated(); } - public Northwnd(string connection, System.Data.Linq.Mapping.MappingSource mappingSource) : + public Northwind(string connection, System.Data.Linq.Mapping.MappingSource mappingSource) : base(connection, mappingSource) { OnCreated(); } - public Northwnd(System.Data.IDbConnection connection, System.Data.Linq.Mapping.MappingSource mappingSource) : + public Northwind(System.Data.IDbConnection connection, System.Data.Linq.Mapping.MappingSource mappingSource) : base(connection, mappingSource) { OnCreated(); @@ -4328,7 +4328,7 @@ public System.Nullable UnitPrice } // -public class NorthwindThroughSprocs : Northwnd +public class NorthwindThroughSprocs : Northwind { public NorthwindThroughSprocs(string connection) : diff --git a/samples/snippets/visualbasic/VS_Snippets_Data/DLinqOverrideDefaultSproc/vb/Module1.vb b/samples/snippets/visualbasic/VS_Snippets_Data/DLinqOverrideDefaultSproc/vb/Module1.vb index 3479591f7cb92..288739a81bf84 100644 --- a/samples/snippets/visualbasic/VS_Snippets_Data/DLinqOverrideDefaultSproc/vb/Module1.vb +++ b/samples/snippets/visualbasic/VS_Snippets_Data/DLinqOverrideDefaultSproc/vb/Module1.vb @@ -5,7 +5,7 @@ Module Module1 Sub method5() ' - Dim db As New Northwnd("...") + Dim db As New Northwind("...") ' Use a method call (stored procedure wrapper) instead of ' a LINQ query against the database. Dim custQuery = db.CustomersByCity("London") diff --git a/samples/snippets/visualbasic/VS_Snippets_Data/DLinqOverrideDefaultSproc/vb/northwind.vb b/samples/snippets/visualbasic/VS_Snippets_Data/DLinqOverrideDefaultSproc/vb/northwind.vb index 823c6bbf04881..1baa2e382f2e3 100644 --- a/samples/snippets/visualbasic/VS_Snippets_Data/DLinqOverrideDefaultSproc/vb/northwind.vb +++ b/samples/snippets/visualbasic/VS_Snippets_Data/DLinqOverrideDefaultSproc/vb/northwind.vb @@ -21,8 +21,8 @@ Imports System.Linq.Expressions Imports System.Reflection - _ -Partial Public Class Northwnd + _ +Partial Public Class Northwind Inherits System.Data.Linq.DataContext Private Shared mappingSource As System.Data.Linq.Mapping.MappingSource = New AttributeMappingSource @@ -3932,7 +3932,7 @@ Partial Public Class TenMostExpensiveProductsResult End Class ' -Public Class NorthwindThroughSprocs : Inherits Northwnd +Public Class NorthwindThroughSprocs : Inherits Northwind Sub New() MyBase.New("") End Sub From b119b46423a12f38cc766f4cc162673408282497 Mon Sep 17 00:00:00 2001 From: Jack Kendall <68479543+jkendall327@users.noreply.github.com> Date: Thu, 17 Jun 2021 15:09:30 +0100 Subject: [PATCH 037/105] #22968: Use null-conditional operator to simplify snippet (#24701) * Use null-conditional operator to simplify snippet This responds to issue #22968 (https://github.com/dotnet/docs/issues/22968). Archaic code for raising an event is replaced with the null-conditional operator. * Edit VB snippet --- .../eventsoverview/cs/programnodata.cs | 11 +---------- .../eventsoverview/vb/module1nodata.vb | 8 ++------ 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/samples/snippets/csharp/VS_Snippets_CLR/eventsoverview/cs/programnodata.cs b/samples/snippets/csharp/VS_Snippets_CLR/eventsoverview/cs/programnodata.cs index 561fa2638a324..654c0db5078de 100644 --- a/samples/snippets/csharp/VS_Snippets_CLR/eventsoverview/cs/programnodata.cs +++ b/samples/snippets/csharp/VS_Snippets_CLR/eventsoverview/cs/programnodata.cs @@ -40,16 +40,7 @@ public void Add(int x) total += x; if (total >= threshold) { - OnThresholdReached(EventArgs.Empty); - } - } - - protected virtual void OnThresholdReached(EventArgs e) - { - EventHandler handler = ThresholdReached; - if (handler != null) - { - handler(this, e); + ThresholdReached?.Invoke(this, EventArgs.Empty); } } diff --git a/samples/snippets/visualbasic/VS_Snippets_CLR/eventsoverview/vb/module1nodata.vb b/samples/snippets/visualbasic/VS_Snippets_CLR/eventsoverview/vb/module1nodata.vb index 1737e37d9d659..1fb6789349f4c 100644 --- a/samples/snippets/visualbasic/VS_Snippets_CLR/eventsoverview/vb/module1nodata.vb +++ b/samples/snippets/visualbasic/VS_Snippets_CLR/eventsoverview/vb/module1nodata.vb @@ -1,4 +1,4 @@ -' +' Module Module1 Sub Main() @@ -29,14 +29,10 @@ Class Counter Public Sub Add(x As Integer) total = total + x If (total >= threshold) Then - OnThresholdReached(EventArgs.Empty) + ThresholdReached?.Invoke(this. EventArgs.Empty) End If End Sub - Protected Overridable Sub OnThresholdReached(e As EventArgs) - RaiseEvent ThresholdReached(Me, e) - End Sub - Public Event ThresholdReached As EventHandler End Class ' From fabca5cab4eace3912d7cef536236ec20c6f00b8 Mon Sep 17 00:00:00 2001 From: Genevieve Warren <24882762+gewarren@users.noreply.github.com> Date: Thu, 17 Jun 2021 08:13:42 -0700 Subject: [PATCH 038/105] Update CODEOWNERS (#24697) --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 968aa0f9ebb3c..9b4690973543e 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -116,7 +116,7 @@ # XAML Services /docs/framework/xaml-services/ @adegeo # ADO.NET -/docs/framework/data/ @stevestein +/docs/framework/data/ @mcleblanc # NCL /docs/framework/configure-apps/file-schema/network/ @karelz /docs/framework/network-programming/ @karelz From 76e32312af16cd093e662e318eda40ec6fdc0b82 Mon Sep 17 00:00:00 2001 From: Tom Dykstra Date: Thu, 17 Jun 2021 08:19:42 -0700 Subject: [PATCH 039/105] Clarify wording of PROJECT_PATH description (#24708) --- docs/core/tools/dotnet-sln.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/core/tools/dotnet-sln.md b/docs/core/tools/dotnet-sln.md index 20f0cd835a5a0..4cd732f05ca4d 100644 --- a/docs/core/tools/dotnet-sln.md +++ b/docs/core/tools/dotnet-sln.md @@ -86,7 +86,7 @@ dotnet sln add [-h|--help] The path to the project or projects to add to the solution. Unix/Linux shell [globbing pattern](https://en.wikipedia.org/wiki/Glob_(programming)) expansions are processed correctly by the `dotnet sln` command. - If `PROJECT_PATH` includes folders, the folders portion of the path is used to create [solution folders](/visualstudio/ide/solutions-and-projects-in-visual-studio#solution-folder). For example, the following commands create a solution with `myapp` in solution folder `folder1/folder2`: + If `PROJECT_PATH` includes folders that contain the project folder, that portion of the path is used to create [solution folders](/visualstudio/ide/solutions-and-projects-in-visual-studio#solution-folder). For example, the following commands create a solution with `myapp` in solution folder `folder1/folder2`: ```dotnetcli dotnet new sln From 96f81a2af3fd11fc3829c418aca78308f6453ae8 Mon Sep 17 00:00:00 2001 From: "Andy (Steve) De George" <67293991+adegeo@users.noreply.github.com> Date: Thu, 17 Jun 2021 09:44:34 -0700 Subject: [PATCH 040/105] Update wording for alternative (#24668) --- .../includes/linux-install-package-manager-x64-vs-arm.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/core/install/includes/linux-install-package-manager-x64-vs-arm.md b/docs/core/install/includes/linux-install-package-manager-x64-vs-arm.md index dc0bfbf1f6402..77176af553f22 100644 --- a/docs/core/install/includes/linux-install-package-manager-x64-vs-arm.md +++ b/docs/core/install/includes/linux-install-package-manager-x64-vs-arm.md @@ -2,8 +2,8 @@ > [!IMPORTANT] > Package manager installs are only supported on the **x64** architecture. Other architectures, such as **ARM**, must install .NET by some other means such as with Snap, an installer script, or through a manual binary installation. -For more information on installing .NET without a package manager, see one of the following articles: +For more information on installing .NET **without a package manager**, see one of the following articles: -- [Install the .NET SDK or the .NET Runtime with Snap.](../linux-snap.md) -- [Install the .NET SDK or the .NET Runtime with a script.](../linux-scripted-manual.md#scripted-install) -- [Install the .NET SDK or the .NET Runtime manually.](../linux-scripted-manual.md#manual-install) +- [Alternatively install .NET with Snap.](../linux-snap.md) +- [Alternatively install .NET with `install-dotnet` script.](../linux-scripted-manual.md#scripted-install) +- [Manually install .NET](../linux-scripted-manual.md#manual-install) From 1bfa741304815386519f0f400390615b815149ac Mon Sep 17 00:00:00 2001 From: Bill Wagner Date: Thu, 17 Jun 2021 13:14:14 -0400 Subject: [PATCH 041/105] add C# 9 to version history (#24702) * add C# 9 to version history Summarize C# 9. While here, do a quick edit pass. Finally, remove outdated language version setting information. * fix build warning * respond to feedback. * Apply suggestions from code review Co-authored-by: Andy (Steve) De George <67293991+adegeo@users.noreply.github.com> Co-authored-by: Andy (Steve) De George <67293991+adegeo@users.noreply.github.com> --- .../whats-new/csharp-version-history.md | 76 +++++++++++++++---- 1 file changed, 62 insertions(+), 14 deletions(-) diff --git a/docs/csharp/whats-new/csharp-version-history.md b/docs/csharp/whats-new/csharp-version-history.md index acee58effae54..4a177e3d29a23 100644 --- a/docs/csharp/whats-new/csharp-version-history.md +++ b/docs/csharp/whats-new/csharp-version-history.md @@ -2,7 +2,8 @@ title: The history of C# - C# Guide description: What did the language look like in its earliest versions, and how has it evolved since? author: erikdietrich -ms.date: 04/08/2020 +ms.date: 06/18/2021 +ms.custom: updateeachrelease --- # The history of C\# @@ -12,15 +13,6 @@ This article provides a history of each major release of the C# language. The C# > [!IMPORTANT] > The C# language relies on types and methods in what the C# specification defines as a *standard library* for some of the features. The .NET platform delivers those types and methods in a number of packages. One example is exception processing. Every `throw` statement or expression is checked to ensure the object being thrown is derived from . Similarly, every `catch` is checked to ensure that the type being caught is derived from . Each version may add new requirements. To use the latest language features in older environments, you may need to install specific libraries. These dependencies are documented in the page for each specific version. You can learn more about the [relationships between language and library](relationships-between-language-and-library.md) for background on this dependency. -The C# build tools consider the latest major language release the default language version. There may be point releases between major releases, detailed in other articles in this section. To use the latest features in a point release, you need to [configure the compiler language version](../language-reference/configure-language-version.md) and select the version. There have been three-point releases since C# 7.0: - -- C# 7.3: - - C# 7.3 is available starting with [Visual Studio 2017 version 15.7](https://visualstudio.microsoft.com/vs/?utm_medium=microsoft&utm_source=docs.microsoft.com&utm_campaign=inline+link) and [.NET Core 2.1 SDK](../../core/whats-new/dotnet-core-2-1.md). -- C# 7.2: - - C# 7.2 is available starting with [Visual Studio 2017 version 15.5](https://visualstudio.microsoft.com/vs/?utm_medium=microsoft&utm_source=docs.microsoft.com&utm_campaign=inline+link) and [.NET Core 2.0 SDK](../../core/whats-new/dotnet-core-2-0.md). -- C# 7.1: - - C# 7.1 is available starting with [Visual Studio 2017 version 15.3](https://visualstudio.microsoft.com/vs/?utm_medium=microsoft&utm_source=docs.microsoft.com&utm_campaign=inline+link) and [.NET Core 2.0 SDK](../../core/whats-new/dotnet-core-2-0.md). - ## C# version 1.0 When you go back and look, C# version 1.0, released with Visual Studio .NET 2002, looked a lot like Java. As [part of its stated design goals for ECMA](https://feeldotneteasy.blogspot.com/2011/01/c-design-goals.html), it sought to be a "simple, modern, general-purpose object-oriented language." At the time, looking like Java meant it achieved those early design goals. @@ -65,7 +57,7 @@ Other C# 2.0 features added capabilities to existing features: While C# may have started as a generic Object-Oriented (OO) language, C# version 2.0 changed that in a hurry. Once they had their feet under them, they went after some serious developer pain points. And they went after them in a significant way. -With generics, types and methods can operate on an arbitrary type while still retaining type safety. For instance, having a lets you have `List` or `List` and perform type-safe operations on those strings or integers while you iterate through them. Using generics is better than creating a `ListInt` type which derives from `ArrayList` or casting from `Object` for every operation. +With generics, types and methods can operate on an arbitrary type while still retaining type safety. For instance, having a lets you have `List` or `List` and perform type-safe operations on those strings or integers while you iterate through them. Using generics is better than creating a `ListInt` type that derives from `ArrayList` or casting from `Object` for every operation. C# version 2.0 brought iterators. To put it succinctly, iterators let you examine all the items in a `List` (or other Enumerable types) with a `foreach` loop. Having iterators as a first-class part of the language dramatically enhanced readability of the language and people's ability to reason about the code. @@ -104,7 +96,7 @@ The next version did introduce some interesting new features: - [Generic covariant and contravariant](../../standard/generics/covariance-and-contravariance.md) - [Embedded interop types](../../framework/interop/type-equivalence-and-embedded-interop-types.md) -Embedded interop types alleviated a deployment pain. Generic covariance and contravariance give you more power to use generics, but they're a bit academic and probably most appreciated by framework and library authors. Named and optional parameters let you eliminate many method overloads and provide convenience. But none of those features are exactly paradigm altering. +Embedded interop types eased the deployment pain of creating COM interop assemblies for your application. Generic covariance and contravariance give you more power to use generics, but they're a bit academic and probably most appreciated by framework and library authors. Named and optional parameters let you eliminate many method overloads and provide convenience. But none of those features are exactly paradigm altering. The major feature was the introduction of the `dynamic` keyword. The `dynamic` keyword introduced into C# version 4.0 the ability to override the compiler on compile-time typing. By using the dynamic keyword, you can create constructs similar to dynamically typed languages like JavaScript. You can create a `dynamic x = "a string"` and then add six to it, leaving it up to the runtime to sort out what should happen next. @@ -112,7 +104,7 @@ Dynamic binding gives you the potential for errors but also great power within t ## C# version 5.0 -C# version 5.0, released with Visual Studio 2012, was a focused version of the language. Nearly all of the effort for that version went into another groundbreaking language concept: the `async` and `await` model for asynchronous programming. Here is the major features list: +C# version 5.0, released with Visual Studio 2012, was a focused version of the language. Nearly all of the effort for that version went into another groundbreaking language concept: the `async` and `await` model for asynchronous programming. Here's the major features list: - [Asynchronous members](../async.md) - [Caller info attributes](../language-reference/attributes/caller-information.md) @@ -211,7 +203,7 @@ The following new features support the theme of better performance for safe code - [You can reassign `ref` local variables.](csharp-7.md#enabling-more-efficient-safe-code) - [You can use initializers on `stackalloc` arrays.](csharp-7.md#stackalloc-arrays-support-initializers) - [You can use `fixed` statements with any type that supports a pattern.](csharp-7.md#more-types-support-the-fixed-statement) -- [You can use additional generic constraints.](csharp-7.md#enhanced-generic-constraints) +- [You can use more generic constraints.](csharp-7.md#enhanced-generic-constraints) The following enhancements were made to existing features: @@ -250,4 +242,60 @@ C# 8.0 is the first major C# release that specifically targets .NET Core. Some f Default interface members require enhancements in the CLR. Those features were added in the CLR for .NET Core 3.0. Ranges and indexes, and asynchronous streams require new types in the .NET Core 3.0 libraries. Nullable reference types, while implemented in the compiler, is much more useful when libraries are annotated to provide semantic information regarding the null state of arguments and return values. Those annotations are being added in the .NET Core libraries. +## C# version 9.0 + +C# 9.0 was released with .NET 5. It's the default language version for any assembly that targets the .NET 5 release. It contains the following new and enhanced features: + +C# 9.0 adds the following features and enhancements to the C# language: + +- [Records](./csharp-9.md#record-types) +- [Init only setters](./csharp-9.md#init-only-setters) +- [Top-level statements](./csharp-9.md#top-level-statements) +- [Pattern matching enhancements](./csharp-9.md#pattern-matching-enhancements) +- [Performance and interop](./csharp-9.md#performance-and-interop) + - [Native sized integers](~/_csharplang/proposals/csharp-9.0/native-integers.md) + - [Function pointers](~/_csharplang/proposals/csharp-9.0/function-pointers.md) + - [Suppress emitting localsinit flag](~/_csharplang/proposals/csharp-9.0/skip-localsinit.md) +- [Fit and finish features](./csharp-9.md#fit-and-finish-features) + - [Target-typed `new` expressions](~/_csharplang/proposals/csharp-9.0/target-typed-new.md) + - [`static` anonymous functions](~/_csharplang/proposals/csharp-9.0/static-anonymous-functions.md) + - [Target-typed conditional expressions](~/_csharplang/proposals/csharp-9.0/target-typed-conditional-expression.md) + - [Covariant return types](~/_csharplang/proposals/csharp-9.0/covariant-returns.md) + - [Extension `GetEnumerator` support for `foreach` loops](~/_csharplang/proposals/csharp-9.0/extension-getenumerator.md) + - [Lambda discard parameters](~/_csharplang/proposals/csharp-9.0/lambda-discard-parameters.md) + - [Attributes on local functions](~/_csharplang/proposals/csharp-9.0/local-function-attributes.md) +- [Support for code generators](./csharp-9.md#support-for-code-generators) + - [Module initializers](~/_csharplang/proposals/csharp-9.0/module-initializers.md) + - [New features for partial methods](~/_csharplang/proposals/csharp-9.0/extending-partial-methods.md) + +C# 9.0 continues three of the themes from previous releases: removing ceremony, separating data from algorithms, and providing more patterns in more places. + +[Top level statements](../fundamentals/program-structure/top-level-statements.md) means your main program is simpler to read. There's less need for ceremony: a namespace, a `Program` class, and `static void Main()` are all unnecessary. + +The introduction of [`records`](../language-reference/builtin-types/record.md) provide a concise syntax for reference types that follow value semantics for equality. You'll use these types to define data containers that typically define minimal behavior. [Init-only setters](./csharp-9.md#init-only-setters) provide the capability for non-destructive mutation (`with` expressions) in records. C# 9.0 also adds [covariant return types](~/_csharplang/proposals/csharp-9.0/covariant-returns.md) so that derived records can override virtual methods and return a type derived from the base method's return type. + +The [pattern matching](../fundamentals/functional/pattern-matching.md) capabilities have been expanded in several ways. Numeric types now support *range patterns*. Patterns can be combined using `and`, `or`, and `not` patterns. Parentheses can be added to clarify more complex patterns. + +Another set of features supports high-performance computing in C#: + +- The `nint` and `nuint` types model the native-size integer types on the target CPU. +- [Function pointers](../language-reference/unsafe-code.md#function-pointers) provide delegate-like functionality while avoiding the allocations necessary to create a delegate object. +- The `localsinit` instruction can be omitted to save instructions. + +Another set of improvements supports scenarios where *code generators* add functionality: + +- [Module initializers](../language-reference/attributes/general.md#moduleinitializer-attribute) are methods that the runtime calls when an assembly loads. +- [Partial methods](../language-reference/keywords/partial-method.md) support new accessibly modifiers and non-void return types. In those cases, an implementation must be provided. + +C# 9.0 adds many other small features that improve developer productivity, both writing and reading code: + +- Target-type `new` expressions +- `static` anonymous functions +- Target-type conditional expressions +- Extension `GetEnumerator()` support for `foreach` loops +- Lambda expressions can declare discard parameters +- Attributes can be applied to local functions + +The C# 9.0 release continues the work to keep C# a modern, general-purpose programming language. Features continue to support modern workloads and application types. + _Article_ [_originally published on the NDepend blog_](https://blog.ndepend.com/c-versions-look-language-history/)_, courtesy of Erik Dietrich and Patrick Smacchia._ From 428c3c58b0bbbf22f8492ed962da932ef19152b6 Mon Sep 17 00:00:00 2001 From: Genevieve Warren <24882762+gewarren@users.noreply.github.com> Date: Thu, 17 Jun 2021 11:46:40 -0700 Subject: [PATCH 042/105] Fix loc issue (#24646) --- .../casting-and-conversions.md | 22 +++++-------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/docs/fsharp/language-reference/casting-and-conversions.md b/docs/fsharp/language-reference/casting-and-conversions.md index d99efff40a3d2..4dc1c3ab921c6 100644 --- a/docs/fsharp/language-reference/casting-and-conversions.md +++ b/docs/fsharp/language-reference/casting-and-conversions.md @@ -1,11 +1,11 @@ --- -title: Casting and Conversions -description: Learn how the F# programming language provides conversion operators for arithmetic conversions between various primitive types. +title: Casting and conversions +description: Learn how the F# programming language provides operators for arithmetic conversions between various primitive types. ms.date: 02/20/2020 --- -# Casting and Conversions (F#) +# Casting and conversions (F#) -This topic describes support for type conversions in F#. +This article describes support for type conversions in F#. ## Arithmetic Types @@ -94,19 +94,9 @@ The following code illustrates the use of the `:>` and `:?>` operators. The code [!code-fsharp[Main](~/samples/snippets/fsharp/lang-ref-2/snippet4403.fs)] -Because generic operators `downcast` and `upcast` rely on type inference to determine the argument and return type, in the above code, you can replace +Because the generic operators `downcast` and `upcast` rely on type inference to determine the argument and return type, you can replace `let base1 = d1 :> Base1` in the previous code example with `let base1: Base1 = upcast d1`. -```fsharp -let base1 = d1 :> Base1 -``` - -with - -```fsharp -let base1: Base1 = upcast d1 -``` - -Note that a type annotation is required, since `upcast` by itself could not determine the base class. +A type annotation is required, because `upcast` by itself could not determine the base class. ## See also From 869ddfc7816c3a2461b005b04fe6fa4f926977a7 Mon Sep 17 00:00:00 2001 From: Cam Soper Date: Thu, 17 Jun 2021 14:42:21 -0500 Subject: [PATCH 043/105] Add CaSoper/CamSoper to codeowners/docfx for iot (#24724) --- .github/CODEOWNERS | 3 +++ docfx.json | 3 +++ 2 files changed, 6 insertions(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 9b4690973543e..d4b11e7024f9c 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -55,6 +55,9 @@ # Azure Guide /docs/azure/ @CamSoper +# Azure SDK package list +/docs/azure/includes/ @dotnet/docs + # IoT Guide /docs/iot/ @CamSoper diff --git a/docfx.json b/docfx.json index 8dfcea3411e29..7848460455a85 100644 --- a/docfx.json +++ b/docfx.json @@ -218,6 +218,7 @@ "docs/framework/**/how-to*.md": "how-to", "docs/framework/**/troubleshooting*.md": "troubleshooting", "docs/fsharp/language-reference/**/**.md": "language-reference", + "docs/iot/**/*.*": "conceptual", "docs/fundamentals/code-analysis/**.md": "reference", "docs/fundamentals/code-analysis/quality-rules/**.md": "reference", "docs/fundamentals/code-analysis/style-rules/**.md": "reference", @@ -296,6 +297,7 @@ "docs/fsharp/**/**.md": "cartermp", "docs/fundamentals/code-analysis/**/**.md": "gewarren", "docs/fundamentals/syslib-diagnostics/**/**.md": "gewarren", + "docs/iot/**/*.*": "camsoper", "docs/machine-learning/**/**.md": "luisquintanilla", "docs/spark/**/**.md": "luisquintanilla", "docs/standard/**/**.md": "gewarren", @@ -380,6 +382,7 @@ "docs/fsharp/**/**.md": "phcart", "docs/fundamentals/code-analysis/**/*.md": "gewarren", "docs/fundamentals/syslib-diagnostics/**/**.md": "gewarren", + "docs/iot/**/*.*": "casoper", "docs/machine-learning/**/**.md": "luquinta", "docs/spark/**/**.md": "luquinta", "docs/standard/**/**.md": "gewarren", From c002aae3d72983348829389a6e9c50df86eabfe4 Mon Sep 17 00:00:00 2001 From: Azure SDK Bot <53356347+azure-sdk@users.noreply.github.com> Date: Thu, 17 Jun 2021 14:20:02 -0700 Subject: [PATCH 044/105] Update package index with latest published versions (#24710) --- docs/azure/includes/dotnet-all.md | 8 ++++---- docs/azure/includes/dotnet-new.md | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/azure/includes/dotnet-all.md b/docs/azure/includes/dotnet-all.md index 39b27490ac48a..2a8804a02d983 100644 --- a/docs/azure/includes/dotnet-all.md +++ b/docs/azure/includes/dotnet-all.md @@ -20,7 +20,7 @@ | ConfidentialLedger | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Storage.ConfidentialLedger/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Storage.ConfidentialLedger-readme-pre) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.ConfidentialLedger_1.0.0-beta.1/sdk/confidentialledger/Azure.Storage.ConfidentialLedger/) | | Container Registry | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Containers.ContainerRegistry/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Containers.ContainerRegistry-readme-pre) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Containers.ContainerRegistry_1.0.0-beta.3/sdk/containerregistry/Azure.Containers.ContainerRegistry/) | | Core | NuGet [1.15.0](https://www.nuget.org/packages/Azure.Core/1.15.0) | [docs](/dotnet/api/overview/azure/Core-readme) | GitHub [1.15.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core_1.15.0/sdk/core/Azure.Core/) | -| Core - AMQP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Core.Amqp/1.0.0)
NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.Core.Amqp/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/Core.Amqp-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core.Amqp_1.0.0/sdk/core/Azure.Core.Amqp/)
GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core.Amqp_1.1.0-beta.1/sdk/core/Azure.Core.Amqp/) | +| Core - AMQP | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Core.Amqp/1.1.0) | [docs](/dotnet/api/overview/azure/Core.Amqp-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core.Amqp_1.1.0/sdk/core/Azure.Core.Amqp/) | | Cosmos DB | NuGet [4.0.0-preview3](https://www.nuget.org/packages/Azure.Cosmos/4.0.0-preview3) | [docs](/dotnet/api/azure.cosmos) | GitHub [4.0.0-preview3](https://github.com/Azure/azure-cosmos-dotnet-v3/tree/releases/4.0.0-preview3) | | Digital Twins - Core | NuGet [1.2.2](https://www.nuget.org/packages/Azure.DigitalTwins.Core/1.2.2) | [docs](/dotnet/api/overview/azure/DigitalTwins.Core-readme) | GitHub [1.2.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.DigitalTwins.Core_1.2.2/sdk/digitaltwins/Azure.DigitalTwins.Core/) | | Document Translation | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.AI.Translation.Document/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/AI.Translation.Document-readme-pre) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Translation.Document_1.0.0-beta.2/sdk/translation/Azure.AI.Translation.Document/) | @@ -32,7 +32,7 @@ | Form Recognizer | NuGet [3.1.1](https://www.nuget.org/packages/Azure.AI.FormRecognizer/3.1.1) | [docs](/dotnet/api/overview/azure/AI.FormRecognizer-readme) | GitHub [3.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.FormRecognizer_3.1.1/sdk/formrecognizer/Azure.AI.FormRecognizer/) | | Identity | NuGet [1.4.0](https://www.nuget.org/packages/Azure.Identity/1.4.0)
NuGet [1.5.0-beta.1](https://www.nuget.org/packages/Azure.Identity/1.5.0-beta.1) | [docs](/dotnet/api/overview/azure/Identity-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Identity_1.4.0/sdk/identity/Azure.Identity/)
GitHub [1.5.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Identity_1.5.0-beta.1/sdk/identity/Azure.Identity/) | | IoT Device Update | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.IoT.DeviceUpdate/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/IoT.DeviceUpdate-readme-pre) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.IoT.DeviceUpdate_1.0.0-beta.2/sdk/deviceupdate/Azure.Iot.DeviceUpdate/) | -| Key Vault - Administration | NuGet [4.0.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Administration/4.0.0) | | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Administration_4.0.0/sdk/keyvault/Azure.Security.KeyVault.Administration/) | +| Key Vault - Administration | NuGet [4.0.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Administration/4.0.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Administration-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Administration_4.0.0/sdk/keyvault/Azure.Security.KeyVault.Administration/) | | Key Vault - Certificates | NuGet [4.2.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Certificates/4.2.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Certificates-readme) | GitHub [4.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Certificates_4.2.0/sdk/keyvault/Azure.Security.KeyVault.Certificates/) | | Key Vault - Keys | NuGet [4.2.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Keys/4.2.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Keys-readme) | GitHub [4.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Keys_4.2.0/sdk/keyvault/Azure.Security.KeyVault.Keys/) | | Key Vault - Secrets | NuGet [4.2.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Secrets/4.2.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Secrets-readme) | GitHub [4.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Secrets_4.2.0/sdk/keyvault/Azure.Security.KeyVault.Secrets/) | @@ -173,7 +173,7 @@ | Container Registry | NuGet [1.0.0-preview.2](https://www.nuget.org/packages/Microsoft.Azure.ContainerRegistry/1.0.0-preview.2) | | GitHub [1.0.0-preview.2](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.ContainerRegistry_1.0.0-preview.2/sdk/containerregistry/Microsoft.Azure.ContainerRegistry/) | | Content Moderator | NuGet [2.0.0](https://www.nuget.org/packages/Microsoft.Azure.CognitiveServices.ContentModerator/2.0.0) | | | | Core | NuGet [1.15.0](https://www.nuget.org/packages/Azure.Core/1.15.0) | [docs](/dotnet/api/overview/azure/Core-readme) | GitHub [1.15.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core_1.15.0/sdk/core/Azure.Core/) | -| Core - AMQP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Core.Amqp/1.0.0)
NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.Core.Amqp/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/Core.Amqp-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core.Amqp_1.0.0/sdk/core/Azure.Core.Amqp/)
GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core.Amqp_1.1.0-beta.1/sdk/core/Azure.Core.Amqp/) | +| Core - AMQP | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Core.Amqp/1.1.0) | [docs](/dotnet/api/overview/azure/Core.Amqp-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core.Amqp_1.1.0/sdk/core/Azure.Core.Amqp/) | | Core Newtonsoft Json | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.Core.NewtonsoftJson/1.0.0)
NuGet [1.0.0-preview.1](https://www.nuget.org/packages/Microsoft.Azure.Core.NewtonsoftJson/1.0.0-preview.1) | | | | Core Spatial | NuGet [1.1.0](https://www.nuget.org/packages/Microsoft.Azure.Core.Spatial/1.1.0) | | | | Core Spatial Newtonsoft Json | NuGet [1.0.0](https://www.nuget.org/packages/Microsoft.Azure.Core.Spatial.NewtonsoftJson/1.0.0)
NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Microsoft.Azure.Core.Spatial.NewtonsoftJson/1.0.0-beta.1) | | | @@ -227,7 +227,7 @@ | Jobs - Core | NuGet [0.3.2-beta](https://www.nuget.org/packages/Microsoft.Azure.Jobs.Core/0.3.2-beta) | | GitHub [0.3.2-beta](https://github.com/Azure/azure-webjobs-sdk) | | Jobs - Service Bus | NuGet [0.3.2-beta](https://www.nuget.org/packages/Microsoft.Azure.Jobs.ServiceBus/0.3.2-beta) | | GitHub [0.3.2-beta](https://github.com/Azure/azure-webjobs-sdk) | | Key Vault | NuGet [3.0.5](https://www.nuget.org/packages/Microsoft.Azure.KeyVault/3.0.5) | | GitHub [3.0.5](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.KeyVault_3.0.5/sdk/keyvault/Microsoft.Azure.KeyVault/) | -| Key Vault - Administration | NuGet [4.0.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Administration/4.0.0) | | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Administration_4.0.0/sdk/keyvault/Azure.Security.KeyVault.Administration/) | +| Key Vault - Administration | NuGet [4.0.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Administration/4.0.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Administration-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Administration_4.0.0/sdk/keyvault/Azure.Security.KeyVault.Administration/) | | Key Vault - Certificates | NuGet [4.2.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Certificates/4.2.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Certificates-readme) | GitHub [4.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Certificates_4.2.0/sdk/keyvault/Azure.Security.KeyVault.Certificates/) | | Key Vault - Core | NuGet [3.0.5](https://www.nuget.org/packages/Microsoft.Azure.KeyVault.Core/3.0.5) | | GitHub [3.0.5](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.KeyVault.Core_3.0.5/sdk/keyvault/Microsoft.Azure.KeyVault.Core/) | | Key Vault - Cryptography | NuGet [3.0.5](https://www.nuget.org/packages/Microsoft.Azure.KeyVault.Cryptography/3.0.5) | | GitHub [3.0.5](https://github.com/Azure/azure-sdk-for-net/tree/Microsoft.Azure.KeyVault.Cryptography_3.0.5/sdk/keyvault/Microsoft.Azure.KeyVault.Cryptography/) | diff --git a/docs/azure/includes/dotnet-new.md b/docs/azure/includes/dotnet-new.md index c3f509529e204..19448268beb75 100644 --- a/docs/azure/includes/dotnet-new.md +++ b/docs/azure/includes/dotnet-new.md @@ -20,7 +20,7 @@ | ConfidentialLedger | NuGet [1.0.0-beta.1](https://www.nuget.org/packages/Azure.Storage.ConfidentialLedger/1.0.0-beta.1) | [docs](/dotnet/api/overview/azure/Storage.ConfidentialLedger-readme-pre) | GitHub [1.0.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Storage.ConfidentialLedger_1.0.0-beta.1/sdk/confidentialledger/Azure.Storage.ConfidentialLedger/) | | Container Registry | NuGet [1.0.0-beta.3](https://www.nuget.org/packages/Azure.Containers.ContainerRegistry/1.0.0-beta.3) | [docs](/dotnet/api/overview/azure/Containers.ContainerRegistry-readme-pre) | GitHub [1.0.0-beta.3](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Containers.ContainerRegistry_1.0.0-beta.3/sdk/containerregistry/Azure.Containers.ContainerRegistry/) | | Core | NuGet [1.15.0](https://www.nuget.org/packages/Azure.Core/1.15.0) | [docs](/dotnet/api/overview/azure/Core-readme) | GitHub [1.15.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core_1.15.0/sdk/core/Azure.Core/) | -| Core - AMQP | NuGet [1.0.0](https://www.nuget.org/packages/Azure.Core.Amqp/1.0.0)
NuGet [1.1.0-beta.1](https://www.nuget.org/packages/Azure.Core.Amqp/1.1.0-beta.1) | [docs](/dotnet/api/overview/azure/Core.Amqp-readme) | GitHub [1.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core.Amqp_1.0.0/sdk/core/Azure.Core.Amqp/)
GitHub [1.1.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core.Amqp_1.1.0-beta.1/sdk/core/Azure.Core.Amqp/) | +| Core - AMQP | NuGet [1.1.0](https://www.nuget.org/packages/Azure.Core.Amqp/1.1.0) | [docs](/dotnet/api/overview/azure/Core.Amqp-readme) | GitHub [1.1.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Core.Amqp_1.1.0/sdk/core/Azure.Core.Amqp/) | | Cosmos DB | NuGet [4.0.0-preview3](https://www.nuget.org/packages/Azure.Cosmos/4.0.0-preview3) | [docs](/dotnet/api/azure.cosmos) | GitHub [4.0.0-preview3](https://github.com/Azure/azure-cosmos-dotnet-v3/tree/releases/4.0.0-preview3) | | Digital Twins - Core | NuGet [1.2.2](https://www.nuget.org/packages/Azure.DigitalTwins.Core/1.2.2) | [docs](/dotnet/api/overview/azure/DigitalTwins.Core-readme) | GitHub [1.2.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.DigitalTwins.Core_1.2.2/sdk/digitaltwins/Azure.DigitalTwins.Core/) | | Document Translation | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.AI.Translation.Document/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/AI.Translation.Document-readme-pre) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.Translation.Document_1.0.0-beta.2/sdk/translation/Azure.AI.Translation.Document/) | @@ -32,7 +32,7 @@ | Form Recognizer | NuGet [3.1.1](https://www.nuget.org/packages/Azure.AI.FormRecognizer/3.1.1) | [docs](/dotnet/api/overview/azure/AI.FormRecognizer-readme) | GitHub [3.1.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.AI.FormRecognizer_3.1.1/sdk/formrecognizer/Azure.AI.FormRecognizer/) | | Identity | NuGet [1.4.0](https://www.nuget.org/packages/Azure.Identity/1.4.0)
NuGet [1.5.0-beta.1](https://www.nuget.org/packages/Azure.Identity/1.5.0-beta.1) | [docs](/dotnet/api/overview/azure/Identity-readme) | GitHub [1.4.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Identity_1.4.0/sdk/identity/Azure.Identity/)
GitHub [1.5.0-beta.1](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Identity_1.5.0-beta.1/sdk/identity/Azure.Identity/) | | IoT Device Update | NuGet [1.0.0-beta.2](https://www.nuget.org/packages/Azure.IoT.DeviceUpdate/1.0.0-beta.2) | [docs](/dotnet/api/overview/azure/IoT.DeviceUpdate-readme-pre) | GitHub [1.0.0-beta.2](https://github.com/Azure/azure-sdk-for-net/tree/Azure.IoT.DeviceUpdate_1.0.0-beta.2/sdk/deviceupdate/Azure.Iot.DeviceUpdate/) | -| Key Vault - Administration | NuGet [4.0.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Administration/4.0.0) | | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Administration_4.0.0/sdk/keyvault/Azure.Security.KeyVault.Administration/) | +| Key Vault - Administration | NuGet [4.0.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Administration/4.0.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Administration-readme) | GitHub [4.0.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Administration_4.0.0/sdk/keyvault/Azure.Security.KeyVault.Administration/) | | Key Vault - Certificates | NuGet [4.2.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Certificates/4.2.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Certificates-readme) | GitHub [4.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Certificates_4.2.0/sdk/keyvault/Azure.Security.KeyVault.Certificates/) | | Key Vault - Keys | NuGet [4.2.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Keys/4.2.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Keys-readme) | GitHub [4.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Keys_4.2.0/sdk/keyvault/Azure.Security.KeyVault.Keys/) | | Key Vault - Secrets | NuGet [4.2.0](https://www.nuget.org/packages/Azure.Security.KeyVault.Secrets/4.2.0) | [docs](/dotnet/api/overview/azure/Security.KeyVault.Secrets-readme) | GitHub [4.2.0](https://github.com/Azure/azure-sdk-for-net/tree/Azure.Security.KeyVault.Secrets_4.2.0/sdk/keyvault/Azure.Security.KeyVault.Secrets/) | From 89520b53babcaaece7052f8388e3931a245d73fa Mon Sep 17 00:00:00 2001 From: Genevieve Warren <24882762+gewarren@users.noreply.github.com> Date: Thu, 17 Jun 2021 14:26:37 -0700 Subject: [PATCH 045/105] Update action location (#24721) --- .github/workflows/check-for-build-warnings.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check-for-build-warnings.yml b/.github/workflows/check-for-build-warnings.yml index 25f66767ce6bd..b916e8c721459 100644 --- a/.github/workflows/check-for-build-warnings.yml +++ b/.github/workflows/check-for-build-warnings.yml @@ -1,4 +1,4 @@ -name: 'Status checker' +name: 'OPS status checker' on: pull_request_target: @@ -9,6 +9,6 @@ jobs: name: Look for build warnings runs-on: ubuntu-latest steps: - - uses: dotnet/samples/.github/actions/status-checker@main + - uses: dotnet/docs-actions/actions/status-checker@main with: repo-token: ${{ secrets.GITHUB_TOKEN }} From 56eff18407c47af0e785ff9134fa5bd7bc58ef84 Mon Sep 17 00:00:00 2001 From: Genevieve Warren <24882762+gewarren@users.noreply.github.com> Date: Thu, 17 Jun 2021 14:27:02 -0700 Subject: [PATCH 046/105] Fix up links (#24722) --- docs/azure/sdk/azure-sdk-for-dotnet.md | 6 +++--- docs/azure/sdk/dependency-injection.md | 6 +++--- docs/azure/sdk/logging.md | 4 ++-- docs/azure/sdk/thread-safety.md | 2 +- docs/core/compatibility/toc.yml | 16 ++++++++-------- docs/core/extensions/workers.md | 2 +- .../standard/data/xml/recoverable-xslt-errors.md | 2 +- docs/standard/data/xml/xslt-transformations.md | 2 +- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/docs/azure/sdk/azure-sdk-for-dotnet.md b/docs/azure/sdk/azure-sdk-for-dotnet.md index a51ffd58f4d4f..6efb2c468c174 100644 --- a/docs/azure/sdk/azure-sdk-for-dotnet.md +++ b/docs/azure/sdk/azure-sdk-for-dotnet.md @@ -21,10 +21,10 @@ The Azure SDK for .NET is available as series of NuGet packages that can be used To use an Azure SDK package in one of your .NET applications, you want to follow these steps. -1. **Locate the appropriate SDK package -** Use the [package list](/dotnet/azure/sdk/packages) to find the appropriate package for the Azure service you are working with. Be advised that most services have a client package for working with the service and a management package for creating and managing instances of the service. In most cases, you will want the client package. Install this package in your application using NuGet. +1. **Locate the appropriate SDK package -** Use the [package list](packages.md) to find the appropriate package for the Azure service you are working with. Be advised that most services have a client package for working with the service and a management package for creating and managing instances of the service. In most cases, you will want the client package. Install this package in your application using NuGet. -2. **Set up authentication for your application -** To access Azure resources, your application will need to have the appropriate credentials and access rights assigned in Azure. Learn how to configure authentication in [Authenticating .NET applications to Azure](/dotnet/azure/sdk/authentication). +2. **Set up authentication for your application -** To access Azure resources, your application will need to have the appropriate credentials and access rights assigned in Azure. Learn how to configure authentication in [Authenticating .NET applications to Azure](authentication.md). 3. **Write code using the SDK in your application -** When working with Azure services, your code will first create a client object to work with the service and then call methods on that client object to interact with the service. Both synchronous and asynchronous methods are provided. Examples of using each individual SDK package are provided throughout the Azure documentation. -4. **Configure logging for the SDK (optional) -** If you need to diagnose issues between your application and Azure, you can [enable logging in the Azure SDK for .NET](/dotnet/azure/sdk/logging). +4. **Configure logging for the SDK (optional) -** If you need to diagnose issues between your application and Azure, you can [enable logging in the Azure SDK for .NET](logging.md). diff --git a/docs/azure/sdk/dependency-injection.md b/docs/azure/sdk/dependency-injection.md index 373992d28abc1..83ca8d789cb86 100644 --- a/docs/azure/sdk/dependency-injection.md +++ b/docs/azure/sdk/dependency-injection.md @@ -86,7 +86,7 @@ public class MyApiController : ControllerBase ## Store configuration separately from code -In the [Register client](#register-client) section, you explicitly specify the `keyVaultUrl` and `storageUrl` variables. This approach could cause problems when you run code against different environments during development and production. The .NET team suggests [storing such configurations in environment-dependent JSON files](/dotnet/core/extensions/configuration-providers#json-configuration-provider). For example, you can have an _appsettings.Development.json_ file containing development environment settings. Another _appsettings.Production.json_ file would contain production environment settings, and so on. The file format is: +In the [Register client](#register-client) section, you explicitly specify the `keyVaultUrl` and `storageUrl` variables. This approach could cause problems when you run code against different environments during development and production. The .NET team suggests [storing such configurations in environment-dependent JSON files](../../core/extensions/configuration-providers.md#json-configuration-provider). For example, you can have an _appsettings.Development.json_ file containing development environment settings. Another _appsettings.Production.json_ file would contain production environment settings, and so on. The file format is: ```json { @@ -240,6 +240,6 @@ You can also place policy overrides in the _appsettings.json_ file: ## See also -- [Dependency injection in .NET](/dotnet/core/extensions/dependency-injection) -- [Configuration in .NET](/dotnet/core/extensions/configuration) +- [Dependency injection in .NET](../../core/extensions/dependency-injection.md) +- [Configuration in .NET](../../core/extensions/configuration.md) - [Configuration in ASP.NET Core](/aspnet/core/fundamentals/configuration) diff --git a/docs/azure/sdk/logging.md b/docs/azure/sdk/logging.md index fc72e1b0072aa..9ac4ec0039669 100644 --- a/docs/azure/sdk/logging.md +++ b/docs/azure/sdk/logging.md @@ -66,7 +66,7 @@ using AzureEventSourceListener listener = AzureEventSourceListener.CreateConsole ### Log to diagnostic traces -If you implement trace listeners, you can use the `CreateTraceLogger` method to log to the standard .NET event tracing mechanism ([`System.Diagnostics.Tracing`](/dotnet/api/system.diagnostics.tracing)). For more information on event tracing in .NET, see [Trace Listeners](/dotnet/framework/debug-trace-profile/trace-listeners). This example specifies a log level of verbose: +If you implement trace listeners, you can use the `CreateTraceLogger` method to log to the standard .NET event tracing mechanism ([`System.Diagnostics.Tracing`](/dotnet/api/system.diagnostics.tracing)). For more information on event tracing in .NET, see [Trace Listeners](../../framework/debug-trace-profile/trace-listeners.md). This example specifies a log level of verbose: ```csharp using AzureEventSourceListener listener = AzureEventSourceListener.CreateTraceLogger(EventLevel.Verbose); @@ -95,4 +95,4 @@ using AzureEventSourceListener listener = new AzureEventSourceListener((e, messa - [Enable diagnostics logging for apps in Azure App Service](/azure/app-service/troubleshoot-diagnostic-logs) - Review [Azure security logging and auditing](/azure/security/fundamentals/log-audit) options - Learn how to work with [Azure platform logs](/azure/azure-monitor/platform/platform-logs-overview) -- Read more about [.NET Core logging and tracing](/dotnet/core/diagnostics/logging-tracing) +- Read more about [.NET Core logging and tracing](../../core/diagnostics/logging-tracing.md) diff --git a/docs/azure/sdk/thread-safety.md b/docs/azure/sdk/thread-safety.md index d265eac6547b5..aac124df49a1f 100644 --- a/docs/azure/sdk/thread-safety.md +++ b/docs/azure/sdk/thread-safety.md @@ -121,4 +121,4 @@ Further guidance for properly managing and disposing of `HttpClient` instances c ## See also - [Dependency injection with the Azure SDK for .NET](./dependency-injection.md) -- [Dependency injection in .NET](/dotnet/core/extensions/dependency-injection) +- [Dependency injection in .NET](../../core/extensions/dependency-injection.md) diff --git a/docs/core/compatibility/toc.yml b/docs/core/compatibility/toc.yml index 8f9a4b43443a2..86d932ef44c22 100644 --- a/docs/core/compatibility/toc.yml +++ b/docs/core/compatibility/toc.yml @@ -332,7 +332,7 @@ items: - name: Native code can't access Windows Forms objects href: windows-forms/5.0/winforms-objects-not-accessible-from-native-code.md - name: OutputType set to WinExe - href: windows-forms/5.0/automatically-infer-winexe-output-type.md + href: sdk/5.0/automatically-infer-winexe-output-type.md - name: DataGridView doesn't reset custom fonts href: windows-forms/5.0/datagridview-doesnt-reset-custom-font-settings.md - name: Methods throw ArgumentException @@ -346,15 +346,15 @@ items: - name: DataGridView APIs throw InvalidOperationException href: windows-forms/5.0/null-owner-causes-invalidoperationexception.md - name: WinForms apps use Microsoft.NET.Sdk - href: windows-forms/5.0/sdk-and-target-framework-change.md + href: sdk/5.0/sdk-and-target-framework-change.md - name: Removed status bar controls href: windows-forms/5.0/winforms-deprecated-controls.md - name: WPF items: - name: OutputType set to WinExe - href: windows-forms/5.0/automatically-infer-winexe-output-type.md + href: sdk/5.0/automatically-infer-winexe-output-type.md - name: WPF apps use Microsoft.NET.Sdk - href: windows-forms/5.0/sdk-and-target-framework-change.md + href: sdk/5.0/sdk-and-target-framework-change.md - name: .NET Core 3.1 href: 3.1.md - name: .NET Core 3.0 @@ -712,7 +712,7 @@ items: - name: Native code can't access Windows Forms objects href: windows-forms/5.0/winforms-objects-not-accessible-from-native-code.md - name: OutputType set to WinExe - href: windows-forms/5.0/automatically-infer-winexe-output-type.md + href: sdk/5.0/automatically-infer-winexe-output-type.md - name: DataGridView doesn't reset custom fonts href: windows-forms/5.0/datagridview-doesnt-reset-custom-font-settings.md - name: Methods throw ArgumentException @@ -726,7 +726,7 @@ items: - name: DataGridView APIs throw InvalidOperationException href: windows-forms/5.0/null-owner-causes-invalidoperationexception.md - name: WinForms apps use Microsoft.NET.Sdk - href: windows-forms/5.0/sdk-and-target-framework-change.md + href: sdk/5.0/sdk-and-target-framework-change.md - name: Removed status bar controls href: windows-forms/5.0/winforms-deprecated-controls.md - name: .NET Core 3.0-3.1 @@ -736,6 +736,6 @@ items: - name: .NET 5 items: - name: OutputType set to WinExe - href: windows-forms/5.0/automatically-infer-winexe-output-type.md + href: sdk/5.0/automatically-infer-winexe-output-type.md - name: WPF apps use Microsoft.NET.Sdk - href: windows-forms/5.0/sdk-and-target-framework-change.md + href: sdk/5.0/sdk-and-target-framework-change.md diff --git a/docs/core/extensions/workers.md b/docs/core/extensions/workers.md index 9c2cbdef02b8f..f10401a6926c4 100644 --- a/docs/core/extensions/workers.md +++ b/docs/core/extensions/workers.md @@ -31,7 +31,7 @@ There are many terms that are mistakenly used synonymously. In this section, the ## Worker Service template -The Worker Service template is available to the .NET CLI, and Visual Studio. For more information, see [.NET CLI, `dotnet new worker` - template](/dotnet/core/tools/dotnet-new-sdk-templates#web-others). The template consists of a `Program` and `Worker` class. +The Worker Service template is available to the .NET CLI, and Visual Studio. For more information, see [.NET CLI, `dotnet new worker` - template](../tools/dotnet-new-sdk-templates.md#web-others). The template consists of a `Program` and `Worker` class. :::code language="csharp" source="snippets/workers/background-service/Program.cs"::: diff --git a/docs/standard/data/xml/recoverable-xslt-errors.md b/docs/standard/data/xml/recoverable-xslt-errors.md index c87bf0cd59326..9903133b1c11b 100644 --- a/docs/standard/data/xml/recoverable-xslt-errors.md +++ b/docs/standard/data/xml/recoverable-xslt-errors.md @@ -46,7 +46,7 @@ The W3C XSL Transformations (XSLT) Version 1.0 Recommendation includes areas in |The `value` attribute of an `xsl:number` is NAN, infinite or less than 0.5|errata 24|Recover| |The second argument node-set to the document function is empty and the URI reference is relative.|errata 14|Recover| - * This behavior is different than that of the class. For more information, see [Implementation of Discretionary Behaviors in the XslTransform Class](implementation-of-discretionary-behaviors-in-the-xsltransform-class.md). + * This behavior is different than that of the class. For more information, see [Implementation of Discretionary Behaviors in the XslTransform Class](/previous-versions/dotnet/framework/data/xml/xslt/implementation-of-discretionary-behaviors-in-the-xsltransform-class). ## See also diff --git a/docs/standard/data/xml/xslt-transformations.md b/docs/standard/data/xml/xslt-transformations.md index 90be8234a8a11..9d26fb90cb3c9 100644 --- a/docs/standard/data/xml/xslt-transformations.md +++ b/docs/standard/data/xml/xslt-transformations.md @@ -24,7 +24,7 @@ The Extensible Stylesheet Language Transformation (XSLT) lets you transform the [XSLT Compiler (xsltc.exe)](xslt-compiler-xsltc-exe.md) Provides information on using the XSLT compiler. - [XSLT Transformations with the XslTransform Class](xslt-transformations-with-the-xsltransform-class.md) + [XSLT Transformations with the XslTransform Class](/previous-versions/dotnet/framework/data/xml/xslt/xslt-transformations-with-the-xsltransform-class) Provides information on using the class. ## Reference From 082a2f4fa713ec064a8f869216374505a692cb63 Mon Sep 17 00:00:00 2001 From: paul cheung Date: Fri, 18 Jun 2021 20:46:32 +0800 Subject: [PATCH 047/105] Update destructors.md (#24732) --- .../csharp/programming-guide/classes-and-structs/destructors.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/csharp/programming-guide/classes-and-structs/destructors.md b/docs/csharp/programming-guide/classes-and-structs/destructors.md index 5db9c087ceeed..4ee3d36b84597 100644 --- a/docs/csharp/programming-guide/classes-and-structs/destructors.md +++ b/docs/csharp/programming-guide/classes-and-structs/destructors.md @@ -69,7 +69,7 @@ For more information about cleaning up resources, see the following articles: - [Cleaning Up Unmanaged Resources](../../../standard/garbage-collection/unmanaged.md) - [Implementing a Dispose Method](../../../standard/garbage-collection/implementing-dispose.md) -- [Implementing a Dispose Method](../../../standard/garbage-collection/implementing-disposeasync.md) +- [Implementing a DisposeAsync Method](../../../standard/garbage-collection/implementing-disposeasync.md) - [using Statement](../../language-reference/keywords/using-statement.md) ## Example From a4023f2350dcb04a458df65a47be4130da6504a3 Mon Sep 17 00:00:00 2001 From: Genevieve Warren <24882762+gewarren@users.noreply.github.com> Date: Fri, 18 Jun 2021 09:23:55 -0700 Subject: [PATCH 048/105] Nullability breaking change updates (#24729) --- .../nullable-ref-type-annotation-changes.md | 27 +++++++++- .../attributes/nullable-analysis.md | 51 ++++++++++--------- 2 files changed, 53 insertions(+), 25 deletions(-) diff --git a/docs/core/compatibility/core-libraries/6.0/nullable-ref-type-annotation-changes.md b/docs/core/compatibility/core-libraries/6.0/nullable-ref-type-annotation-changes.md index f20a198446c1f..66110a64a37bb 100644 --- a/docs/core/compatibility/core-libraries/6.0/nullable-ref-type-annotation-changes.md +++ b/docs/core/compatibility/core-libraries/6.0/nullable-ref-type-annotation-changes.md @@ -1,7 +1,7 @@ --- title: "Breaking change: Nullable reference type annotation changes" description: Learn about the .NET 6 breaking change in core .NET libraries where some nullable reference type annotations have changed. -ms.date: 02/11/2021 +ms.date: 06/17/2021 --- # Changes to nullable reference type annotations @@ -58,10 +58,33 @@ The following table lists the affected APIs: | | `buffer` parameter type is nullable | Breaking | Preview 1 | | | `buffer` parameter type is nullable | Breaking | Preview 1 | | | `subProtocol` parameter type is nullable | Nonbreaking | Preview 2 | -| Methods that override and [many others that return `bool`](https://github.com/dotnet/runtime/pull/47598/files) | `[NotNullWhen(true)]` added to first, nullable parameter | Breaking | Preview 2 | +| Methods that override and [many others that return `bool`](https://github.com/dotnet/runtime/pull/47598/files) | `[NotNullWhen(true)]` added to first nullable parameter | Breaking | Preview 2 | +| | `NotNullWhen(true)` was added to the `obj` parameter | Breaking | Preview 2 | +| | `NotNullWhen(true)` was added to the `o` parameter | Breaking | Preview 2 | +| | `NotNullWhen(true)` was added to the `o` parameter | Breaking | Preview 2 | +| | `NotNullWhen(true)` was added to the `obj` parameter | Breaking | Preview 2 | +| | `NotNullWhen(true)` was added to the `obj` parameter | Breaking | Preview 2 | +| | `NotNullWhen(true)` was added to the `obj` parameter | Breaking | Preview 2 | +| | `NotNullWhen(true)` was added to the `obj` parameter | Breaking | Preview 2 | +| | `NotNullWhen(true)` was added to the `obj` parameter | Breaking | Preview 2 | +| | `NotNullWhen(true)` was added to the `obj` parameter | Breaking | Preview 2 | +| | `NotNullWhen(true)` was added to the `obj` parameter | Breaking | Preview 2 | +| | `NotNullWhen(true)` was added to the `obj` parameter | Breaking | Preview 2 | +| | `NotNullWhen(true)` was added to the `obj` parameter | Breaking | Preview 2 | +| | `NotNullWhen(true)` was added to the `obj` parameter | Breaking | Preview 2 | +| | `NotNullWhen(true)` was added to the `obj` parameter | Breaking | Preview 2 | +| | `NotNullWhen(true)` was added to the `obj` parameter | Breaking | Preview 2 | +| | `NotNullWhen(true)` was added to the `obj` parameter | Breaking | Preview 2 | +| | `NotNullWhen(true)` was added to the `obj` parameter | Breaking | Preview 2 | +| | `NotNullWhen(true)` was added to the `obj` parameter | Breaking | Preview 2 | +| | `NotNullWhen(true)` was added to the `obj` parameter | Breaking | Preview 2 | +| `DateOnly.Equals(System.Object)` | `NotNullWhen(true)` was added to the `value` parameter | Breaking | Preview 2 | +| `TimeOnly.Equals(System.Object)` | `NotNullWhen(true)` was added to the `value` parameter | Breaking | Preview 2 | +| | `NotNullWhen(true)` was added to the `obj` parameter | Breaking | Preview 2 | ## See also +- [Attributes for null-state static analysis](../../../../csharp/language-reference/attributes/nullable-analysis.md) - [Nullable reference type annotation changes in ASP.NET Core](../../aspnet-core/6.0/nullable-reference-type-annotations-changed.md) - - - -``` diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/certificatereference.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/certificatereference.md deleted file mode 100644 index efe31e9f256a0..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/certificatereference.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: 2ac8bc14-e9f1-48fb-b662-f5991558fbe4 -author: "BrucePerlerMS" ---- -# \ - -Specifies settings that are used to find and validate an X.509 certificate in a certificate store. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel-services.md)\ -    [**\**](federationconfiguration.md)\ -      [**\**](servicecertificate.md)\ -        **\** - -## Syntax - -```xml - - - - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|storeName|The name of the X.509 certificate store. The default is "My". Optional.| -|storeLocation|A value that specifies the location of the X.509 certificate store. The default value is "LocalMachine". Optional.| -|x509FindType|An value that specifies the type of search that is to be executed. The default is "FindBySubjectDistinguishedName". Optional.| -|findValue|The value to search for in the X.509 certificate store. Optional.| -|isChainIncluded|Specifies whether validation should be performed by using the certificate chain. The default is "true"; validation is performed by using the certificate chain. Optional.| - -### Child Elements - - None - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](servicecertificate.md)|Configures the certificate that is used to encrypt and decrypt tokens.| - -## Remarks - - The `` element specifies settings that are used to find and validate an X.509 certificate in a certificate store. When it is specified as the child element of the `` element, it specifies the location and verification settings of the X.509 certificate that is used to encrypt and decrypt tokens. The `` element is represented by the class. diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/certificatevalidation.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/certificatevalidation.md deleted file mode 100644 index 514bd5a9b964e..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/certificatevalidation.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: 6c54c704-b55e-4631-88ff-4d4a5621554c -author: "BrucePerlerMS" ---- -# \ - -Controls the settings that token handlers use to validate certificates. These settings are overridden if a specific handler is configured with its own validator. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel.md)\ -    [**\**](identityconfiguration.md)\ -      **\** - -## Syntax - -```xml - - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|certificateValidationMode|An value that specifies the validation mode to use for the X.509 certificate. The default value is "PeerOrChainTrust". To specify a custom validator, set this attribute to "Custom" and specify the validator using the [\](certificatevalidator.md) element. Optional.| -|revocationMode|An value that specifies the revocation mode to use for the X.509 certificate. The default value is "Online". Optional.| -|trustedStoreLocation|A value that specifies the X.509 certificate store. The default value is "LocalMachine". Optional.| - -### Child Elements - -|Element|Description| -|-------------|-----------------| -|[\](certificatevalidator.md)|Specifies a custom type for certificate validation. This type is used only if the `certificateValidationMode` attribute of the [\](certificatevalidation.md) element is set to "Custom".| - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](identityconfiguration.md)|Specifies service-level identity settings.| -|[\](securitytokenhandlerconfiguration.md)|Provides configuration for a collection of security token handlers.| - -## Remarks - - A `` element can be specified at the service level under the `` element or on the security token handler collection level under the `` element. Settings on a token handler collection override those specified on the service. Some token handlers allow you to specify certificate validation settings in configuration. Settings on individual token handlers override those specified both at the service level and on the security token handler collection. - -## Example - -```xml - -``` diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/certificatevalidator.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/certificatevalidator.md deleted file mode 100644 index c90eea3718645..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/certificatevalidator.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: 86161897-c20f-4ad8-9d7f-050c247251bf -author: "BrucePerlerMS" ---- -# \ - -Specifies a custom type for certificate validation. This type is used only if the `certificateValidationMode` attribute of the [\](certificatevalidation.md) element is set to "Custom". - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel.md)\ -    [**\**](identityconfiguration.md)\ -      [**\**](certificatevalidation.md)\ -        **\** - -## Syntax - -```xml - - - - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|type|Specifies a custom type that derives from the class. Set the `certificateValidationMode` attribute of the [\](certificatevalidation.md) element to "Custom" to use this type. For more information about how to specify the `type` attribute, see [Custom Type References](../windows-workflow-foundation/index.md). Optional.| - -### Child Elements - - None - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](certificatevalidation.md)|Controls the settings that token handlers use to validate certificates.| - -## Example - -```xml - - - -``` diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/chunkedcookiehandler.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/chunkedcookiehandler.md deleted file mode 100644 index 49edf3c33d005..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/chunkedcookiehandler.md +++ /dev/null @@ -1,69 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: 7220de45-1d14-4aec-a29e-4a2ea8ac861f -author: "BrucePerlerMS" ---- -# \ - -Configures the . This element may only be present if the `mode` attribute of the `` element is "Default" or "Chunked". - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel-services.md)\ -    [**\**](federationconfiguration.md)\ -      [**\**](cookiehandler.md)\ -        **\** - -## Syntax - -```xml - - - - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|chunkSize|The maximum size, in characters, of the HTTP cookie data for any one HTTP cookie. You must be careful when adjusting the chunk size. Web browsers have different limits on the size of cookies and number allowed per domain. For example, the original Netscape specification stipulated these limits: 300 cookies total, 4096 bytes per cookie header (including metadata, not just the cookie value), and 20 cookies per domain. The default is 2000. Required.| - -### Child Elements - - None - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](cookiehandler.md)|Configures the that the (SAM) uses to read and write cookies.| - -## Remarks - - When you specify a by setting the `mode` attribute of the `` element to "Default" or "Chunked", you can specify the chunk size that the cookie handler uses to read and write cookies by including a `` child element and setting its `chunkSize` attribute. If the `` element is not present, the default chunk size of 2000 bytes is used. This element cannot be specified when the `mode` attribute is set to "Custom". - - The `` element is represented by the class. - -## Example - - The following example configures a chunked cookie handler that writes cookies in chunks of 3000 bytes. - -```xml - - - -``` - -## See also - -- diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/claimsauthenticationmanager.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/claimsauthenticationmanager.md deleted file mode 100644 index ec97bdc13d67c..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/claimsauthenticationmanager.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: 6d30a450-6d13-4671-81a8-77e0204500c5 -author: "BrucePerlerMS" ---- -# \ - -Registers a claims authentication manager for the incoming claims. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel.md)\ -    [**\**](identityconfiguration.md)\ -      **\** - -## Syntax - -```xml - - - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|type|Specifies a custom type that derives from the class. For more information about how to specify the `type` attribute, see [Custom Type References].| - -### Child Elements - - If there is no `type` attribute, or if the `type` attribute references the class, the `` element does not take child elements; however, classes derived from can define child configuration elements. - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](identityconfiguration.md)|Specifies service-level identity settings.| - -## Remarks - - The default behavior provided through the class echoes the incoming claims. If no `type` attribute is specified or if the `type` attribute specifies the class, the `` element does not take child elements. You can specify the `type` attribute to register a type derived from the class to implement custom behavior. Derived classes can support configuration through child elements of the `` element by overriding the method to handle these elements. The schema defined for the child elements is up to the designer of the class. - - The `` element sets the property. - -## Example - -```xml - - - - - -``` diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/claimsauthorizationmanager.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/claimsauthorizationmanager.md deleted file mode 100644 index 352be81f5db59..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/claimsauthorizationmanager.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: 9354eee3-f692-4ad6-8427-3169686b8bcc -author: "BrucePerlerMS" ---- -# \ - -Registers a claims authorization manager for the incoming claims. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel.md)\ -    [**\**](identityconfiguration.md)\ -      **\** - -## Syntax - -```xml - - - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|type|A custom type that derives from the class. For more information about how to specify the `type` attribute, see [Custom Type References](../windows-workflow-foundation/index.md).| - -### Child Elements - - If there is no `type` attribute, or if the `type` attribute references the class, the `` element does not take child elements; however, classes derived from can define child configuration elements. - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](identityconfiguration.md)|Specifies service-level identity settings.| - -## Remarks - - The default behavior provided through the class always authorizes the incoming claims. If no `type` attribute is specified or if the `type` attribute specifies the class, the `` element does not take child elements. You can specify the `type` attribute to register a type derived from the class to implement custom behavior. Derived classes can support configuration through child elements of the `` element by overriding the method to handle these elements. The schema defined for the child elements is up to the designer of the class. - -> [!IMPORTANT] -> When using the or the class to provide claims-based access control in your code, the identity configuration that is referenced by the `` element configures the claims authorization manager and policy that is used to make authorization decisions. This is true, even in scenarios that are not passive Web scenarios, for example Windows Communication Foundation (WCF) applications or an application that is not Web-based. If the application is not a passive Web application, the `` element (and its child policy elements, if present) of the referenced identity configuration are the only settings applied. All other settings are ignored. For more information, see the [\](federationconfiguration.md) element. - - This element sets the property. - -## Example - - The following XML shows the configuration for a claims authorization manager that implements policy composed of resource-action pairs each of which specifies boolean combinations of the claims that a requestor must possess to perform the action on the resource. The code that implements the claims authorization manager capable of using this policy can be found in the `ClaimsBasedAuthorization` sample. - -```xml - - - - - - - - - - - - - - - - - - - - - - - - -``` diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/claimtype.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/claimtype.md deleted file mode 100644 index 332342b7d0cd0..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/claimtype.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: d17b5831-9a2c-45c4-b0d1-68f48e72e861 -author: "BrucePerlerMS" ---- -# \ - -Specifies a single optional or required claim for incoming security tokens. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel.md)\ -    [**\**](identityconfiguration.md)\ -      [**\**](claimtyperequired.md)\ -        **\** - -## Syntax - -```xml - - - - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|type|The claim type. Typically a URI. Required.| -|optional|A boolean value that specifies whether the claim type is optional. Optional.| - -### Child Elements - - None - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](claimtyperequired.md)|Specifies the set of required claims for incoming security tokens.| diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/claimtyperequired.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/claimtyperequired.md deleted file mode 100644 index d7f34e37b8658..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/claimtyperequired.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: c469d71f-6c77-4a24-97aa-53efa126ceef -author: "BrucePerlerMS" ---- -# \ - -Specifies the set of required claims for incoming security tokens. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel.md)\ -    [**\**](identityconfiguration.md)\ -      **\** - -## Syntax - -```xml - - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - - None - -### Child Elements - -|Element|Description| -|-------------|-----------------| -|[\](claimtype.md)|Specifies a single optional or required claim for incoming security tokens.| - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](identityconfiguration.md)|Specifies service-level identity settings.| diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/clear.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/clear.md deleted file mode 100644 index 6e3ecf73f169f..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/clear.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: 54dcd1d1-038f-4fc8-a3a4-56ba7a1ca0fd -author: "BrucePerlerMS" ---- -# \ - -Clears all security token handlers from the current token handler collection. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel.md)\ -    [**\**](identityconfiguration.md)\ -      [**\**](securitytokenhandlers.md)\ -        **\** - -## Syntax - -```xml - - - - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - - None - -### Child Elements - - None - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](securitytokenhandlers.md)|Specifies a collection of security token handlers that are registered with the endpoint.| diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/cookiehandler.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/cookiehandler.md deleted file mode 100644 index 26f42e4b0ae3f..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/cookiehandler.md +++ /dev/null @@ -1,90 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: bfdc127f-8d94-4566-8bef-f583c6ae7398 -author: "BrucePerlerMS" ---- -# \ - -Configures the that the (SAM) uses to read and write cookies. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel-services.md)\ -    [**\**](federationconfiguration.md)\ -      **\** - -## Syntax - -```xml - - - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|name|Specifies the base name for any cookies written. The default is "FedAuth".| -|path|Specifies the path value for any cookies written. The default is "HttpRuntime.AppDomainAppVirtualPath".| -|mode|One of the values that specifies the kind of cookie handler used by the SAM. The following values may be used:

- "Default" — The same as "Chunked".
- "Chunked" — Uses an instance of the class. This cookie handler ensures that individual cookies do not exceed a set maximum size. It accomplishes this by potentially "chunking" one logical cookie into a number of cookies on-the-wire.
- "Custom" — Uses an instance of a custom class derived from . The derived class is referenced by the `` child element.

The default is "Default".| -|persistentSessionLifetime|Specifies the lifetime of persistent sessions. If zero, transient sessions are always used. The default value is "0:0:0", which specifies a transient session. The maximum value is "365:0:0", which specifies a session of 365 days. The value should be specified according to the following restriction: ``, where the leftmost value specifies days, the middle value (if present) specifies hours, and the rightmost value (if present) specifies minutes.| -|requireSsl|Specifies whether the "Secure" flag is emitted for any cookies written. If this value is set, the sign-in session cookies will only be available over HTTPS. The default is "true".| -|hideFromScript|Controls whether the "HttpOnly" flag is emitted for any cookies written. Certain web browsers honor this flag by keeping client-side script from accessing the cookie value. The default is "true".| -|domain|The domain value for any cookies written. The default is "".| - -### Child Elements - -|Element|Description| -|-------------|-----------------| -|[\](chunkedcookiehandler.md)|Configures the . This element may only be present if the `mode` attribute of the `` element is "Default" or "Chunked".| -|[\](customcookiehandler.md)|Sets the custom cookie handler type. This element must be present if the `mode` attribute of the `` element is "Custom". It cannot be present for any other values of the `mode` attribute. The custom type must be derived from the class.| - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](federationconfiguration.md)|Contains the settings that configure the (WSFAM) and the (SAM).| - -## Remarks - - The is responsible for reading and writing raw cookies at the HTTP protocol level. You can configure either a or a custom cookie handler derived from the class. - - To configure a chunked cookie handler, set the mode attribute to "Chunked" or "Default". The default chunk size is 2000 bytes, but you may optionally specify a different chunk size by including a `` child element. - - To configure a custom cookie handler, set the mode attribute to "Custom". You must also specify a `` child element that references the type of your custom handler. - - The `` element is represented by the class. The cookie handler that was specified in configuration is available from the property of the object set on the property. - -## Example - - The following XML shows a `` element. In this example, because the `mode` attribute is not specified, the default cookie handler will be used by the SAM. This is an instance of the class. Because the `` child element is not specified, the default chunk size will be used. HTTPS will not be required because the `requireSsl` attribute is set `false`. - -> [!WARNING] -> In this example, HTTPS is not required to write session cookies. This is because the `requireSsl` attribute on the `` element is set to `false`. This setting is not recommended for most production environments as it may present a security risk. - -```xml - -``` - -## See also - -- -- -- diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/customcookiehandler.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/customcookiehandler.md deleted file mode 100644 index 87751dbcfa554..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/customcookiehandler.md +++ /dev/null @@ -1,69 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: a03b153d-5ec6-4915-9031-6f0c3fd348be -author: "BrucePerlerMS" ---- -# \ - -Sets the custom cookie handler type. This element may only be present if the `mode` attribute of the `` element is "Custom". The custom type must be derived from the class. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel-services.md)\ -    [**\**](federationconfiguration.md)\ -      [**\**](cookiehandler.md)\ -        **\** - -## Syntax - -```xml - - - - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|type|Specifies a custom type that derives from the class. For more information about how to specify the `type` attribute, see [Custom Type References](../windows-workflow-foundation/index.md).| - -### Child Elements - - None - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](cookiehandler.md)|Configures the that the uses to read and write cookies.| - -## Remarks - - When you specify a custom cookie handler by setting the `mode` attribute of the `` element to "Custom", you must specify the type of the custom cookie handler by including a `` child element that references the cookie handler type. This element cannot be specified when the `mode` attribute is set to "Chunked" or "Default". Custom cookie handlers must derive from the class. - - The `` element is represented by the class. - -## Example - - The following example configures the SAM to use a custom cookie handler of type `MyNamespace.MyCustomCookieHandler`. - -```xml - - - -``` - -## See also - -- diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/federationconfiguration.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/federationconfiguration.md deleted file mode 100644 index 1e5bf6565e638..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/federationconfiguration.md +++ /dev/null @@ -1,99 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: 8b14054c-6d07-46ab-ab58-03f14beac0f2 -author: "BrucePerlerMS" ---- -# \ - -Configures the (WSFAM) and the (SAM) when using federated authentication through the WS-Federation protocol. Configures the when using the or the class to provide claims-based access control. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel-services.md)\ -    **\** - -## Syntax - -```xml - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|name|The name of this federation configuration element. This attribute primarily provides an extensibility point for future protocols. Optional.| -|identityConfigurationName|The name of the identity configuration section as specified in an [\](identityconfiguration.md) element to use. If this attribute is not specified, the default identity configuration section is used. Optional.| - -### Child Elements - -|Element|Description| -|-------------|-----------------| -|[\](cookiehandler.md)|Configures the cookie handler used by the SAM. Optional.| -|[\](servicecertificate.md)|Configures the certificate that is used to encrypt and decrypt tokens. Optional.| -|[\](wsfederation.md)|Configures the WS-Federation Authentication Module (WSFAM). Optional.| - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](system-identitymodel-services.md)|Configuration section for authentication using the WS-Federation protocol.| - -## Remarks - - The \ element provides settings in two different scenarios: - -- When using WS-Federation in a passive Web application, the element contains settings that configure the (WSFAM) and the (SAM). It also references the identity configuration to be used to configure security token handlers and certificates, and components like the claims authorization manager and the claims authentication manager. - -- When using the or the class to provide claims-based access control in your code, the element references the identity configuration that configures the claims authorization manager and policy that is used to make authorization decisions. This is true, even in scenarios that are not passive Web scenarios; for example, Windows Communication Foundation (WCF) applications or an application that is not Web-based. If the application is not a passive Web application, the [\](claimsauthorizationmanager.md) element (and its child policy elements, if present) of the identity configuration referenced by the `` element are the only settings applied. All others are ignored. - - Regardless of the scenario, the runtime loads the default federation configuration. The behavior is defined as follows: - -1. If there is no `` element present, the runtime creates a federation configuration and populates it with default values. This default federation configuration will reference the default identity configuration. - -2. If a single `` element is present, it is the default federation configuration regardless of whether it is named or unnamed. If its `identityConfiguration` attribute is specified, the named identity configuration is referenced; otherwise, the default identity configuration is referenced. - -3. If an unnamed `` element is present, it is the default federation configuration. If its `identityConfiguration` attribute is specified, the named identity configuration is referenced; otherwise, the default identity configuration is referenced. - -4. If multiple named `` elements are present and no unnamed `` element is present, an exception is thrown. - - Typically, only a single `` section is defined. This section is the default federation configuration. You may specify multiple, uniquely-named `` elements; however, in this case, if you want to load a federation configuration other than the unnamed one, you must provide a handler for the. event and set the property inside the handler to a object initialized with values from the appropriate `` element in the configuration file. - - The `` element is represented by the class. The configuration object itself is represented by the class. A single instance is set on the property and provides federated configuration for the application. - -## Example - - The following XML shows a `` element that specifies settings for the WSFAM and specifies that the default cookie handler (an instance of the class) be used by the SAM. - -> [!WARNING] -> In this example, neither the cookie handler nor WSFAM are required to use HTTPS. This is because the `requireHttps` attribute on the `` element and the `requireSsl` attribute on the `` are `false`. These settings are not recommended for most production environments as they may present a security risk. - -```xml - - - - - - -``` - -## See also - -- -- -- -- [\](identityconfiguration.md) diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/identityconfiguration.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/identityconfiguration.md deleted file mode 100644 index 6e58ea41ee947..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/identityconfiguration.md +++ /dev/null @@ -1,100 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: 1db76253-07da-447b-9e7a-3705c7228cf4 -author: "BrucePerlerMS" ---- - -# \ - -Specifies service-level identity settings. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel.md)\ -    **\** - -## Syntax - -```xml - - - maximumClockSkew=TimeSpan > - - -``` - -## Attributes and Elements - -The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|name|The name of the identity configuration section. You can use this name to reference a specific configuration section. If no `name` attribute is specified, the section defines the default configuration. The default configuration is always used for passive federation scenarios. For more information, see the [\](federationconfiguration.md) element.| -|saveBootstrapContext|Specifies whether bootstrap tokens should be included in the session token. The value may also be set on a token handler collection by setting the `saveBootstrapContext` attribute on the [\](securitytokenhandlerconfiguration.md) element. A value set on the token handler collection overrides the value set on the service.| -|maximumClockSkew|A that specifies the maximum allowed clock skew. Controls the maximum allowed clock skew when performing time-sensitive operations, such as validating the expiration time of a sign-in session. The default is 5 minutes, "00:05:00". For more information about how to specify values, see [Timespan Values](../windows-workflow-foundation/index.md). The maximum clock skew may also be set on a token handler collection by setting the `maximumClockSkew` attribute on the [\](securitytokenhandlerconfiguration.md) element. A value set on the token handler collection overrides the value set on the service.| - -### Child Elements - -|Element|Description| -|-------------|-----------------| -|[\](caches.md)|Registers the caches used for session tokens and token replay detection. Can be specified at the service-level or on a security token handler collection. Optional.| -|[\](certificatevalidation.md)|Controls the settings that token handlers use to validate certificates. Can be specified at the service-level or on a security token handler collection. Optional.| -|[\](claimsauthenticationmanager.md)|Registers a claims authentication manager for the incoming claims. Optional.| -|[\](claimsauthorizationmanager.md)|Registers a claims authorization manager for the incoming claims. Optional.| -|[\](claimtyperequired.md)|Specifies the set of required claims for incoming security tokens. Optional.| -|[\](securitytokenhandlers.md)|Specifies a collection of security token handlers. Zero or more collections of security token handlers can be specified. Optional.| -|[\](tokenreplaydetection.md)|Enables token replay detection and specifies the expiration time for tokens. Can be specified at the service-level or on a security token handler collection. Optional.| - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](system-identitymodel.md)|Provides configuration for enabling Windows Identity Foundation (WIF) options in applications.| - -## Remarks - -Multiple identity configurations may be defined, each with a unique name. The behavior is as follows: - -1. If no `` element is specified. A default identity configuration is created at runtime and populated with default values. - -2. If a single `` element is specified. It is the default identity configuration. It does not matter whether it is named or unnamed. - -3. If multiple `` elements are specified. The unnamed element specifies the default identity configuration. It is recommended that when you specify multiple `` elements, one of them should be unnamed. - -> [!WARNING] -> If you specify multiple `` elements, one of them should be unnamed. The unnamed element will be the default identity configuration. - - Some of the settings specified in the `` element can be overridden by settings on a security token handler collection or by settings on individual security token handlers. - -> [!IMPORTANT] -> When using the or the class to provide claims-based access control in your code, the identity configuration that is referenced by the `` element configures the claims authorization manager and policy that is used to make authorization decisions. This is true, even in scenarios that are not passive Web scenarios, for example Windows Communication Foundation (WCF) applications or an application that is not Web-based. If the application is not a passive Web application, the [\](claimsauthorizationmanager.md) element (and its child policy elements, if present) of the referenced identity configuration are the only settings applied. All other settings are ignored. For more information, see the [\](federationconfiguration.md) element. - -The `` element is represented by the class. An identity configuration section is represented by the class. - -> [!IMPORTANT] -> Specifying the following elements as child elements of the `` element has been deprecated, although the behavior is still supported for backward compatibility. These elements should, instead, be specified under the [\](securitytokenhandlerconfiguration.md) element. -> -> - [\](audienceuris.md) -> - [\](issuernameregistry.md) -> - [\](issuertokenresolver.md) -> - [\](servicetokenresolver.md) - -## Example - -The following example creates an identity configuration named "alternateConfiguration". The identity configuration specifies default settings. - -```xml - - - -``` - -## See also - -- -- diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/index.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/index.md deleted file mode 100644 index 9bb7dc87017e6..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/index.md +++ /dev/null @@ -1,111 +0,0 @@ ---- -description: "Learn more about: Windows Identity Foundation Configuration Schema" -title: "Windows Identity Foundation Configuration Schema" -ms.date: "03/30/2017" -ms.assetid: 4d4f6d76-49a5-4bad-b345-097b2e2844e9 -author: "BrucePerlerMS" ---- -# Windows Identity Foundation Configuration Schema - -The topics in this section provide information about the Windows Identity Foundation (WIF) configuration schema. You can also configure an application to use WIF through classes exposed by the framework. These classes are noted in the sections that treat relevant elements in the schema. The following shows the basic XML tag structure exposed by the WIF configuration schema. Attributes are omitted. Highlighted comments indicate major components of the schema. - -```xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -``` - -## In This Section - -[\](system-identitymodel.md) Provides configuration for enabling WIF options in applications. - -[\](system-identitymodel-services.md) Provides configuration for passive federation using WIF. Configures the Session Authentication Module (SAM) and the Federated Authentication Module (WSFAM). diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/issuernameregistry.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/issuernameregistry.md deleted file mode 100644 index be06f87f03ad0..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/issuernameregistry.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: 58b39d12-c953-40c4-88af-d7eb3343ca28 -author: "BrucePerlerMS" ---- -# \ - -Configures the issuer name registry that is used by handlers in the token handler collection. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel.md)\ -    [**\**](identityconfiguration.md)\ -      [**\**](securitytokenhandlers.md)\ -        [**\**](securitytokenhandlerconfiguration.md)\ -          **\** - -## Syntax - -```xml - - - - - - - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|type|A type that derives from the class. For more information about how to specify a custom `type`, see [Custom Type References].| - -### Child Elements - -|Element|Description| -|-------------|-----------------| -|[\](trustedissuers.md)|When the `type` attribute specifies the configuration-based issuer name registry (the class), the [\](trustedissuers.md) element must be specified. The [\](trustedissuers.md) element can take ``, ``, or `` elements as child elements.| - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](securitytokenhandlerconfiguration.md)|Provides configuration for a collection of security token handlers.| - -## Remarks - - All issuer tokens are validated using an issuer name registry. This is an object that derives from the class. The issuer name registry is used to associate a mnemonic name to the cryptographic material that is needed to verify the signatures of tokens produced by the corresponding issuer. The issuer name registry maintains a list of issuers that are trusted by the relying party (RP) application. The type of the issuer name registry is specified using the `type` attribute. The `` element can have one or more child elements that provide configuration for the specified type. You provide the logic that processes these child elements by overriding the method. - - WIF provides a single issuer name registry type out of the box, the class. This class uses a set of trusted issuer certificates that are specified in configuration. It requires a child configuration element, ``, under which the collection of trusted issuer certificates is configured. Trusted certificates are specified using the ASN.1 encoded form of the certificate thumbprint and are added or removed from the collection by using ``, ``, or `` elements. - - The `` element is represented by the class. - -> [!NOTE] -> Specifying the `` element as a child element of the [\](identityconfiguration.md) element has been deprecated, but is still supported for backward compatibility. Settings on the `` element override those on the `` element. - -## Example - - The following XML shows how to specify the configuration based issuer name registry. - -```xml - - - - - -``` - -## See also - -- -- diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/issuertokenresolver.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/issuertokenresolver.md deleted file mode 100644 index 85abe5baa4b62..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/issuertokenresolver.md +++ /dev/null @@ -1,93 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: f74392f6-3f5b-4880-bd8a-3a9130d31e65 -author: "BrucePerlerMS" ---- -# \ - -Registers the issuer token resolver that is used by handlers in the token handler collection. The issuer token resolver is used to resolve the signing token on incoming tokens and messages. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel.md)\ -    [**\**](identityconfiguration.md)\ -      [**\**](securitytokenhandlers.md)\ -        [**\**](securitytokenhandlerconfiguration.md)\ -          **\** - -## Syntax - -```xml - - - - - - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|type|Specifies the type of the issuer token resolver. Must be either the class or a type that derives from the class. Required.| - -### Child Elements - - None - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](securitytokenhandlerconfiguration.md)|Provides configuration for a collection of security token handlers.| - -## Remarks - - The issuer token resolver is used to resolve the signing token on incoming tokens and messages. It is used to retrieve the cryptographic material that is used for checking the signature. You must specify the `type` attribute. The type specified can be either or a custom type that derives from the class. - - Some token handlers allow you to specify issuer token resolver settings in configuration. Settings on individual token handlers override those specified on the security token handler collection. - -> [!NOTE] -> Specifying the `` element as a child element of the [\](identityconfiguration.md) element has been deprecated, but is still supported for backward compatibility. Settings on the `` element override those on the `` element. - -## Example - - The following XML shows configuration for an issuer token resolver that is based on a custom class that derives from . The token resolver maintains a dictionary of audience-key pairs that is initialized from a custom configuration element (``) defined for the class. The class overrides the method to process this element. The override is shown in the following example; however, the methods it calls are not shown for brevity. For the complete example, see the `CustomToken` sample. - -```xml - - - -``` - -## Example - -```csharp -public override void LoadCustomConfiguration(System.Xml.XmlNodeList nodelist) -{ - foreach (XmlNode node in nodelist) - { - XmlDictionaryReader rdr = XmlDictionaryReader.CreateDictionaryReader(new XmlTextReader(new StringReader(node.OuterXml))); - rdr.MoveToContent(); - - string symmetricKey = rdr.GetAttribute("symmetricKey"); - string audience = rdr.GetAttribute("audience"); - - this.AddAudienceKeyPair(audience, symmetricKey); - } -} -``` - -## See also - -- diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/nameclaimtype.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/nameclaimtype.md deleted file mode 100644 index 33e6cbe859668..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/nameclaimtype.md +++ /dev/null @@ -1,73 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: 17514d95-f0f5-4789-8e28-346640dc227c -author: "BrucePerlerMS" ---- -# \ - -Sets the claim type that specifies the property. The claim type is used to search for a in the collection of objects returned by the method of this token handler. The value of the matching claim is then set as the name of the generated from this token handler. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel.md)\ -    [**\**](identityconfiguration.md)\ -      [**\**](securitytokenhandlers.md)\ -        [**\**](add.md)\ -          [**\**](samlsecuritytokenrequirement.md)\ -            **\** - -## Syntax - -```xml - - - - - - - - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|value|A string that specifies the URI that represents the claim type of the claim to use for the property. Required.| - -### Child Elements - - None - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](samlsecuritytokenrequirement.md)|Provides configuration for the class, the class, or a derived class of either of these classes.| - -## Remarks - - The `` element sets the property when a object is initialized from configuration. - -## Example - -```xml - - - - - -``` - -## See also - -- diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/remove.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/remove.md deleted file mode 100644 index 42e9d20641469..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/remove.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: 4058e2f1-7db4-4d1a-84dd-1b52836f2ae6 -author: "BrucePerlerMS" ---- -# \ - -Removes the specified security token handler from the token handler collection. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel.md)\ -    [**\**](identityconfiguration.md)\ -      [**\**](securitytokenhandlers.md)\ -        **\** - -## Syntax - -```xml - - - - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|type|The CLR type name of the token handler to be removed. For more information about how to specify the `type` attribute, see [Custom Type References](/previous-versions/windows-identity-foundation/gg638728(v=msdn.10)#custom-type-references). Required.| - -### Child Elements - - None - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](securitytokenhandlers.md)|Specifies a collection of security token handlers that are registered with the endpoint.| - -## Example - - The following XML shows the use of the `` and `` elements to replace the default session token handler with a custom session token handler. The XML is taken from the `ClaimsAwareWebFarm` sample. - -```xml - - - - -``` diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/roleclaimtype.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/roleclaimtype.md deleted file mode 100644 index d07743046e3eb..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/roleclaimtype.md +++ /dev/null @@ -1,73 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: 69a49deb-6369-41ba-806b-ae8d21fac64b -author: "BrucePerlerMS" ---- -# \ - -Specifies the claim type that defines the role type claims in the collection of objects returned by the method of the token handler. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel.md)\ -    [**\**](identityconfiguration.md)\ -      [**\**](securitytokenhandlers.md)\ -        [**\**](add.md)\ -          [**\**](samlsecuritytokenrequirement.md)\ -            **\** - -## Syntax - -```xml - - - - - - - - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|value|A string that specifies the URI that represents the claim type of the claim to use for the role claim type.| - -### Child Elements - - None - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](samlsecuritytokenrequirement.md)|Provides configuration for the class, the class, or a derived class of either of these classes.| - -## Remarks - - The `` element sets the property when a object is initialized from configuration. - -## Example - -```xml - - - - - -``` - -## See also - -- diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/samlsecuritytokenrequirement.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/samlsecuritytokenrequirement.md deleted file mode 100644 index c82c340ca6415..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/samlsecuritytokenrequirement.md +++ /dev/null @@ -1,85 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: 09202d12-88d3-49cc-953b-703bcc1690eb -author: "BrucePerlerMS" ---- -# \ - -Provides configuration for the class, the class, or a derived class of either of these classes. Represented by the class. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel.md)\ -    [**\**](identityconfiguration.md)\ -      [**\**](securitytokenhandlers.md)\ -        [**\**](add.md)\ -          **\** - -## Syntax - -```xml - - - - - - - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|mapToWindows|Specifies whether the token handler should map the validating token to a Windows account by using the incoming UPN claim. The default is "false".| -|issuerCertificateRevocationMode|An value that specifies the revocation mode to use for the X.509 certificate. The default value is "Online".| -|issuerCertificateValidationMode|An value that specifies the validation mode to use for the X.509 certificate. The default value is "PeerOrChainTrust".| -|issuerCertificateTrustedStoreLocation|A value that specifies the X.509 certificate store. The default value is "LocalMachine".| -|issuerCertificateValidator|A custom type that derives from . If the `issuerCertificateValidationMode` attribute is "Custom", an instance of this type is used for issuer certificate validation.| - -### Child Elements - -|Element|Description| -|-------------|-----------------| -|[\](nameclaimtype.md)|Sets the claim type that specifies the property.| -|[\](roleclaimtype.md)|Specifies the claim type that defines the role type claims in the collection of objects returned by the method of the token handler.| - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](add.md)|Adds the specified security token handler to the token handler collection.| - -## Remarks - - The `` element is represented by the class in the object model and is used to configure the `SamlSecurityTokenRequirement` property on a or a . - -## Example - -```xml - - - - - - - -``` diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/securitytokenhandlerconfiguration.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/securitytokenhandlerconfiguration.md deleted file mode 100644 index 62fe64dbeda0c..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/securitytokenhandlerconfiguration.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: 28724cc6-020c-4a06-9a1f-d7594f315019 -author: "BrucePerlerMS" ---- -# \ - -Provides configuration for the collection of token handlers. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel.md)\ -    [**\**](identityconfiguration.md)\ -      [**\**](securitytokenhandlers.md)\ -        **\** - -## Syntax - -```xml - - - - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|saveBootstrapContext|Specifies whether bootstrap tokens should be included in the session token. The value may also be set on a token handler collection by setting the `saveBootstrapContext` attribute on the [\](identityconfiguration.md) element. A value set on the token handler collection overrides the value set on the service.| -|maximumClockSkew|A that specifies the maximum allowed clock skew. Controls the maximum allowed clock skew when performing time-sensitive operations, such as validating the expiration time of a sign-in session. The default is 5 minutes, "00:05:00". For more information about how to specify values, see [Timespan Values](../windows-workflow-foundation/index.md). The maximum clock skew may also be set at the service level by setting the `maximumClockSkew` attribute on the [\](identityconfiguration.md) element. A value set on the token handler collection overrides the value set on the service.| - -### Child Elements - -|Element|Description| -|-------------|-----------------| -|[\](audienceuris.md)|Specifies the set of URIs that are acceptable identifiers of this relying party. Optional.| -|[\](caches.md)|Registers the caches used for session tokens and token replay detection. Can be specified at the service-level or on a security token handler collection. Optional.| -|[\](certificatevalidation.md)|Controls the settings that token handlers use to validate certificates. Can be specified at the service-level or on a security token handler collection. These settings are overridden if a specific handler is configured with its own validator. Optional.| -|[\](issuernameregistry.md)|Configures the issuer name registry that is used by handlers in the token handler collection. Optional.| -|[\](issuertokenresolver.md)|Registers the issuer token resolver that is used by handlers in the token handler collection. The issuer token resolver is used to resolve the signing token on incoming tokens and messages. Optional.| -|[\](servicetokenresolver.md)|Registers the service token resolver that is used by handlers in the token handler collection. The service token resolver is used to resolve the encryption token on incoming tokens and messages. Optional.| -|[\](tokenreplaydetection.md)|Enables token replay detection and specifies the expiration time for tokens. Can be specified at the service-level or on a security token handler collection. Optional.| - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](securitytokenhandlers.md)|Specifies a collection of security token handlers that are registered with the endpoint.| - -## Remarks - - This section provides property values for a object. Settings configured in this section override those configured on the service. Some of these settings can, in turn, be overridden by settings that are specified when a handler is added to the security token handler collection. - -## Example - -```xml - - - - - - - - - - - - - - - - - - - - - - - - -``` diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/securitytokenhandlers.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/securitytokenhandlers.md deleted file mode 100644 index 3bfe1a67a9bc2..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/securitytokenhandlers.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: f11a631d-4094-4e11-bb03-4ede74b30281 -author: "BrucePerlerMS" ---- -# \ - -Specifies a collection of security token handlers that are registered with the endpoint. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel.md)\ -    [**\**](identityconfiguration.md)\ -      **\** - -## Syntax - -```xml - - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|name|Specifies the name of a token handler collection. The only values recognized by the framework are "ActAs" and "OnBehalfOf". If token handler collections are specified with either of these names, the collection will be used when processing ActAs or OnBehalfOf tokens respectively.| - -### Child Elements - -|Element|Description| -|-------------|-----------------| -|[\](add.md)|Adds a security token handler to the token handler collection.| -|[\](clear.md)|Clears all security token handlers from the token handler collection.| -|[\](remove.md)|Removes a security token handler from the token handler collection.| -|[\](securitytokenhandlerconfiguration.md)|Provides configuration for the collection of token handlers.| - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](identityconfiguration.md)|Specifies service-level identity settings.| - -## Remarks - - You can specify one or more named collections of security token handlers in a service configuration. You can specify a name for a collection by using the `name` attribute. The only names that the framework handles are "ActAs" and "OnBehalfOf". If handlers exist in these collections, they are used by a security token service (STS) instead of the default handlers when processing `ActAs` and `OnBehalfOf` tokens. - - By default, the collection is populated with the following handler types: , , , , , , and . You can modify the collection by using the ``, ``, and `` elements. You must ensure that only a single handler of any particular type exists in the collection. For example, if you derive a handler from the class, either your handler or the may be configured in a single collection, but not both. - - Use the `` element to specify configuration settings for the handlers in the collection. Settings specified through this element override those specified on the service through the [\](identityconfiguration.md) element. Some handlers (including several of the built-in handler types) can support additional configuration through a child element of the `` element. Settings specified on a handler override equivalent settings specified on the collection or the service. diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/servicecertificate.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/servicecertificate.md deleted file mode 100644 index fa3f002c360a5..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/servicecertificate.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: 42c7f291-2ec3-43c5-8872-35897ff3c660 -author: "BrucePerlerMS" ---- -# \ - -Configures the X.509 certificate that is used to encrypt and decrypt tokens. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel-services.md)\ -    [**\**](federationconfiguration.md)\ -      **\** - -## Syntax - -```xml - - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - - None - -### Child Elements - -|Element|Description| -|-------------|-----------------| -|[\](certificatereference.md)|Specifies settings that are used to find and validate an X.509 certificate in a certificate store.| - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](federationconfiguration.md)|Contains the settings that configure the (WSFAM) and the (SAM).| - -## Example - - The following XML shows the use of the \ element. The XML is taken from the `CustomToken` sample. - -```xml - - - -``` diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/servicetokenresolver.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/servicetokenresolver.md deleted file mode 100644 index dcea10ad4324d..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/servicetokenresolver.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: 6e9001e1-e064-4f47-84b2-46225c177746 -author: "BrucePerlerMS" ---- -# \ - -Registers the service token resolver that is used by handlers in the token handler collection. The service token resolver is used to resolve the encryption token on incoming tokens and messages. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel.md)\ -    [**\**](identityconfiguration.md)\ -      [**\**](securitytokenhandlers.md)\ -        [**\**](securitytokenhandlerconfiguration.md)\ -          **\** - -## Syntax - -```xml - - - - - - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|type|Specifies the type of the service token resolver. Either the type or a type that derives from the class. For more information about how to specify the `type` attribute, see [Custom Type References]. Required.| - -### Child Elements - - None - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](securitytokenhandlerconfiguration.md)|Provides configuration for a collection of security token handlers.| - -## Remarks - - The service token resolver can be used to resolve the encryption token on incoming tokens and messages. It is used to retrieve the key that should be used to decrypt incoming tokens. You must specify the `type` attribute. The type specified can be either or a custom type that derives from the class. - - Some token handlers allow you to specify service token resolver settings in configuration. Settings on individual token handlers override those specified on the security token handler collection. - -> [!NOTE] -> Specifying the `` element as a child element of the [\](identityconfiguration.md) element has been deprecated, but is still supported for backward compatibility. Settings on the `` element override those on the `` element. - -## Example - -```xml - -``` diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/sessionsecuritytokencache.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/sessionsecuritytokencache.md deleted file mode 100644 index 897d05a3745cd..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/sessionsecuritytokencache.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: d43e676c-0153-485c-ab31-0257a2db7507 -author: "BrucePerlerMS" ---- -# \ - -Registers a cache for session tokens with a service or a security token handler collection. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel.md)\ -    [**\**](identityconfiguration.md)\ -      [**\**](caches.md)\ -        **\** - -## Syntax - -```xml - - - - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|type|A type that derives from the class.| - -### Child Elements - - None - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](caches.md)|Registers the caches used by a service or a security token handler collection.| - -## Example - - The following XML shows the configuration of a custom cache for holding session security tokens (). The configuration is taken from the `ClaimsAwareWebFarm` sample. For more information about this sample, see [WIF Code Sample Index](/previous-versions/dotnet/framework/security/wif-code-sample-index). - -```xml - - - - - - -``` - -## See also - -- diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/sessiontokenrequirement.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/sessiontokenrequirement.md deleted file mode 100644 index 24d4abe5b716f..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/sessiontokenrequirement.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: 496a1735-cbb7-49d5-a6aa-dd5550462073 -author: "BrucePerlerMS" ---- -# \ - -Provides configuration for the class or derived classes. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel.md)\ -    [**\**](identityconfiguration.md)\ -      [**\**](securitytokenhandlers.md)\ -        [**\**](add.md)\ -          **\** - -## Syntax - -```xml - - - - - - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|lifetime|Specifies the lifetime of session tokens.| - -### Child Elements - - None - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](add.md)|Adds the specified security token handler to the token handler collection.| - -## Example - -```xml - - - -``` diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/system-identitymodel-services.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/system-identitymodel-services.md deleted file mode 100644 index 81d9673874f5b..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/system-identitymodel-services.md +++ /dev/null @@ -1,78 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: fa1624dd-2d74-4ae3-942e-498cee261ac5 -author: "BrucePerlerMS" ---- -# \ - -Configuration section for authentication using the WS-Federation protocol. - -[**\**](../configuration-element.md)\ -  **\** - -## Syntax - -```xml - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - - None - -### Child Elements - -|Element|Description| -|-------------|-----------------| -|[\](federationconfiguration.md)|Contains the settings that configure the (WSFAM) and the (SAM) HTTP modules.| - -### Parent Elements - - None - -## Remarks - - Add a `` section to your application’s configuration file to provide settings for the SAM and WSFAM. - -> [!IMPORTANT] -> When using the or the class to provide claims-based access control in your code, the claims authorization manager () and policy that is used to make authorization decisions are configured through an `` element that is implicitly or explicitly referenced from a `` element in this section. For more information, see the **Remarks** under the [\](federationconfiguration.md) element. - - The `` section is represented by the class. The collection of child `` elements configured in the section is represented by the class. - -## Example - - The following XML shows how to add a `` section to a configuration file. You must first add section declarations for both the `` section and the `` sections. (When you add a `` section, you should also add a declaration for the `` section to ensure that a default `` section can be created by the runtime if necessary.) After the section declarations have been added, you can configure federated authentication settings under the `` element. - -```xml - - -

-
- - - - - - - - - - - - -``` diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/system-identitymodel.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/system-identitymodel.md deleted file mode 100644 index 8fbde1a11a838..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/system-identitymodel.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: 210ce7e9-d07b-400c-800f-5f525dcf95e8 -author: "BrucePerlerMS" ---- -# \ - -Provides configuration for enabling Windows Identity Foundation (WIF) options in applications. - -[**\**](../configuration-element.md)\ -  **\** - -## Syntax - -```xml - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - - None - -### Child Elements - -|Element|Description| -|-------------|-----------------| -|[\](identityconfiguration.md)|Specifies service-level identity settings.| - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|``|The root element in every configuration file used by the common language runtime and .NET Framework applications.| - -## Remarks - - Add a `` section to the configuration file to configure a service or application to use Windows Identity Foundation (WIF). The `` element is represented by the class. - -## Example - - The following example shows how to add a `` section to a configuration file. You must first add the configuration section and namespace declaration under the `` element. Then you can add the `` element to your configuration file to specify one or more identity configurations. - -```xml - - - -
-
- - - ... - - - - - - - - - - - - - - - - ... - - -``` - -## See also - -- diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/toc.yml b/docs/framework/configure-apps/file-schema/windows-identity-foundation/toc.yml deleted file mode 100644 index 4cb6ac1dd1b6f..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/toc.yml +++ /dev/null @@ -1,89 +0,0 @@ -- name: WIF Configuration Schema - href: index.md - items: - - name: - href: system-identitymodel.md - items: - - name: - href: identityconfiguration.md - items: - - name: - href: caches.md - items: - - name: - href: sessionsecuritytokencache.md - - name: - href: tokenreplaycache.md - - name: - href: certificatevalidation.md - items: - - name: - href: certificatevalidator.md - - name: - href: claimsauthenticationmanager.md - - name: - href: claimsauthorizationmanager.md - - name: - href: claimtyperequired.md - items: - - name: - href: claimtype.md - - name: - href: securitytokenhandlers.md - items: - - name: - href: securitytokenhandlerconfiguration.md - items: - - name: - href: audienceuris.md - - name: - href: issuernameregistry.md - items: - - name: - href: trustedissuers.md - - name: - href: issuertokenresolver.md - - name: - href: servicetokenresolver.md - - name: - href: add.md - items: - - name: - href: x509securitytokenhandlerrequirement.md - - name: - href: usernamesecuritytokenhandlerrequirement.md - - name: - href: samlsecuritytokenrequirement.md - items: - - name: - href: nameclaimtype.md - - name: - href: roleclaimtype.md - - name: - href: sessiontokenrequirement.md - - name: - href: clear.md - - name: - href: remove.md - - name: - href: tokenreplaydetection.md - - name: - href: system-identitymodel-services.md - items: - - name: - href: federationconfiguration.md - items: - - name: - href: wsfederation.md - - name: - href: servicecertificate.md - items: - - name: - href: certificatereference.md - - name: - href: cookiehandler.md - items: - - name: - href: chunkedcookiehandler.md - - name: - href: customcookiehandler.md diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/tokenreplaycache.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/tokenreplaycache.md deleted file mode 100644 index b5c75864754ff..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/tokenreplaycache.md +++ /dev/null @@ -1,69 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: 1572ab23-6933-41b5-bfb4-0c4548145500 -author: "BrucePerlerMS" ---- -# \ - -Registers a token replay cache with a service or a security token handler collection. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel.md)\ -    [**\**](identityconfiguration.md)\ -      [**\**](caches.md)\ -        **\** - -## Syntax - -```xml - - - - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|type|A type that derives from the class. For more information about how to specify a custom `type`, see [Custom Type References]. - -### Child Elements - - None - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](caches.md)|Registers the caches used by a service or a security token handler collection.| - -## Remarks - - The token replay cache is used to detect replayed tokens. Token replay detection is enabled by the [\](tokenreplaydetection.md) element, which also specifies the maximum expiration time for tokens. - -## Example - - The following XML shows the configuration of a custom cache for detecting replayed tokens. - -```xml - - - - -``` - -## See also - -- -- [\](tokenreplaydetection.md) diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/tokenreplaydetection.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/tokenreplaydetection.md deleted file mode 100644 index 1c2a0be5eacfc..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/tokenreplaydetection.md +++ /dev/null @@ -1,58 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: ac3f588e-5f75-4275-b969-2d492ecc3b47 -author: "BrucePerlerMS" ---- -# \ - -Enables token replay detection and specifies the expiration time for tokens. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel.md)\ -    [**\**](identityconfiguration.md)\ -      **\** - -## Syntax - -```xml - - - - - - -``` - -## Type - - - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|enabled|A value that specifies whether token replay detection is enabled; "true" to enable token replay detection.| -|expirationPeriod|A that specifies the maximum amount of time before an item is considered expired and removed from the cache. For more information about how to specify values, see [Timespan Values](../windows-workflow-foundation/index.md).| - -### Child Elements - - None - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](identityconfiguration.md)|Specifies service-level identity settings.| -|[\](securitytokenhandlerconfiguration.md)|Provides configuration for a collection of security token handlers.| - -## Remarks - - A `` element can be specified at the service level under the `` element or on the security token handler collection level under the `` element. Settings on a token handler collection override those specified on the service. - - The type of the token replay cache is specified by the [\](tokenreplaycache.md) element. diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/trustedissuers.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/trustedissuers.md deleted file mode 100644 index 6ae29ae46df4b..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/trustedissuers.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: d818c917-07b4-40db-9801-8676561859fd -author: "BrucePerlerMS" ---- -# \ - -Configures the list of trusted issuer certificates used by the configuration-based issuer name registry (). - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel.md)\ -    [**\**](identityconfiguration.md)\ -      [**\**](securitytokenhandlers.md)\ -        [**\**](securitytokenhandlerconfiguration.md)\ -          [**\**](issuernameregistry.md)\ -            **\** - -## Syntax - -```xml - - - - - - - - - - - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - - None - -### Child Elements - -|Element|Description| -|-------------|-----------------| -|``|Adds a certificate to the collection of trusted issuers. The certificate is specified with the `thumbprint` attribute. This attribute is required and should contain the ASN.1 encoded form of the certificate thumbprint. The `name` attribute is optional and can be used to specify a friendly name for the certificate.| -|``|Clears all certificates from the collection of trusted issuers.| -|``|Removes a certificate from the collection of trusted issuers. The certificate is specified with the `thumbprint` attribute. This attribute is required.| - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](issuernameregistry.md)|Configures the issuer name registry. **Important:** The `type` attribute of the `` element must reference the class for the `` element to be valid.| - -## Remarks - - Windows Identity Foundation (WIF) provides a single implementation of the class out of the box, the class. The configuration issuer name registry maintains a list of trusted issuers that is loaded from configuration. The list associates each issuer name with the X.509 certificate that is needed to verify the signature of tokens produced by the issuer. The list of trusted issuer certificates is specified under the `` element. Each element in the list associates a mnemonic issuer name with the X.509 certificate that is needed to verify the signature of tokens produced by that issuer. Trusted certificates are specified using the ASN.1 encoded form of the certificate thumbprint and are added the collection by using `` element. You can clear or remove issuers (certificates) from the list by using the `` and `` elements. - - The `type` attribute of the `` element must reference the class for the `` element to be valid. - -## Example - - The following XML shows how to specify the configuration based issuer name registry. - -```xml - - - - - -``` - -## See also - -- -- diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/usernamesecuritytokenhandlerrequirement.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/usernamesecuritytokenhandlerrequirement.md deleted file mode 100644 index 6373ae7773fb2..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/usernamesecuritytokenhandlerrequirement.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: 6ec3bac1-b014-49ae-843c-c54518cb709a -author: "BrucePerlerMS" ---- -# \ - -Provides configuration for the class or derived classes. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel.md)\ -    [**\**](identityconfiguration.md)\ -      [**\**](securitytokenhandlers.md)\ -        [**\**](add.md)\ -          **\** - -## Syntax - -```xml - - - - - - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|membershipProviderName|Specifies the that should be used by the security token handler.| - -### Child Elements - - None - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](add.md)|Adds the specified security token handler to the token handler collection.| - -## Remarks - - The `` element sets the property when a object is initialized from configuration. - -## Example - -```xml - - " -title: "" -ms.date: "03/30/2017" -ms.assetid: c537f770-68bd-4f82-96ad-6424ad91369f -author: "BrucePerlerMS" ---- -# \ - -Provides configuration for the (WSFAM). - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel-services.md)\ -    [**\**](federationconfiguration.md)\ -      **\** - -## Syntax - -```xml - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|authenticationType|A URI that specifies the authentication type. Sets the WS-Federation sign-in request wauth parameter. Optional. The default is an empty string, which specifies that the wauth parameter is not included in the request.| -|freshness|The desired maximum age of authentication requests, in minutes. Sets the WS-Federation sign-in request wfresh parameter. Optional. The default is zero. Optional. **Warning:** In the next release of .NET Framework 4.5, the `freshness` attribute will be of type `xs:string` and its default value will be `null`.| -|homeRealm|The home realm of the identity provider (IdP) to use for authentication. Sets the WS-Federation sign-in request whr parameter. Optional. The default is an empty string, which specifies that the whr parameter is not included in the request.| -|issuer|The URI of the intended token issuer. Sets the base URL of WS-Federation sign-in requests and sign-out requests Required.| -|persistentCookiesOnPassiveRedirects|Specifies whether persistent cookies are issued on authentication. Optional. The default is "false", cookies are not issued.| -|passiveRedirectEnabled|Specifies whether the WSFAM is enabled to automatically redirect unauthorized requests to an STS. Optional. The default is "true", unauthorized requests are automatically redirected.| -|policy|A URL that specifies the location of the relevant policy to use on sign-in requests. The default is an empty string. Sets the WS-Federation sign-in request wp parameter. Optional. The default is an empty string, which specifies that the wp parameter is not included in the request.| -|realm|The URI of the requesting realm. (A URI that identifies the relying party (RP) to the security token service (STS).) Sets the request wtrealm WS-Federation sign-in request parameter. Required.| -|reply|A URL that identifies the address at which the relying party (RP) application would like to receive replies from the Security Token Service (STS). Sets the WS-Federation sign-in request wreply parameter. Optional. The default is an empty string, which specifies that the wreply parameter is not included in the request.| -|request|The token issuance request. Sets the WS-Federation sign-in request wreq parameter. Optional. The default is an empty string, which specifies that the wreq parameter is not included in the request. Not including the wreq or the wreqptr parameter in the request implies that the STS knows what kind of token to issue.| -|requestPtr|A URL that specifies the location of the token issuance request. Sets the request wreqptr parameter. Optional. The default is an empty string, which specifies that the wreqptr parameter is not included in the request. Not including the wreq or the wreqptr parameter in the request implies that the STS knows what kind of token to issue.| -|requireHttps|Specifies whether communication with the security token service (STS) must use HTTPS protocol. Optional. The default is "true", HTTPS must be used.| -|resource|A URI that identifies the resource being accessed, the relying party (RP), to the to the security token service (STS). Optional. Sets the WS-Federation sign-in request wres parameter. Optional. The default is an empty string, which specifies that the wres parameter is not included in the request. **Note:** wres is a legacy parameter. Specify the `realm` attribute to use the wtrealm parameter instead.| -|signInQueryString|Provides an extensibility point to specify application defined query parameters in the WS-Federation sign-in request URL. Optional. The default is an empty string, which specifies that no additional parameters should be included in the request. The parameters are specified as a query string fragment using the following form: `"param1=value1¶m2=value2¶m3=value3"` and so on. **Note:** In a configuration file the ‘&" character in the query string must be specified using its entity reference, `&`.| -|signOutQueryString|Provides an extensibility point to specify application defined query parameters in the WS-Federation sign-in request URL. Optional. The default is an empty string, which specifies that no additional parameters should be included in the request. The parameters are specified as a query string fragment using the following form: `"param1=value1¶m2=value2¶m3=value3"` and so on. **Note:** In a configuration file the ‘&" character in the query string must be specified using its entity reference, `&`.| -|signOutReply|Specifies the URL to which the client should be redirected by the security token service (STS) during passive sign-out through the WS-Federation protocol. Sets the wreply parameter on a WS-Federation sign-out request. Optional. The default is an empty string, which specifies that no additional parameters should be included in the request.| - -### Child Elements - - None - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](federationconfiguration.md)|Contains the settings that configure the (WSFAM) and the (SAM).| - -## Remarks - - You can use the `` element to configure default WS-Federation parameter settings and default behavior for the WSFAM. WS-Federation parameter settings defined under the `` element set equivalent properties exposed by the class. These properties remain the same for every request issued by the WSFAM. You can change the WS-Federation parameters dynamically during request processing by adding event handlers for the events exposed by WSFAM; for example, the event. For more information, see the documentation for the class. - - The `` element is represented by the class. The configuration object itself is represented by the class. A single instance is set on the object that is accessed through the property and provides configuration for the WSFAM. - -## Example - - The following XML shows a `` element that specifies settings for the WSFAM. - -> [!WARNING] -> In this example, the WSFAM is not required to use HTTPS. This is because the `requireHttps` attribute on the `` element is set `false`. This setting is not recommended for most production environments as it may present a security risk. - -```xml - -``` - -## See also - -- -- diff --git a/docs/framework/configure-apps/file-schema/windows-identity-foundation/x509securitytokenhandlerrequirement.md b/docs/framework/configure-apps/file-schema/windows-identity-foundation/x509securitytokenhandlerrequirement.md deleted file mode 100644 index ce5c5237884d1..0000000000000 --- a/docs/framework/configure-apps/file-schema/windows-identity-foundation/x509securitytokenhandlerrequirement.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -description: "Learn more about: " -title: "" -ms.date: "03/30/2017" -ms.assetid: aca22c2c-5ae7-42af-9bbd-15c2524692ce -author: "BrucePerlerMS" ---- -# \ - -Provides optional configuration for the class or derived classes. - -[**\**](../configuration-element.md)\ -  [**\**](system-identitymodel.md)\ -    [**\**](identityconfiguration.md)\ -      [**\**](securitytokenhandlers.md)\ -        [**\**](add.md)\ -          **\** - -## Syntax - -```xml - - - - - - mapToWindows=xs:boolean - certificateValidationMode="None||ChainTrust||PeerTrust||PeerOrChainTrust||Custom" - certificateValidator="Namespace.Class, Assembly" - revocationMode="NoCheck||Offline||Online" - trustedStoreLocation="CurrentUser||LocalMachine" - - - - - -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|certificateValidationMode|An value that specifies the validation mode to use for the X.509 certificate. The default value is "PeerOrChainTrust".| -|mapToWindows|Specifies whether the token handler should map the validating token to a Windows account by using the incoming UPN claim. The default is "false".| -|revocationMode|An value that specifies the revocation mode to use for the X.509 certificate. The default value is "Online".| -|trustedStoreLocation|A value that specifies the X.509 certificate store. The default value is "LocalMachine".| -|certificateValidator|A custom type that derives from . If the `certificateValidationMode` attribute is "Custom", an instance of this type is used for issuer certificate validation.| - -### Child Elements - - None - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](add.md)|Adds the specified security token handler to the token handler collection.| - -## Example - -```xml - - - -``` From a260c66f4a315c89fb0748f4c50e7b72fcc62e3f Mon Sep 17 00:00:00 2001 From: Genevieve Warren <24882762+gewarren@users.noreply.github.com> Date: Mon, 21 Jun 2021 08:38:37 -0700 Subject: [PATCH 058/105] Delete .NET Fx install docs for old Windows versions (#24695) --- .openpublishing.redirection.json | 15 +++++++ docs/framework/install/index.md | 6 +-- docs/framework/install/on-windows-7.md | 46 ---------------------- docs/framework/install/on-windows-vista.md | 31 --------------- docs/framework/install/on-windows-xp.md | 36 ----------------- docs/framework/toc.yml | 6 --- 6 files changed, 18 insertions(+), 122 deletions(-) delete mode 100644 docs/framework/install/on-windows-7.md delete mode 100644 docs/framework/install/on-windows-vista.md delete mode 100644 docs/framework/install/on-windows-xp.md diff --git a/.openpublishing.redirection.json b/.openpublishing.redirection.json index 9ee80db8c5a1c..ff48e84255bb3 100644 --- a/.openpublishing.redirection.json +++ b/.openpublishing.redirection.json @@ -4274,6 +4274,21 @@ "source_path": "docs/framework/install/net-framework-3-5-on-windows-8-plus.md", "redirect_url": "/dotnet/framework/install/dotnet-35-windows-10" }, + { + "source_path": "docs/framework/install/on-windows-vista.md", + "redirect_url": "/previous-versions/dotnet/framework/install/on-windows-vista", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/install/on-windows-xp.md", + "redirect_url": "/previous-versions/dotnet/framework/install/on-windows-xp", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/install/on-windows-7.md", + "redirect_url": "/previous-versions/dotnet/framework/install/on-windows-7", + "redirect_document_id": false + }, { "source_path": "docs/framework/interop/applying-interop-attributes.md", "redirect_url": "/dotnet/standard/native-interop/apply-interop-attributes", diff --git a/docs/framework/install/index.md b/docs/framework/install/index.md index 4328274859f05..271aaf2db371f 100644 --- a/docs/framework/install/index.md +++ b/docs/framework/install/index.md @@ -14,12 +14,12 @@ You can install .NET Framework on various Windows versions. - [Windows 10 and Windows Server 2016](on-windows-10.md) - [Windows 8.1 and Windows Server 2012 R2](on-windows-8-1.md) - [Windows 8 and Windows Server 2012](on-windows-8.md) -- [Windows 7 and Windows Server 2008 R2](on-windows-7.md) -- [Windows Vista and Windows Server 2008](on-windows-vista.md) +- [Windows 7 and Windows Server 2008 R2](/previous-versions/dotnet/framework/install/on-windows-7) +- [Windows Vista and Windows Server 2008](/previous-versions/dotnet/framework/install/on-windows-vista) ## Unsupported Windows versions -- [Windows XP and Windows Server 2003](on-windows-xp.md) +- [Windows XP and Windows Server 2003](/previous-versions/dotnet/framework/install/on-windows-xp) ## See also diff --git a/docs/framework/install/on-windows-7.md b/docs/framework/install/on-windows-7.md deleted file mode 100644 index 10213fc18b8ab..0000000000000 --- a/docs/framework/install/on-windows-7.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -title: Install the .NET Framework on Windows 7 SP1 -description: Learn how to install the .NET Framework on Windows 7 SP1. -ms.date: 04/18/2019 ---- - -# Install the .NET Framework on Windows 7 SP1 and Windows Server 2008 R2 - -The .NET Framework is required to run many applications on Windows. You can use the following instructions to install it. You may have arrived on this page after trying to run an application and seeing the following dialog on your machine. - -![This application could not be started](./media/this-application-could-not-be-started.png) - -These instructions will help you install the .NET Framework versions you need. [.NET Framework 4.8](https://github.com/Microsoft/dotnet/tree/master/releases/net48) is the latest version. It is supported on Windows 7 SP1 and Windows Server 2008 R2 and is included with [Windows 10 May 2019 Update](https://support.microsoft.com/help/4028685/windows-10-get-the-update) and later versions. - -## .NET Framework 4.8 - -> [!div class="button"] -> [Download .NET Framework 4.8](https://dotnet.microsoft.com/download/dotnet-framework/net48) - -[.NET Framework 4.8](https://github.com/Microsoft/dotnet/tree/master/releases/net48) can be used to run applications built for .NET Framework 4.0 or later. - -### Offline installer - -When doing an offline install for .NET Framework on Windows 7, you'll first need to make sure that the latest [Microsoft Root Certificate Authority 2011](https://www.microsoft.com/pkiops/Docs/Repository.htm) has been installed on the target machine. - -The _certmgr.exe_ tool can automate installing a certificate and is obtained from Visual Studio or the Windows SDK. The following command is used to install the certificate before running the .NET Framework installer: - -```console -certmgr.exe /add MicRooCerAut2011_2011_03_22.crt /s /r localMachine root -``` - -## .NET Framework 3.5 - -The [.NET Framework 3.5](https://dotnet.microsoft.com/download/dotnet-framework/net35-sp1) is included with Windows 7. - -The .NET Framework 3.5 supports apps built for .NET Framework 1.0 through 3.5. - -## Help - -You can [contact Microsoft for help](mailto:dotnet-install-help@service.microsoft.com?subject=Install-Help) if you cannot get the correct version of the .NET Framework installed. - -## See also - -- [Download the .NET Framework](https://dotnet.microsoft.com/download) -- [Troubleshoot blocked .NET Framework installations and uninstallations](troubleshoot-blocked-installations-and-uninstallations.md) -- [Install the .NET Framework for developers](guide-for-developers.md) diff --git a/docs/framework/install/on-windows-vista.md b/docs/framework/install/on-windows-vista.md deleted file mode 100644 index 92d3a91c88e92..0000000000000 --- a/docs/framework/install/on-windows-vista.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -title: Install the .NET Framework on Windows Vista -description: Learn how to install the .NET Framework on Windows Vista. -ms.date: 04/18/2019 ---- - -# Install the .NET Framework on Windows Vista and Windows Server 2008 - -The .NET Framework is required to run many applications on Windows. You can use the following instructions to install it. You may have arrived on this page after trying to run an application and seeing the following dialog on your machine. - -![This application could not be started](./media/this-application-could-not-be-started.png) - -These instructions will help you install the .NET Framework versions you need. The [.NET Framework 4.8](https://github.com/Microsoft/dotnet/tree/master/releases/net48) is the latest version. It is not supported on Windows Vista and Windows Server 2008. It is included with Windows 10 May 2019 Update [and later versions](https://support.microsoft.com/help/4028685/windows-10-get-the-update). - -## .NET Framework 4.6 - -The [.NET Framework 4.6](https://dotnet.microsoft.com/download/dotnet-framework/net46) is the latest supported .NET Framework version on Windows Vista and Windows Server 2008. - -The [.NET Framework 4.6](https://dotnet.microsoft.com/download/dotnet-framework/net46) supports applications built for .NET Framework 4.0 through 4.6. - -## .NET Framework 3.5 - -You can install the [.NET Framework 3.5](https://dotnet.microsoft.com/download/dotnet-framework/net35-sp1) on Windows Vista. - -The .NET Framework 3.5 supports apps built for .NET Framework 1.0 through 3.5. - -## See also - -- [Download the .NET Framework](https://dotnet.microsoft.com/download) -- [Troubleshoot blocked .NET Framework installations and uninstallations](troubleshoot-blocked-installations-and-uninstallations.md) -- [Install the .NET Framework for developers](guide-for-developers.md) diff --git a/docs/framework/install/on-windows-xp.md b/docs/framework/install/on-windows-xp.md deleted file mode 100644 index 76ab5c17d3f1b..0000000000000 --- a/docs/framework/install/on-windows-xp.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Install the .NET Framework on Windows XP -description: Learn how to install the .NET Framework on Windows XP. -ms.date: 04/18/2019 ---- - -# Install the .NET Framework on Windows XP and Windows Server 2003 - -> [!NOTE] -> Windows XP is no longer supported by Microsoft. We recommend you upgrade to Windows 10, which is supported and includes the latest version of the .NET Framework. This document is provided solely as a helpful troubleshooting guide. - -The .NET Framework is required to run many applications on Windows. You can use the following instructions to install it. You may have arrived on this page after trying to run an application and seeing the following dialog on your machine. - -![This application could not be started](./media/this-application-could-not-be-started.png) - -These instructions will help you install the .NET Framework versions you need. The [.NET Framework 4.8](https://github.com/Microsoft/dotnet/tree/master/releases/net48) is the latest version. It is not supported on Windows XP and Windows Server 2003. It is included with Windows 10 May 2019 Update [and later versions](https://support.microsoft.com/help/4028685/windows-10-get-the-update). - -## .NET Framework 4.0.3 - -The [.NET Framework 4.0.3](https://www.microsoft.com/download/details.aspx?id=29053) is the latest supported .NET Framework version on Windows XP and Windows Server 2003. The .NET Framework 4.0.3 requires that the [.NET Framework 4](https://dotnet.microsoft.com/download/dotnet-framework/net40) is installed first. Both of these .NET Framework versions are no longer supported by Microsoft. - -## .NET Framework 4 - -You can install the [.NET Framework 4](https://dotnet.microsoft.com/download/dotnet-framework/net40) on Windows XP. It's no longer supported by Microsoft. - -## .NET Framework 3.5 - -You can install the [.NET Framework 3.5](https://dotnet.microsoft.com/download/dotnet-framework/net35-sp1) on Windows XP. - -The .NET Framework 3.5 can be used to run applications built for .NET Framework 1.0 through 3.5. - -## See also - -- [Download the .NET Framework](https://dotnet.microsoft.com/download) -- [Troubleshoot blocked .NET Framework installations and uninstallations](troubleshoot-blocked-installations-and-uninstallations.md) -- [Install the .NET Framework for developers](guide-for-developers.md) diff --git a/docs/framework/toc.yml b/docs/framework/toc.yml index e3c14cbf88d53..0b0c9162311a0 100644 --- a/docs/framework/toc.yml +++ b/docs/framework/toc.yml @@ -25,12 +25,6 @@ items: href: install/on-windows-8-1.md - name: Windows 8 and Windows Server 2012 href: install/on-windows-8.md - - name: Windows 7 SP1 and Windows Server 2008 R2 - href: install/on-windows-7.md - - name: Windows Vista and Windows Server 2008 - href: install/on-windows-vista.md - - name: Windows XP and Windows Server 2003 - href: install/on-windows-xp.md - name: Repair .NET framework href: install/repair.md - name: Troubleshoot From 93f565d0554ebb4c1502dde3a64180816458e2fc Mon Sep 17 00:00:00 2001 From: Genevieve Warren <24882762+gewarren@users.noreply.github.com> Date: Mon, 21 Jun 2021 08:39:16 -0700 Subject: [PATCH 059/105] Delete WCF data services docs (#24698) --- .openpublishing.redirection.json | 360 ++++++++++++++++++ .../data/adonet/ado-net-architecture.md | 2 +- ...o-net-technology-options-and-guidelines.md | 2 +- .../adonet/ef/migration-considerations.md | 2 +- docs/framework/data/adonet/index.md | 2 +- docs/framework/data/index.md | 2 +- ...ata-service-resources-wcf-data-services.md | 85 ----- ...eb-browser-wcf-data-services-quickstart.md | 79 ---- ...application-scenarios-wcf-data-services.md | 102 ----- ...ynchronous-operations-wcf-data-services.md | 40 -- ...ttach-an-existing-entity-to-dc-wcf-data.md | 30 -- .../batching-operations-wcf-data-services.md | 29 -- ...-data-to-wpf-elements-wcf-data-services.md | 46 --- ...ding-data-to-controls-wcf-data-services.md | 123 ------ ...ng-service-operations-wcf-data-services.md | 143 ------- ...ring-the-data-service-wcf-data-services.md | 92 ----- ...ata-service-using-an-adonet-ef-data-wcf.md | 78 ---- ...te-a-data-service-using-linq-to-sql-wcf.md | 77 ---- ...data-service-using-rp-wcf-data-services.md | 33 -- ...onous-wpf-application-wcf-data-services.md | 36 -- .../data/wcf/creating-the-data-service.md | 104 ----- ...pplication-wcf-data-services-quickstart.md | 89 ----- ...ata-service-providers-wcf-data-services.md | 27 -- ...ta-service-versioning-wcf-data-services.md | 82 ---- ...ta-services-providers-wcf-data-services.md | 37 -- .../data/wcf/defining-wcf-data-services.md | 61 --- ...eloping-and-deploying-wcf-data-services.md | 129 ------- ...ty-framework-provider-wcf-data-services.md | 25 -- ...our-data-as-a-service-wcf-data-services.md | 32 -- .../feed-customization-wcf-data-services.md | 103 ----- ...ervice-client-library-wcf-data-services.md | 57 --- .../getting-started-with-wcf-data-services.md | 41 -- ...ting-the-data-service-wcf-data-services.md | 80 ---- ...ata-service-reference-wcf-data-services.md | 33 -- ...y-and-delete-entities-wcf-data-services.md | 53 --- ...-a-data-service-query-wcf-data-services.md | 53 --- ...a-project-data-source-wcf-data-services.md | 120 ------ ...ata-binding-behaviors-wcf-data-services.md | 37 -- ...eeds-with-ef-provider-wcf-data-services.md | 44 --- ...e-reflection-provider-wcf-data-services.md | 36 -- ...e-a-service-operation-wcf-data-services.md | 57 --- ...-entity-relationships-wcf-data-services.md | 37 -- ...velop-a-wcf-data-service-running-on-iis.md | 164 -------- ...s-to-the-data-service-wcf-data-services.md | 33 -- ...-data-service-results-wcf-data-services.md | 32 -- ...-data-service-queries-wcf-data-services.md | 33 -- ...-data-service-queries-wcf-data-services.md | 53 --- ...te-queries-in-a-batch-wcf-data-services.md | 29 -- ...data-service-messages-wcf-data-services.md | 61 --- ...to-load-paged-results-wcf-data-services.md | 38 -- ...load-related-entities-wcf-data-services.md | 37 -- ...-data-service-classes-wcf-data-services.md | 98 ----- ...project-query-results-wcf-data-services.md | 42 -- ...in-the-client-request-wcf-data-services.md | 40 -- docs/framework/data/wcf/index.md | 106 ------ .../wcf/interceptors-wcf-data-services.md | 51 --- .../linq-considerations-wcf-data-services.md | 233 ------------ ...ding-deferred-content-wcf-data-services.md | 64 ---- ...-data-service-context-wcf-data-services.md | 47 --- .../media/wcf-data-service-item-template.png | Bin 30553 -> 0 bytes ...-foundation-data-services-architecture.gif | Bin 25542 -> 0 bytes ...ber-of-entities-returned-by-a-query-wcf.md | 37 -- ...bject-materialization-wcf-data-services.md | 50 --- .../query-projections-wcf-data-services.md | 119 ------ ...ying-the-data-service-wcf-data-services.md | 153 -------- .../data/wcf/quickstart-wcf-data-services.md | 55 --- .../reflection-provider-wcf-data-services.md | 102 ----- .../data/wcf/securing-wcf-data-services.md | 129 ------- .../service-operations-wcf-data-services.md | 111 ------ ...nt-creds-for-a-data-service-request-wcf.md | 62 --- .../streaming-provider-wcf-data-services.md | 141 ------- docs/framework/data/wcf/toc.yml | 165 +------- ...ting-the-data-service-wcf-data-services.md | 105 ----- ...-a-client-application-wcf-data-services.md | 59 --- ...tions-to-implement-server-side-behavior.md | 95 ----- ...-service-client-utility-datasvcutil-exe.md | 49 --- .../wcf/wcf-data-services-client-library.md | 56 --- .../data/wcf/wcf-data-services-overview.md | 71 ---- ...ervices-protocol-implementation-details.md | 30 -- .../data/wcf/wcf-data-services-resources.md | 57 --- ...king-with-binary-data-wcf-data-services.md | 75 ---- .../consuming-odata-feeds-from-a-workflow.md | 10 +- 82 files changed, 371 insertions(+), 5221 deletions(-) delete mode 100644 docs/framework/data/wcf/accessing-data-service-resources-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/accessing-the-service-from-a-web-browser-wcf-data-services-quickstart.md delete mode 100644 docs/framework/data/wcf/application-scenarios-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/asynchronous-operations-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/attach-an-existing-entity-to-dc-wcf-data.md delete mode 100644 docs/framework/data/wcf/batching-operations-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/bind-data-to-wpf-elements-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/binding-data-to-controls-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/calling-service-operations-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/configuring-the-data-service-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/create-a-data-service-using-an-adonet-ef-data-wcf.md delete mode 100644 docs/framework/data/wcf/create-a-data-service-using-linq-to-sql-wcf.md delete mode 100644 docs/framework/data/wcf/create-a-data-service-using-rp-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/create-an-asynchronous-wpf-application-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/creating-the-data-service.md delete mode 100644 docs/framework/data/wcf/creating-the-dotnet-client-application-wcf-data-services-quickstart.md delete mode 100644 docs/framework/data/wcf/custom-data-service-providers-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/data-service-versioning-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/data-services-providers-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/defining-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/developing-and-deploying-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/entity-framework-provider-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/exposing-your-data-as-a-service-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/feed-customization-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/generating-the-data-service-client-library-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/getting-started-with-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/hosting-the-data-service-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/how-to-add-a-data-service-reference-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/how-to-add-modify-and-delete-entities-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/how-to-add-query-options-to-a-data-service-query-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/how-to-bind-data-using-a-project-data-source-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/how-to-customize-data-binding-behaviors-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/how-to-customize-feeds-with-ef-provider-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/how-to-customize-feeds-with-the-reflection-provider-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/how-to-define-a-service-operation-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/how-to-define-entity-relationships-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/how-to-develop-a-wcf-data-service-running-on-iis.md delete mode 100644 docs/framework/data/wcf/how-to-enable-access-to-the-data-service-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/how-to-enable-paging-of-data-service-results-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/how-to-execute-asynchronous-data-service-queries-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/how-to-execute-data-service-queries-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/how-to-execute-queries-in-a-batch-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/how-to-intercept-data-service-messages-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/how-to-load-paged-results-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/how-to-load-related-entities-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/how-to-manually-generate-client-data-service-classes-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/how-to-project-query-results-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/how-to-set-headers-in-the-client-request-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/index.md delete mode 100644 docs/framework/data/wcf/interceptors-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/linq-considerations-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/loading-deferred-content-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/managing-the-data-service-context-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/media/wcf-data-service-item-template.png delete mode 100644 docs/framework/data/wcf/media/wcf-data-services-overview/windows-communication-foundation-data-services-architecture.gif delete mode 100644 docs/framework/data/wcf/number-of-entities-returned-by-a-query-wcf.md delete mode 100644 docs/framework/data/wcf/object-materialization-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/query-projections-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/querying-the-data-service-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/quickstart-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/reflection-provider-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/securing-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/service-operations-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/specify-client-creds-for-a-data-service-request-wcf.md delete mode 100644 docs/framework/data/wcf/streaming-provider-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/updating-the-data-service-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/using-a-data-service-in-a-client-application-wcf-data-services.md delete mode 100644 docs/framework/data/wcf/using-actions-to-implement-server-side-behavior.md delete mode 100644 docs/framework/data/wcf/wcf-data-service-client-utility-datasvcutil-exe.md delete mode 100644 docs/framework/data/wcf/wcf-data-services-client-library.md delete mode 100644 docs/framework/data/wcf/wcf-data-services-overview.md delete mode 100644 docs/framework/data/wcf/wcf-data-services-protocol-implementation-details.md delete mode 100644 docs/framework/data/wcf/wcf-data-services-resources.md delete mode 100644 docs/framework/data/wcf/working-with-binary-data-wcf-data-services.md diff --git a/.openpublishing.redirection.json b/.openpublishing.redirection.json index ff48e84255bb3..8cbb4acf071a5 100644 --- a/.openpublishing.redirection.json +++ b/.openpublishing.redirection.json @@ -4222,6 +4222,366 @@ "source_path": "docs/framework/data/wcf/writing-a-windows-store-app-that-consumes-an-odata-service.md", "redirect_url": "/dotnet/framework/data/wcf/" }, + { + "source_path": "docs/framework/data/wcf/index.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/index", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/wcf-data-services-overview.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/wcf-data-services-overview", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/getting-started-with-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/getting-started-with-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/exposing-your-data-as-a-service-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/exposing-your-data-as-a-service-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/accessing-data-service-resources-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/accessing-data-service-resources-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/using-a-data-service-in-a-client-application-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/using-a-data-service-in-a-client-application-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/quickstart-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/quickstart-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/creating-the-data-service.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/creating-the-data-service", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/accessing-the-service-from-a-web-browser-wcf-data-services-quickstart.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/accessing-the-service-from-a-web-browser-wcf-data-services-quickstart", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/creating-the-dotnet-client-application-wcf-data-services-quickstart.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/creating-the-dotnet-client-application-wcf-data-services-quickstart", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/application-scenarios-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/application-scenarios-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/wcf-data-services-resources.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/wcf-data-services-resources", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/defining-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/defining-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/configuring-the-data-service-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/configuring-the-data-service-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/how-to-develop-a-wcf-data-service-running-on-iis.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-develop-a-wcf-data-service-running-on-iis", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/how-to-enable-access-to-the-data-service-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-enable-access-to-the-data-service-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/how-to-enable-paging-of-data-service-results-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-enable-paging-of-data-service-results-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/data-services-providers-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/data-services-providers-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/entity-framework-provider-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/entity-framework-provider-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/create-a-data-service-using-an-adonet-ef-data-wcf.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/create-a-data-service-using-an-adonet-ef-data-wcf", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/reflection-provider-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/reflection-provider-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/create-a-data-service-using-rp-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/create-a-data-service-using-rp-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/create-a-data-service-using-linq-to-sql-wcf.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/create-a-data-service-using-linq-to-sql-wcf", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/custom-data-service-providers-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/custom-data-service-providers-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/streaming-provider-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/streaming-provider-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/service-operations-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/service-operations-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/how-to-define-a-service-operation-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-define-a-service-operation-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/feed-customization-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/feed-customization-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/how-to-customize-feeds-with-ef-provider-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-customize-feeds-with-ef-provider-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/how-to-customize-feeds-with-the-reflection-provider-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-customize-feeds-with-the-reflection-provider-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/interceptors-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/interceptors-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/how-to-intercept-data-service-messages-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-intercept-data-service-messages-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/developing-and-deploying-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/developing-and-deploying-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/securing-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/securing-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/hosting-the-data-service-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/hosting-the-data-service-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/data-service-versioning-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/data-service-versioning-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/wcf-data-services-protocol-implementation-details.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/wcf-data-services-protocol-implementation-details", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/using-actions-to-implement-server-side-behavior.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/using-actions-to-implement-server-side-behavior", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/wcf-data-services-client-library.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/wcf-data-services-client-library", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/generating-the-data-service-client-library-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/generating-the-data-service-client-library-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/wcf-data-service-client-utility-datasvcutil-exe.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/wcf-data-service-client-utility-datasvcutil-exe", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/how-to-add-a-data-service-reference-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-add-a-data-service-reference-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/how-to-manually-generate-client-data-service-classes-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-manually-generate-client-data-service-classes-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/querying-the-data-service-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/querying-the-data-service-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/query-projections-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/query-projections-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/how-to-project-query-results-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-project-query-results-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/linq-considerations-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/linq-considerations-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/object-materialization-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/object-materialization-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/how-to-execute-data-service-queries-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-execute-data-service-queries-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/how-to-add-query-options-to-a-data-service-query-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-add-query-options-to-a-data-service-query-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/number-of-entities-returned-by-a-query-wcf.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/number-of-entities-returned-by-a-query-wcf", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/specify-client-creds-for-a-data-service-request-wcf.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/specify-client-creds-for-a-data-service-request-wcf", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/how-to-set-headers-in-the-client-request-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-set-headers-in-the-client-request-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/loading-deferred-content-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/loading-deferred-content-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/how-to-load-related-entities-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-load-related-entities-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/how-to-load-paged-results-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-load-paged-results-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/updating-the-data-service-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/updating-the-data-service-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/how-to-add-modify-and-delete-entities-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-add-modify-and-delete-entities-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/how-to-define-entity-relationships-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-define-entity-relationships-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/attach-an-existing-entity-to-dc-wcf-data.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/attach-an-existing-entity-to-dc-wcf-data", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/asynchronous-operations-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/asynchronous-operations-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/how-to-execute-asynchronous-data-service-queries-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-execute-asynchronous-data-service-queries-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/create-an-asynchronous-wpf-application-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/create-an-asynchronous-wpf-application-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/batching-operations-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/batching-operations-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/how-to-execute-queries-in-a-batch-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-execute-queries-in-a-batch-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/binding-data-to-controls-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/binding-data-to-controls-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/bind-data-to-wpf-elements-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/bind-data-to-wpf-elements-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/how-to-bind-data-using-a-project-data-source-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-bind-data-using-a-project-data-source-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/how-to-customize-data-binding-behaviors-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/how-to-customize-data-binding-behaviors-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/calling-service-operations-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/calling-service-operations-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/managing-the-data-service-context-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/managing-the-data-service-context-wcf-data-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/wcf/working-with-binary-data-wcf-data-services.md", + "redirect_url": "/previous-versions/dotnet/framework/data/wcf/working-with-binary-data-wcf-data-services", + "redirect_document_id": false + }, { "source_path": "docs/framework/deployment/repair.md", "redirect_url": "/dotnet/framework/install/repair" diff --git a/docs/framework/data/adonet/ado-net-architecture.md b/docs/framework/data/adonet/ado-net-architecture.md index a3b0ce74fc9b5..90abdca66a378 100644 --- a/docs/framework/data/adonet/ado-net-architecture.md +++ b/docs/framework/data/adonet/ado-net-architecture.md @@ -53,7 +53,7 @@ ADO.NET architecture ## WCF Data Services - WCF Data Services is used to deploy data services on the Web or an intranet. The data is structured as entities and relationships according to the specifications of the Entity Data Model. Data deployed on this model is addressable by standard HTTP protocol. For more information, see [WCF Data Services 4.5](../wcf/index.md). + WCF Data Services is used to deploy data services on the Web or an intranet. The data is structured as entities and relationships according to the specifications of the Entity Data Model. Data deployed on this model is addressable by standard HTTP protocol. For more information, see [WCF Data Services 4.5](/previous-versions/dotnet/framework/data/wcf/index). ## XML and ADO.NET diff --git a/docs/framework/data/adonet/ado-net-technology-options-and-guidelines.md b/docs/framework/data/adonet/ado-net-technology-options-and-guidelines.md index ef034672f9d71..6acb88bdc24e1 100644 --- a/docs/framework/data/adonet/ado-net-technology-options-and-guidelines.md +++ b/docs/framework/data/adonet/ado-net-technology-options-and-guidelines.md @@ -42,7 +42,7 @@ The ADO.NET Data Platform is a multi-release strategy to decrease the amount of ## WCF Data Services - WCF Data Services deploys data services on the Web or on an intranet. The data is structured as entities and relationships according to the specifications of the Entity Data Model. Data deployed on this model is addressable by standard HTTP protocol. For more information, see [WCF Data Services 4.5](../wcf/index.md). + WCF Data Services deploys data services on the Web or on an intranet. The data is structured as entities and relationships according to the specifications of the Entity Data Model. Data deployed on this model is addressable by standard HTTP protocol. For more information, see [WCF Data Services 4.5](/previous-versions/dotnet/framework/data/wcf/index). ## See also diff --git a/docs/framework/data/adonet/ef/migration-considerations.md b/docs/framework/data/adonet/ef/migration-considerations.md index bf0c2deaa610b..a87ef3315ca5d 100644 --- a/docs/framework/data/adonet/ef/migration-considerations.md +++ b/docs/framework/data/adonet/ef/migration-considerations.md @@ -94,7 +94,7 @@ The ADO.NET Entity Framework provides several benefits to an existing applicatio - Applications that use XML data. - Object serialization enables you to create Entity Framework data services. These services provide data to applications that consume XML data, such as AJAX-based Internet applications. In these cases, consider using WCF Data Services. These data services are based on the Entity Data Model and provide dynamic access to entity data by using standard Representational State Transfer (REST) HTTP actions, such as GET, PUT, and POST. For more information, see [WCF Data Services 4.5](../../wcf/index.md). + Object serialization enables you to create Entity Framework data services. These services provide data to applications that consume XML data, such as AJAX-based Internet applications. In these cases, consider using WCF Data Services. These data services are based on the Entity Data Model and provide dynamic access to entity data by using standard Representational State Transfer (REST) HTTP actions, such as GET, PUT, and POST. For more information, see [WCF Data Services 4.5](/previous-versions/dotnet/framework/data/wcf/index). The Entity Framework does not support a native-XML data type. This means that when an entity is mapped to a table with an XML column, the equivalent entity property for the XML column is a string. Objects can be disconnected and serialized as XML. For more information, see [Serializing Objects](/previous-versions/dotnet/netframework-4.0/bb738446(v=vs.100)). diff --git a/docs/framework/data/adonet/index.md b/docs/framework/data/adonet/index.md index 157b9ea3180bc..e3ffa2e893f0a 100644 --- a/docs/framework/data/adonet/index.md +++ b/docs/framework/data/adonet/index.md @@ -49,7 +49,7 @@ ADO.NET is a set of classes that expose data access services for .NET Framework [Language-Integrated Query (LINQ) - Visual Basic](../../../visual-basic/programming-guide/concepts/linq/index.md) Provides links to LINQ topics and samples using Visual Basic. - [WCF Data Services 4.5](../wcf/index.md) + [WCF Data Services 4.5](/previous-versions/dotnet/framework/data/wcf/index) Describes how to use WCF Data Services to deploy data services on the Web or an intranet that implement the Open Data Protocol (OData). [.NET Framework Development Guide](../../development-guide.md) diff --git a/docs/framework/data/index.md b/docs/framework/data/index.md index a94ef2ff75a86..f13ad51964a05 100644 --- a/docs/framework/data/index.md +++ b/docs/framework/data/index.md @@ -14,7 +14,7 @@ This section provides information on how to access data in the .NET Framework. ## In this section - [WCF Data Services 4.5](./wcf/index.md) + [WCF Data Services 4.5](/previous-versions/dotnet/framework/data/wcf/index) Provides information about how to use WCF Data Services to deploy data services on the Web or an intranet. [ADO.NET](./adonet/index.md) diff --git a/docs/framework/data/wcf/accessing-data-service-resources-wcf-data-services.md b/docs/framework/data/wcf/accessing-data-service-resources-wcf-data-services.md deleted file mode 100644 index 0efcd744eb50e..0000000000000 --- a/docs/framework/data/wcf/accessing-data-service-resources-wcf-data-services.md +++ /dev/null @@ -1,85 +0,0 @@ ---- -description: "Learn more about: Accessing Data Service Resources (WCF Data Services)" -title: "Accessing Data Service Resources (WCF Data Services)" -ms.date: "03/30/2017" -helpviewer_keywords: - - "WCF Data Services, querying" - - "getting started, WCF Data Services" - - "querying the data service [WCF Data Service]" - - "WCF Data Services, getting started" - - "WCF Data Services, accessing data" -ms.assetid: 9665ff5b-3e3a-495d-bf83-d531d5d060ed ---- -# Accessing Data Service Resources (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -WCF Data Services supports the Open Data Protocol (OData) to expose your data as a feed with resources that are addressable by URIs. These resources are represented according to the entity-relationship conventions of the [Entity Data Model](../adonet/entity-data-model.md). In this model, entities represent operational units of data that are data types in an application domain, such as customers, orders, items, and products. Entity data is accessed and changed by using the semantics of representational state transfer (REST), specifically the standard HTTP verbs of GET, PUT, POST, and DELETE. - -## Addressing Resources - - In OData, you address any data exposed by the data model by using a URI. For example, the following URI returns a feed that is the Customers entity set, which contains entries for all instances of the Customer entity type: - - - - Entities have special properties called entity keys. An entity key is used to uniquely identify a single entity in an entity set. This enables you to address a specific instance of an entity type in the entity set. For example, the following URI returns an entry for a specific instance of the Customer entity type that has a key value of `ALFKI`: - - - - Primitive and complex properties of an entity instance can also be individually addressed. For example, the following URI returns an XML element that contains the `ContactName` property value for a specific Customer: - - - - When you include the `$value` endpoint in the previous URI, only the value of the primitive property is returned in the response message. The following example returns only the string "Maria Anders" without the XML element: - - - - Relationships between entities are defined in the data model by associations. These associations enable you to address related entities by using navigation properties of an entity instance. A navigation property can return either a single related entity, in the case of a many-to-one relationship, or a set of related entities, in the case of a one-to-many relationship. For example, the following URI returns a feed that is the set of all the Orders that are related to a specific Customer: - - - - Relationships, which are usually bi-directional, are represented by a pair of navigation properties. As the reverse of the relationship shown in the previous example, the following URI returns a reference to the Customer entity to which a specific Order entity belongs: - - - - OData also enables you to address resources based on the results of query expressions. This makes it possible to filter sets of resources based on an evaluated expression. For example, the following URI filters the resources to return only the Orders for the specified Customer that have shipped since September 22, 1997: - -`https://services.odata.org/Northwind/Northwind.svc/Customers('ALFKI')/Orders?$filter=ShippedDate gt datetime'1997-09-22T00:00:00'` - - For more information, see [OData: URI Conventions](https://www.odata.org/documentation/odata-version-2-0/uri-conventions/). - -## System Query Options - - OData defines a set of system query options that you can use to perform traditional query operations against resources, such as filtering, sorting, and paging. For example, the following URI returns the set of all the `Order` entities, along with related `Order_Detail` entities, the postal codes of which do not end in `100`: - -`https://services.odata.org/Northwind/Northwind.svc/Orders?$filter=not endswith(ShipPostalCode,'100')&$expand=Order_Details&$orderby=ShipCity` - - The entries in the returned feed are also ordered by the value of the ShipCity property of the orders. - - WCF Data Services supports the following OData system query options: - -|Query Option|Description| -|------------------|-----------------| -|`$orderby`|Defines a default sort order for entities in the returned feed. The following query orders the returned customers feed by county and city:

`https://services.odata.org/Northwind/Northwind.svc/Customers?$orderby=Country,City>`| -|`$top`|Specifies the number of entities to include in the returned feed. The following example skips the first 10 customers and then returns the next 10:

`https://services.odata.org/Northwind/Northwind.svc/Customers?$skip=10&$top=10`| -|`$skip`|Specifies the number of entities to skip before starting to return entities in the feed. The following example skips the first 10 customers and then returns the next 10:

`https://services.odata.org/Northwind/Northwind.svc/Customers?$skip=10&$top=10`| -|`$filter`|Defines an expression that filters the entities returned in the feed based on specific criteria. This query option supports a set of logical comparison operators, arithmetic operators, and predefined query functions that are used to evaluate the filter expression. The following example returns all orders the postal codes of which do not end in 100:

`https://services.odata.org/Northwind/Northwind.svc/Orders?$filter=not endswith(ShipPostalCode,'100')`| -|`$expand`|Specifies which related entities are returned by the query. Related entities are included as either a feed or an entry inline with the entity returned by the query. The following example returns the order for the customer 'ALFKI' along with the item details for each order:

`https://services.odata.org/Northwind/Northwind.svc/Customers('ALFKI')/Orders?$expand=Order_Details`| -|`$select`|Specifies a projection that defines the properties of the entity are returned in the projection. By default, all properties of an entity are returned in a feed. The following query returns only three properties of the `Customer` entity:

`https://services.odata.org/Northwind/Northwind.svc/Customers?$select=CustomerID,CompanyName,City`| -|`$inlinecount`|Requests that a count of the number of entities returned in the feed be included with the feed.| - -## Addressing Relationships - - In addition to addressing entity sets and entity instances, OData also enables you to address the associations that represent relationships between entities. This functionality is required to be able to create or change a relationship between two entity instances, such as the shipper that is related to a given order in the Northwind sample database. OData supports a `$link` operator to specifically address the associations between entities. For example, the following URI is specified in an HTTP PUT request message to change the shipper for the specified order to a new shipper. - -`https://services.odata.org/Northwind/Northwind.svc/Orders(10643)/$links/Shipper` - - For more information, see section `3.2. Addressing Links between Entries` at [OData: URI Conventions](https://www.odata.org/documentation/odata-version-2-0/uri-conventions/). - -## Consuming the Returned Feed - - The URI of an OData resource enables you to address entity data exposed by the service. When you enter a URI into the address field of a Web browser, a OData feed representation of the requested resource is returned. For more information, see the [WCF Data Services Quickstart](quickstart-wcf-data-services.md). Although a Web browser may be useful for testing that a data service resource returns the expected data, production data services that can also create, update, and delete data are generally accessed by application code or scripting languages in a Web page. For more information, see [Using a Data Service in a Client Application](using-a-data-service-in-a-client-application-wcf-data-services.md). - -## See also - -- [Open Data Protocol Web site](https://www.odata.org/) diff --git a/docs/framework/data/wcf/accessing-the-service-from-a-web-browser-wcf-data-services-quickstart.md b/docs/framework/data/wcf/accessing-the-service-from-a-web-browser-wcf-data-services-quickstart.md deleted file mode 100644 index 924499df2ff1a..0000000000000 --- a/docs/framework/data/wcf/accessing-the-service-from-a-web-browser-wcf-data-services-quickstart.md +++ /dev/null @@ -1,79 +0,0 @@ ---- -title: "Accessing the Service from a Web Browser (WCF Data Services Quickstart)" -description: Learn to start WCF Data Services in Visual Studio and disable feed reading in a browser. Get the service definition document and access data service resources. -ms.date: "03/30/2017" -ms.assetid: 5a6fa180-3094-4e6e-ba2b-8c80975d18d1 -recommendations: false ---- -# Accessing the Service from a Web Browser (WCF Data Services Quickstart) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -This is the second task of the WCF Data Services quickstart. In this task, you start the WCF Data Services from Visual Studio and optionally disable feed reading in the Web browser. You then retrieve the service definition document as well as access data service resources by submitting HTTP GET requests through a Web browser to the exposed resources. - -> [!NOTE] -> By default, Visual Studio auto-assigns a port number to the `localhost` URI on your computer. This task uses the port number `12345` in the URI examples. For more information about how to set a specific port number in your Visual Studio project see [Creating the Data Service](creating-the-data-service.md). - -## To request the default service document by using Internet Explorer - -1. In Internet Explorer, from the **Tools** menu, select **Internet Options**, click the **Content** tab, click **Settings**, and clear **Turn on feed viewing**. - - This makes sure that feed reading is disabled. If you do not disable this functionality, then the Web browser will treat the returned AtomPub encoded document as an XML feed instead of displaying the raw XML data. - - > [!NOTE] - > If your browser cannot display the feed as raw XML data, you should still be able to view the feed as the source code for the page. - -2. In Visual Studio, press the **F5** key to start debugging the application. - -3. Open a Web browser on the local computer. In the address bar, enter the following URI: - - ```http - http://localhost:12345/northwind.svc - ``` - - This returns the default service document, which contains a list of entity sets that are exposed by this data service. - -## To access entity set resources from a Web browser - -1. In the address bar of your Web browser, enter the following URI: - - ```http - http://localhost:12345/northwind.svc/Customers - ``` - - This returns a set of all customers in the Northwind sample database. - -2. In the address bar of your Web browser, enter the following URI: - - ```http - http://localhost:12345/northwind.svc/Customers('ALFKI') - ``` - - This returns an entity instance for the specific customer, `ALFKI`. - -3. In the address bar of your Web browser, enter the following URI: - - ```http - http://localhost:12345/northwind.svc/Customers('ALFKI')/Orders - ``` - - This traverses the relationship between customers and orders to return a set of all orders for the specific customer `ALFKI`. - -4. In the address bar of your Web browser, enter the following URI: - - ```http - http://localhost:12345/northwind.svc/Customers('ALFKI')/Orders?$filter=OrderID eq 10643 - ``` - - This filters orders that belong to the specific customer `ALFKI` so that only a specific order is returned based on the supplied `OrderID` value. - -## Next Steps - -You have successfully accessed the WCF Data Services from a Web browser, with the browser issuing HTTP GET requests to specified resources. A Web browser provides an easy way to experiment with the addressing syntax of requests and view the results. However, a production data service is not generally accessed by this method. Typically, applications interact with the data service through application code or scripting languages. Next, you will create a client application that uses client libraries to access data service resources as if they were common language runtime (CLR) objects: - -> [!div class="nextstepaction"] -> [Creating the .NET Framework Client Application](creating-the-dotnet-client-application-wcf-data-services-quickstart.md) - -## See also - -- [Accessing Data Service Resources](accessing-data-service-resources-wcf-data-services.md) diff --git a/docs/framework/data/wcf/application-scenarios-wcf-data-services.md b/docs/framework/data/wcf/application-scenarios-wcf-data-services.md deleted file mode 100644 index 5b6d6f3f74e4b..0000000000000 --- a/docs/framework/data/wcf/application-scenarios-wcf-data-services.md +++ /dev/null @@ -1,102 +0,0 @@ ---- -description: "Learn more about: Application Scenarios (WCF Data Services)" -title: "Application Scenarios (WCF Data Services)" -ms.date: "03/30/2017" -helpviewer_keywords: - - "WCF Data Services, learn more" - - "WCF Data Services, scenarios" -ms.assetid: 7c82658f-e7c0-46b6-834d-6592f67ab5ea ---- - -# Application Scenarios (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -WCF Data Services supports a core set of scenarios for exposing and consuming data as Open Data Protocol (OData) feeds. This topic points you to the topics relevant to these scenarios. - -Expose relational data from a database as an OData feed. - -- [Quickstart](quickstart-wcf-data-services.md) - -- [Exposing Your Data as a Service](exposing-your-data-as-a-service-wcf-data-services.md) - -- [How to: Create a Data Service Using an ADO.NET Entity Framework Data Source](create-a-data-service-using-an-adonet-ef-data-wcf.md) - -Expose arbitrary CLR data classes as an OData feed. - -- [Exposing Your Data as a Service](exposing-your-data-as-a-service-wcf-data-services.md) - -- [How to: Create a Data Service Using the Reflection Provider](create-a-data-service-using-rp-wcf-data-services.md) - -- [Data Services Providers](data-services-providers-wcf-data-services.md) - -Consume an OData feed in a .NET Framework-based client application. - -- [Quickstart](quickstart-wcf-data-services.md) - -- [Using a Data Service in a Client Application](using-a-data-service-in-a-client-application-wcf-data-services.md) - -- [WCF Data Services Client Library](wcf-data-services-client-library.md) - -Consume an OData feed in a Silverlight-based client application. - -- [WCF Data Services (Silverlight)](/previous-versions/windows/silverlight/dotnet-windows-silverlight/cc838234(v=vs.95)) - -- [Asynchronous Operations](asynchronous-operations-wcf-data-services.md) - -- [How to: Bind Data Service Data to Controls (Silverlight Client)](/previous-versions/dotnet/wcf-data-services/ee681614(v=vs.103)) - -Consume an OData feed in an AJAX-based client application. - -- [Using a Data Service in a Client Application](using-a-data-service-in-a-client-application-wcf-data-services.md) - -- [OData: URI Conventions](https://www.odata.org/documentation/odata-version-2-0/uri-conventions/) - -- [OData: JavaScript Object Notation (JSON) Format](https://www.odata.org/developers/protocols/json-format/) - -Create an end-to-end data solution that uses OData to transfer data between client and server. - -- [Quickstart](quickstart-wcf-data-services.md) - -- [Using a Data Service in a Client Application](using-a-data-service-in-a-client-application-wcf-data-services.md) - -- [WCF Data Services Client Library](wcf-data-services-client-library.md) - -Create a .NET Framework-based client application that consumes an OData feed asynchronously to avoid latency issues on the client. - -- [How to: Execute Asynchronous Data Service Queries](how-to-execute-asynchronous-data-service-queries-wcf-data-services.md) - -- [Asynchronous Operations](asynchronous-operations-wcf-data-services.md) - -- [WCF Data Services (Silverlight)](/previous-versions/windows/silverlight/dotnet-windows-silverlight/cc838234(v=vs.95)) - -Expose and consume an OData feed with a binary large object that is accessed and changed as a stream. - -- [Streaming Provider](streaming-provider-wcf-data-services.md) - -- [Working with Binary Data](working-with-binary-data-wcf-data-services.md) - -Bind OData feeds to controls in a Windows Presentation Framework (WPF) application. - -- [Binding Data to Controls](binding-data-to-controls-wcf-data-services.md) - -- [How to: Bind Data to Windows Presentation Foundation Elements](bind-data-to-wpf-elements-wcf-data-services.md) - -- [How to: Bind Data Using a Project Data Source](how-to-bind-data-using-a-project-data-source-wcf-data-services.md) - -Intercept incoming messages to the data service to perform data validation and role-based filtering of queries. - -- [How to: Intercept Data Service Messages](how-to-intercept-data-service-messages-wcf-data-services.md) - -- [Interceptors](interceptors-wcf-data-services.md) - -Create endpoints on a data service to enable custom service behaviors. - -- [How to: Define a Service Operation](how-to-define-a-service-operation-wcf-data-services.md) - -- [Service Operations](service-operations-wcf-data-services.md) - -## See also - -- [Quickstart](quickstart-wcf-data-services.md) -- [Resources](wcf-data-services-resources.md) diff --git a/docs/framework/data/wcf/asynchronous-operations-wcf-data-services.md b/docs/framework/data/wcf/asynchronous-operations-wcf-data-services.md deleted file mode 100644 index 0dea633e82957..0000000000000 --- a/docs/framework/data/wcf/asynchronous-operations-wcf-data-services.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -description: "Learn more about: Asynchronous Operations (WCF Data Services)" -title: "Asynchronous Operations (WCF Data Services)" -ms.date: "03/30/2017" -helpviewer_keywords: - - "WCF Data Services, asynchronous operations" - - "asynchronous operations [WCF Data Services]" - - "WCF Data Services, client library" -ms.assetid: 679644c7-e3fc-422c-b14a-b44b683900d0 ---- -# Asynchronous Operations (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -Web applications must accommodate higher latency between client and server than applications that run inside internal networks. To optimize the performance and user experience of your application, we recommend using the asynchronous methods of the and classes when accessing WCF Data Services servers over the Web. - - Although the WCF Data Services servers process HTTP requests asynchronously, some methods of the WCF Data Services client libraries are synchronous and wait until the entire request-response exchange is completed before continuing execution. The asynchronous methods of the WCF Data Services client libraries do not wait for this exchange to complete and can allow your application to maintain a responsive user interface in the meantime. - - You can perform asynchronous operations by using a pair of methods on the and classes that start with *Begin* and *End* respectively. The *Begin* methods register a delegate that the service calls when the operation is complete. The *End* methods should be called in the delegate that is registered to handle the callback from the completed operations. When you call the *End* method to complete an asynchronous operation, you must do so from the same or instance that you used to begin the operation. Each *Begin* method takes a `state` parameter that can pass a state object to the callback. This state object is retrieved from the that is supplied with the callback and is used to call the corresponding *End* method to complete the asynchronous operation. For example, when you supply the instance as the `state` parameter when you call the method on the instance, the same instance is returned by the . This instance of is then used to call the method to complete the query operation. For more information, see [How to: Execute Asynchronous Data Service Queries](how-to-execute-asynchronous-data-service-queries-wcf-data-services.md). - -> [!NOTE] -> Only asynchronous operations are supported by the client libraries that are provided in the .NET Framework for Silverlight. For more information, see [WCF Data Services (Silverlight)](/previous-versions/windows/silverlight/dotnet-windows-silverlight/cc838234(v=vs.95)). - - The .NET Framework client libraries support the following asynchronous operations: - -|Operation|Methods| -|---------------|-------------| -|Executing a .|-
- | -|Executing a query from the .|-
- | -|Executing a batch query from the .|-
- | -|Loading a related entity into the .|-
- | -|Saving changes to objects in the |-
- | - -## Threading Considerations for Asynchronous Operations - - In a multi-threaded application, the delegate that is registered as a callback for the asynchronous operation is not necessarily invoked on the same thread that was used to call the *Begin* method, which creates the initial request. In an application where the callback must be invoked on a specific thread, you must explicitly marshal the execution of the *End* method, which handles the response, to the desired thread. For example, in Windows Presentation Foundation (WPF)-based applications and Silverlight-based applications, the response must be marshaled back to the UI thread by using the method on the object. For more information, see [Querying the Data Service (WCF Data Services/Silverlight)](/previous-versions/windows/silverlight/dotnet-windows-silverlight/cc903932(v=vs.95)). - -## See also - -- [WCF Data Services Client Library](wcf-data-services-client-library.md) diff --git a/docs/framework/data/wcf/attach-an-existing-entity-to-dc-wcf-data.md b/docs/framework/data/wcf/attach-an-existing-entity-to-dc-wcf-data.md deleted file mode 100644 index f4d37fc4e8373..0000000000000 --- a/docs/framework/data/wcf/attach-an-existing-entity-to-dc-wcf-data.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -description: "Learn more about: How to: Attach an Existing Entity to the DataServiceContext (WCF Data Services)" -title: "How to: Attach an Existing Entity to the DataServiceContext (WCF Data Services)" -ms.date: "03/30/2017" -ms.topic: how-to -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, changing data" -ms.assetid: e3f2d71d-434c-4e98-91c3-95adae4702b6 ---- -# How to: Attach an Existing Entity to the DataServiceContext (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -When an entity already exists in a data service, the WCF Data Services client library enables you to attach an object that represents the entity directly to the without first executing a query. For more information, see [Updating the Data Service](updating-the-data-service-wcf-data-services.md). - - The example in this topic uses the Northwind sample data service and autogenerated client data service classes. This service and the client data classes are created when you complete the [WCF Data Services quickstart](quickstart-wcf-data-services.md). - -## Example - - The following example shows how to create an existing `Customer` object that contains changes to be saved to the data service. The object is attached to the context and the method is called to mark the attached object as before the method is called. - - [!code-csharp[Astoria Northwind Client#AttachObject](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#attachobject)] - [!code-vb[Astoria Northwind Client#AttachObject](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#attachobject)] - -## See also - -- [WCF Data Services Client Library](wcf-data-services-client-library.md) diff --git a/docs/framework/data/wcf/batching-operations-wcf-data-services.md b/docs/framework/data/wcf/batching-operations-wcf-data-services.md deleted file mode 100644 index cf186d7055afe..0000000000000 --- a/docs/framework/data/wcf/batching-operations-wcf-data-services.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -description: "Learn more about: Batching Operations (WCF Data Services)" -title: "Batching Operations (WCF Data Services)" -ms.date: "03/30/2017" -helpviewer_keywords: - - "WCF Data Services, client library" -ms.assetid: 962a49d1-cc11-4b96-bc7d-071dd6607d6c ---- -# Batching Operations (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -The Open Data Protocol (OData) supports batch processing of requests to an OData-based service. For more information, see [OData: Batch Processing](https://www.odata.org/documentation/odata-version-2-0/batch-processing/). In WCF Data Services, each operation that uses the , such as executing a query or saving changes, results in a separate request being sent to the data service. In order to maintain a logical scope for sets of operations, you can explicitly define operational batches. This ensures that all operations in the batch are sent to the data service in a single HTTP request, enables the server to process the operations atomically, and reduces the number of round trips to the data service. - -## Batching Query Operations - - To execute multiple queries in a single batch, you must create each query in the batch as a separate instance of the class. When you create a query request in this manner, the query itself is defined as a URI, and it follows the rules for addressing resources. For more information, see [Accessing Data Service Resources](accessing-data-service-resources-wcf-data-services.md). The batched query requests are sent to the data service when the method is called that contains the query request objects. This method returns a object, which is a collection of objects that represent responses to individual queries in the batch, each of which contains either a collection of objects returned by the query or error information. When any single query operation in the batch fails, error information is returned in the object for the operation that failed and the remaining operations are still executed. For more information, see [How to: Execute Queries in a Batch](how-to-execute-queries-in-a-batch-wcf-data-services.md). - - Batched queries can also be executed asynchronously. For more information, see [Asynchronous Operations](asynchronous-operations-wcf-data-services.md). - -## Batching the SaveChanges Operation - - When you call the method, all changes that the context tracks are translated into REST-based operations that are sent as requests to the OData service. By default, these changes are not sent in a single request message. To require that all changes be sent in a single request, you must call the method and include a value of in the enumeration that you supply to the method. - - You can also asynchronously save batched changes. For more information, see [Asynchronous Operations](asynchronous-operations-wcf-data-services.md). - -## See also - -- [WCF Data Services Client Library](wcf-data-services-client-library.md) diff --git a/docs/framework/data/wcf/bind-data-to-wpf-elements-wcf-data-services.md b/docs/framework/data/wcf/bind-data-to-wpf-elements-wcf-data-services.md deleted file mode 100644 index f6c08608e821b..0000000000000 --- a/docs/framework/data/wcf/bind-data-to-wpf-elements-wcf-data-services.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -description: "Learn more about: How to: Bind Data to Windows Presentation Foundation Elements (WCF Data Services)" -title: "How to: Bind Data to Windows Presentation Foundation Elements (WCF Data Services)" -ms.date: "03/30/2017" -ms.topic: how-to -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "data binding, WCF Data Services" - - "WCF Data Services, data binding" -ms.assetid: d6538ab0-0abe-426a-b9d9-e6f3a5ca2016 ---- -# How to: Bind Data to Windows Presentation Foundation Elements (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -With WCF Data Services, you can bind Windows Presentation Foundation (WPF) elements such as a or to an instance of , which handles the events raised by the controls to keep the synchronized with changes made to data in the controls. For more information, see [Binding Data to Controls](binding-data-to-controls-wcf-data-services.md). - - The example in this topic uses the Northwind sample data service and autogenerated client data service classes. This service and the client data classes are created when you complete the [WCF Data Services quickstart](quickstart-wcf-data-services.md). - -## Example - - The following example is from the code-behind page for an Extensible Application Markup Language (XAML) page that defines the `SalesOrders` window in WPF. When the window is loaded, a is created based on the result of a query that returns customers, filtered by country/region. All of the pages of this paged result are loaded, along with the related orders, and are bound to the property of the that is the root layout control for the WPF window. For more information, see [Loading Deferred Content](loading-deferred-content-wcf-data-services.md). - - [!code-csharp[Astoria Northwind Client#BindPagedData](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/customerorderswpf3.xaml.cs#bindpageddata)] - [!code-vb[Astoria Northwind Client#BindPagedData](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/customerorderswpf3.xaml.vb#bindpageddata)] - -## Example - - The following XAML defines the `SalesOrders` window in WPF for the previous example. - - [!code-xaml[Astoria Northwind Client#BindPagedDataXaml](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/customerorderswpf3.xaml#bindpageddataxaml)] - -## Example - - The following example is from the code-behind page for an Extensible Application Markup Language (XAML) page that defines the `SalesOrders` window in WPF. When the window is loaded, a is created based on the result of a query that returns customers with related objects, filtered by country/region. This result is bound to the property of the that is the root layout control for the WPF window. - - [!code-csharp[Astoria Northwind Client#WpfDataBinding](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/customerorderswpf.xaml.cs#wpfdatabinding)] - [!code-vb[Astoria Northwind Client#WpfDataBinding](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/customerorderswpf.xaml.vb#wpfdatabinding)] - -## Example - - The following XAML defines the `SalesOrders` window in WPF for the previous example. - - [!code-xaml[Astoria Northwind Client#WpfDataBindingXaml](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/customerorderswpf.xaml#wpfdatabindingxaml)] diff --git a/docs/framework/data/wcf/binding-data-to-controls-wcf-data-services.md b/docs/framework/data/wcf/binding-data-to-controls-wcf-data-services.md deleted file mode 100644 index 6dc6147b3cab0..0000000000000 --- a/docs/framework/data/wcf/binding-data-to-controls-wcf-data-services.md +++ /dev/null @@ -1,123 +0,0 @@ ---- -description: "Learn more about: Binding Data to Controls (WCF Data Services)" -title: "Binding Data to Controls (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "client applications, WCF Data Services" - - "WCF Data Services, client library" - - "data binding, WCF Data Services" -ms.assetid: b32e1d49-c214-4cb1-867e-88fbb3d08c8d ---- -# Binding Data to Controls (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -With WCF Data Services, you can bind controls such as the `ComboBox` and `ListView` controls to an instance of the class. This collection, which inherits from the class, contains the data from an Open Data Protocol (OData) feed. This class represents a dynamic data collection that provides notifications when items get added or removed. When you use an instance of for data binding, the WCF Data Services client libraries handle these events to ensure that objects tracked by the remain synchronized with the data in the bound UI element. - - The class (indirectly) implements the interface to alert the context when objects are added to or removed from the collection. Data service type objects used with a must also implement the interface to alert the when properties of objects in the binding collection have changed. - -> [!NOTE] -> When you use the **Add Service Reference** dialog or the [DataSvcUtil.exe](wcf-data-service-client-utility-datasvcutil-exe.md) tool with the `/dataservicecollection` option to generate the client data service classes, the generated data classes implement the interface. For more information, see [How to: Manually Generate Client Data Service Classes](how-to-manually-generate-client-data-service-classes-wcf-data-services.md). - -## Creating the Binding Collection - - Create a new instance of the class by calling one of the class constructor methods with a supplied instance and optionally a or LINQ query that, when it is executed, returns an instance. This provides the source of objects for the binding collection, which are materialized from an OData feed. For more information, see [Object Materialization](object-materialization-wcf-data-services.md). By default, changes made to bound objects and items inserted into the collection are automatically tracked by the . If you need to manually track these changes, call one of the constructor methods that takes a `trackingMode` parameter and specify a value of . - - The following example shows how to create an instance of based on a supplied and a that returns all customers with related orders: - - [!code-csharp[Astoria Northwind Client#CustomersOrders2Binding](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/customerorders2.cs#customersorders2binding)] - [!code-vb[Astoria Northwind Client#CustomersOrders2Binding](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/customerorders2.vb#customersorders2binding)] - -## Binding Data to Windows Presentation Foundation Elements - - Because the class inherits from the class, you can bind objects to an element, or control, in a Windows Presentation Foundation (WPF) application as you would when using the class for binding. For more information, see [Data Binding (Windows Presentation Foundation)](/dotnet/desktop/wpf/data/data-binding-overview). One way to bind data service data to WPF controls is to set the `DataContext` property of the element to the instance of the class that contains the query result. In this case, you use the property to set the object source for the control. Use the property to specify which property of the bound object to display. If you are binding an element to a related object that is returned by a navigation property, include the path in the binding defined for the property. This path is relative to the root object set by the property of the parent control. The following example sets the property of a element to bind the parent control to an of customer objects: - - [!code-csharp[Astoria Northwind Client#MasterDetailBinding](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/customerorderscustom.xaml.cs#masterdetailbinding)] - [!code-csharp[Astoria Northwind Client#MasterDetailBinding](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/customerorderswpf.xaml.cs#masterdetailbinding)] - [!code-vb[Astoria Northwind Client#MasterDetailBinding](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/customerorderscustom.xaml.vb#masterdetailbinding)] - [!code-vb[Astoria Northwind Client#MasterDetailBinding](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/customerorderswpf.xaml.vb#masterdetailbinding)] - [!code-vb[Astoria Northwind Client#MasterDetailBinding](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/customerorderscustom2.xaml.vb#masterdetailbinding)] - - The following example shows the XAML binding definition of the child and controls: - - [!code-xaml[Astoria Northwind Client#MasterDetailXaml](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/customerorderswpf.xaml#masterdetailxaml)] - - For more information, see [How to: Bind Data to Windows Presentation Foundation Elements](bind-data-to-wpf-elements-wcf-data-services.md). - - When an entity participates in a one-to-many or many-to-many relationship, the navigation property for the relationship returns a collection of related objects. When you use the **Add Service Reference** dialog box or the DataSvcUtil.exe tool to generate the client data service classes, the navigation property returns an instance of . This enables you to bind related objects to a control, and support common WPF binding scenarios, such as the master-detail binding pattern for related entities. In the previous XAML example, the XAML code binds the master to the root data element. The order is then bound to the Orders returned from the selected Customers object, which is in turn bound to the root data element of the . - -## Binding Data to Windows Forms Controls - - To bind objects to a Windows Form control, set the `DataSource` property of the control to the instance of the class that contains the query result. - -> [!NOTE] -> Data binding is only supported for controls that listen for change events by implementing the and interfaces. When a control does not support this kind of change notification, changes that are made to the underlying are not reflected in the bound control. - - The following example binds an to a control: - - [!code-csharp[Astoria Northwind Client#CustomersOrdersDataBindingSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/customerorders.cs#customersordersdatabindingspecific)] - [!code-vb[Astoria Northwind Client#CustomersOrdersDataBindingSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/customerorders.vb#customersordersdatabindingspecific)] - - When you use the **Add Service Reference** dialog to generate the client data service classes, a project data source is also created that is based on the generated . With this data source, you can create UI elements or controls that display data from the data service simply by dragging items from the **Data Sources** window onto the designer. These items become elements in the application UI that are bound to the data source. For more information, see [How to: Bind Data Using a Project Data Source](how-to-bind-data-using-a-project-data-source-wcf-data-services.md). - -## Binding Paged Data - - A data service can be configured to limit the amount of queried data that is returned in a single response message. For more information, see [Configuring the Data Service](configuring-the-data-service-wcf-data-services.md). When the data service is paging response data, each response contains a link that is used to return the next page of results. For more information, see [Loading Deferred Content](loading-deferred-content-wcf-data-services.md). In this case, you must explicitly load pages by calling the method on the by passing the URI obtained from the property, as in the following example: - - [!code-csharp[Astoria Northwind Client#BindPagedDataSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/customerorderswpf3.xaml.cs#bindpageddataspecific)] - [!code-vb[Astoria Northwind Client#BindPagedDataSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/customerorderswpf3.xaml.vb#bindpageddataspecific)] - - Related objects are loaded in a similar manner. For more information, see [How to: Bind Data to Windows Presentation Foundation Elements](bind-data-to-wpf-elements-wcf-data-services.md). - -## Customizing Data Binding Behaviors - - The class enables you to intercept the events raised when changes are made to the collection, such as an object being added or removed, and when changes are made to the properties of object in a collection. You can modify the data binding events to override the default behavior, which includes the following constraints: - -- No validation is performed within the delegates. - -- Adding an entity automatically adds related entities. - -- Deleting an entity does not delete the related entities. - - When you create a new instance of , you have the option to specify the following parameters that define delegates to methods that handle the events raised when bound objects are changed: - -- `entityChanged` - a method that is called when the property of a bound object is changed. This delegate accepts an object and returns a Boolean value that indicates whether the default behavior, to call on the , should still occur. - -- `entityCollectionChanged` - a method that is called when an object is added or removed from the binding collection. This delegate accepts an object and returns a Boolean value that indicates whether the default behavior, to call for an action or for a action on the , should still occur. - -> [!NOTE] -> WCF Data Services performs no validation of the custom behaviors that you implement in these delegates. - - In the following example, the action is customized to call the and method to remove `Orders_Details` entities that belong to a deleted `Orders` entity. This custom action is performed because dependent entities are not automatically deleted when the parent entity is deleted. - - [!code-csharp[Astoria Northwind Client#CustomersOrdersDeleteRelated](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/customerorderscustom.xaml.cs#customersordersdeleterelated)] - [!code-vb[Astoria Northwind Client#CustomersOrdersDeleteRelated](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/customerorderscustom.xaml.vb#customersordersdeleterelated)] - [!code-vb[Astoria Northwind Client#CustomersOrdersDeleteRelated](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/customerorderscustom2.xaml.vb#customersordersdeleterelated)] - - For more information, see [How to: Customize Data Binding Behaviors](how-to-customize-data-binding-behaviors-wcf-data-services.md). - - The default behavior when an object is removed from a by using the method is that the object is also marked as deleted in the . To change this behavior, you can specify a delegate to a method in the `entityCollectionChanged` parameter that is called when the event occurs. - -## Data Binding with Custom Client Data Classes - - To be able to load objects into a , the objects themselves must implement the interface. Data service client classes that are generated when you use the **Add Service Reference** dialog box or the [DataSvcUtil.exe](wcf-data-service-client-utility-datasvcutil-exe.md) tool implement this interface. If you provide your own client data classes, you must use another type of collection for data binding. When objects change, you must handle events in the data bound controls to call the following methods of the class: - -- - when a new object is added to the collection. - -- - when an object is removed from the collection. - -- - when a property is changed on an object in the collection. - -- - when an object is added to a collection of related object. - -- - when an object is added to a collection of related objects. - - For more information, see [Updating the Data Service](updating-the-data-service-wcf-data-services.md). - -## See also - -- [How to: Manually Generate Client Data Service Classes](how-to-manually-generate-client-data-service-classes-wcf-data-services.md) -- [How to: Add a Data Service Reference](how-to-add-a-data-service-reference-wcf-data-services.md) diff --git a/docs/framework/data/wcf/calling-service-operations-wcf-data-services.md b/docs/framework/data/wcf/calling-service-operations-wcf-data-services.md deleted file mode 100644 index 94aa284f06ed2..0000000000000 --- a/docs/framework/data/wcf/calling-service-operations-wcf-data-services.md +++ /dev/null @@ -1,143 +0,0 @@ ---- -description: "Learn more about: Calling Service Operations (WCF Data Services)" -title: "Calling Service Operations (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -ms.assetid: 1767f3a7-29d2-4834-a763-7d169693fa8b ---- -# Calling Service Operations (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -The Open Data Protocol (OData) defines service operations for a data service. WCF Data Services enables you to define such operations as methods on the data service. Like other data service resources, these service operations are addressed by using URIs. A service operation can return collections of entity types, single entity type instances, and primitive types, such as integer and string. A service operation can also return `null` (`Nothing` in Visual Basic). The WCF Data Services client library can be used to access service operations that support HTTP GET requests. These kinds of service operations are defined as methods that have the applied. For more information, see [Service Operations](service-operations-wcf-data-services.md). - - Service operations are exposed in the metadata returned by a data service that implements the OData. In the metadata, service operations are represented as `FunctionImport` elements. When generating the strongly typed , the Add Service Reference and DataSvcUtil.exe tools ignore this element. Because of this, you will not find a method on the context that can be used to call a service operation directly. However, you can still use the WCF Data Services client to call service operations in one of these two ways: - -- By calling the method on the , supplying the URI of the service operation, along with any parameters. This method is used to call any GET service operation. - -- By using the method on the to create a object. When calling , the name of the service operation is supplied to the `entitySetName` parameter. This method returns a object that calls the service operation when enumerated or when the method is called. This method is used to call GET service operations that return a collection. A single parameter can be supplied by using the method. The object returned by this method can be further composed against like any query object. For more information, see [Querying the Data Service](querying-the-data-service-wcf-data-services.md). - -## Considerations for Calling Service Operations - - The following considerations apply when using the WCF Data Services client to call service operations. - -- When accessing the data service asynchronously, you must use the equivalent asynchronous / methods on or the / methods on . - -- The WCF Data Services client library cannot materialize the results from a service operation that returns a collection of primitive types. - -- The WCF Data Services client library does not support calling POST service operations. Service operations that are called by an HTTP POST are defined by using the with the `Method="POST"` parameter. To call a service operation by using an HTTP POST request, you must instead use an . - -- You cannot use to call a GET service operation that returns a single result, of either entity or primitive type, or that requires more than one input parameter. You must instead call the method. - -- Consider creating an extension method on the strongly typed partial class, which is generated by the tools, that uses either the or the method to call a service operation. This enables you to call service operations directly from the context. For more information, see the blog post [Service Operations and the WCF Data Services Client](/archive/blogs/astoriateam/service-operations-and-the-wcf-data-services-client). - -- When you use to call a service operation, the client library automatically escapes characters supplied to the by performing percent-encoding of reserved characters, such as ampersand (&), and escaping of single-quotes in strings. However, when you call one of the *Execute* methods to call a service operation, you must remember to perform this escaping of any user-supplied string values. Single-quotes in URIs are escaped as pairs of single-quotes. - -## Examples of Calling Service Operations - - This section contains the following examples of how to call service operations by using the WCF Data Services client library: - -- [Calling Execute<T> to Return a Collection of Entities](calling-service-operations-wcf-data-services.md#ExecuteIQueryable) - -- [Using CreateQuery<T> to Return a Collection of Entities](calling-service-operations-wcf-data-services.md#CreateQueryIQueryable) - -- [Calling Execute<T> to Return a Single Entity](calling-service-operations-wcf-data-services.md#ExecuteSingleEntity) - -- [Calling Execute<T> to Return a Collection of Primitive Values](calling-service-operations-wcf-data-services.md#ExecutePrimitiveCollection) - -- [Calling Execute<T> to Return a Single Primitive Value](calling-service-operations-wcf-data-services.md#ExecutePrimitiveValue) - -- [Calling a Service Operation that Returns No Data](calling-service-operations-wcf-data-services.md#ExecuteVoid) - -- [Calling a Service Operation Asynchronously](calling-service-operations-wcf-data-services.md#ExecuteAsync) - - - -### Calling Execute\ to Return a Collection of Entities - - The following example calls a service operation named GetOrdersByCity, which takes a string parameter of `city` and returns an : - - [!code-csharp[Astoria Northwind Client#CallServiceOperationIQueryable](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#callserviceoperationiqueryable)] - [!code-vb[Astoria Northwind Client#CallServiceOperationIQueryable](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#callserviceoperationiqueryable)] - - In this example, the service operation returns a collection of `Order` objects with related `Order_Detail` objects. - - - -### Using CreateQuery\ to Return a Collection of Entities - - The following example uses the to return a that is used to call the same GetOrdersByCity service operation: - - [!code-csharp[Astoria Northwind Client#CallServiceOperationCreateQuery](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#callserviceoperationcreatequery)] - [!code-vb[Astoria Northwind Client#CallServiceOperationCreateQuery](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#callserviceoperationcreatequery)] - - In this example, the method is used to add the parameter to the query, and the method is used to include related Order_Details objects in the results. - - - -### Calling Execute\ to Return a Single Entity - - The following example calls a service operation named GetNewestOrder that returns only a single Order entity: - - [!code-csharp[Astoria Northwind Client#CallServiceOperationSingleEntity](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#callserviceoperationsingleentity)] - [!code-vb[Astoria Northwind Client#CallServiceOperationSingleEntity](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#callserviceoperationsingleentity)] - - In this example, the method is used to request only a single Order entity on execution. - - - -### Calling Execute\ to Return a Collection of Primitive Values - - The following example calls a service operation that returns a collection of string values: - - [!code-csharp[Astoria Northwind Client#CallServiceOperationEnumString](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#callserviceoperationenumstring)] - - - -### Calling Execute\ to Return a Single Primitive Value - - The following example calls a service operation that returns a single string value: - - [!code-csharp[Astoria Northwind Client#CallServiceOperationSingleInt](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#callserviceoperationsingleint)] - [!code-vb[Astoria Northwind Client#CallServiceOperationSingleInt](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#callserviceoperationsingleint)] - - Again in this example, the method is used to request only a single integer value on execution. - - - -### Calling a Service Operation that Returns No Data - - The following example calls a service operation that returns no data: - - [!code-csharp[Astoria Northwind Client#CallServiceOperationVoid](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#callserviceoperationvoid)] - [!code-vb[Astoria Northwind Client#CallServiceOperationVoid](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#callserviceoperationvoid)] - - Because not data is returned, the value of the execution is not assigned. The only indication that the request has succeeded is that no is raised. - - - -### Calling a Service Operation Asynchronously - - The following example calls a service operation asynchronously by calling and : - - [!code-csharp[Astoria Northwind Client#CallServiceOperationAsync](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#callserviceoperationasync)] - [!code-vb[Astoria Northwind Client#CallServiceOperationAsync](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#callserviceoperationasync)] - - [!code-csharp[Astoria Northwind Client#OnAsyncExecutionComplete](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#onasyncexecutioncomplete)] - [!code-vb[Astoria Northwind Client#OnAsyncExecutionComplete](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#onasyncexecutioncomplete)] - - Because no data is returned, the value returned by the execution is not assigned. The only indication that the request has succeeded is that no is raised. - - The following example calls the same service operation asynchronously by using : - - [!code-csharp[Astoria Northwind Client#CallServiceOperationQueryAsync](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#callserviceoperationqueryasync)] - [!code-vb[Astoria Northwind Client#CallServiceOperationQueryAsync](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#callserviceoperationqueryasync)] - - [!code-csharp[Astoria Northwind Client#OnAsyncQueryExecutionComplete](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#onasyncqueryexecutioncomplete)] - [!code-vb[Astoria Northwind Client#OnAsyncQueryExecutionComplete](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#onasyncqueryexecutioncomplete)] - -## See also - -- [WCF Data Services Client Library](wcf-data-services-client-library.md) diff --git a/docs/framework/data/wcf/configuring-the-data-service-wcf-data-services.md b/docs/framework/data/wcf/configuring-the-data-service-wcf-data-services.md deleted file mode 100644 index a7edd29ceefbd..0000000000000 --- a/docs/framework/data/wcf/configuring-the-data-service-wcf-data-services.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -description: "Learn more about: Configuring the Data Service (WCF Data Services)" -title: "Configuring the Data Service (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, configuring" -ms.assetid: 59efd4c8-cc7a-4800-a0a4-d3f8abe6c55c ---- -# Configuring the Data Service (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -With WCF Data Services, you can create data services that expose Open Data Protocol (OData) feeds. Data in these feeds can come from a variety of data sources. WCF Data Services uses data providers to expose this data as an OData feed. These providers include an Entity Framework provider, a reflection provider, and a set of custom data service provider interfaces. The provider implementation defines the data model for the service. For more information, see [Data Services Providers](data-services-providers-wcf-data-services.md). - - In WCF Data Services, a data service is a class that inherits from the class, where the type of the data service is the entity container of the data model. This entity container has one or more properties that return an , which are used to access entity sets in the data model. - - The behaviors of the data service are defined by the members of the class, and by members of the class, which is accessed from the property of the class. The class is supplied to the `InitializeService` method that is implemented by the data service, as in the following implementation of a Northwind data service: - -[!code-csharp[Astoria Northwind Service#DataServiceConfigComplete](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_service/cs/northwind.svc.cs#dataserviceconfigcomplete)] -[!code-vb[Astoria Northwind Service#DataServiceConfigComplete](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_service/vb/northwind.svc.vb#dataserviceconfigcomplete)] - -## Data Service Configuration Settings - - The class enables you to specify the following data service behaviors: - -|Member|Behavior| -|------------|--------------| -||Enables you to disable count requests that are submitted to the data service by using the `$count` path segment and the `$inlinecount` query option. For more information, see [OData: URI Conventions](https://www.odata.org/documentation/odata-version-2-0/uri-conventions/).| -||Enables you to disable support for data projection in requests that are submitted to the data service by using the `$select` query option. For more information, see [OData: URI Conventions](https://www.odata.org/documentation/odata-version-2-0/uri-conventions/).| -||Enables a data type to be exposed in the metadata for a dynamic metadata provider defined by using the interface.| -||Enables you to specify whether the data service runtime should convert the type that is contained in the payload to the actual property type that is specified in the request.| -||Enables you to specify whether or not registered change interceptors are invoked on the related entities when a relationship link between two entities is deleted.| -||Enables you to limit the number of change sets and query operations that are allowed in a single batch. For more information, see [OData: Batch](https://www.odata.org/documentation/odata-version-2-0/batch-processing/) and [Batching Operations](batching-operations-wcf-data-services.md).| -||Enables you to limit the number of changes that can be included in a single change set. For more information, see [How to: Enable Paging of Data Service Results](how-to-enable-paging-of-data-service-results-wcf-data-services.md).| -||Enables you to limit the size of a response by limiting the number of related entities that can be included in a single request by using the `$expand` query operator. For more information, see [OData: URI Conventions](https://www.odata.org/documentation/odata-version-2-0/uri-conventions/) and [Loading Deferred Content](loading-deferred-content-wcf-data-services.md).| -||Enables you to limit the size of a response by limiting the depth of the graph of related entities that can be included in a single request by using the `$expand` query operator. For more information, see [OData: URI Conventions](https://www.odata.org/documentation/odata-version-2-0/uri-conventions/) and [Loading Deferred Content](loading-deferred-content-wcf-data-services.md).| -||Enables you to limit the number of entities to be inserted that can be contained in a single POST request.| -||Defines the version of the Atom protocol that is used by the data service. When the value of the is set to a value less than the maximum value of , the latest functionality of WCF Data Services is not available to clients accessing the data service. For more information, see [Data Service Versioning](data-service-versioning-wcf-data-services.md).| -||Enables you to limit the size of a response by limiting the number of entities in each entity set that is returned as a data feed.| -||Adds a data type to the list of types that are recognized by the data service.| -||Sets the access rights for entity set resources that are available on the data service. An asterisk (`*`) value can be supplied for the name parameter to set access for all remaining entity sets to the same level. We recommend that you set access to entity sets to provide the least privilege access to data service resources that are required by client applications. For more information, see [Securing WCF Data Services](securing-wcf-data-services.md). For examples of the minimum access rights required for a given URI and HTTP action, see the table in the [Minimum Resource Access Requirements](configuring-the-data-service-wcf-data-services.md#accessRequirements) section.| -||Sets the maximum page size for an entity set resource. For more information, see [How to: Enable Paging of Data Service Results](how-to-enable-paging-of-data-service-results-wcf-data-services.md).| -||Sets the access rights for service operations that are defined on the data service. For more information, see [Service Operations](service-operations-wcf-data-services.md). An asterisk (`*`) value can be supplied for the name parameter to set access for all service operations to the same level. We recommend that you set access to service operations to provide the least privilege access to data service resources that are required by client applications. For more information, see [Securing WCF Data Services](securing-wcf-data-services.md).| -||This configuration property enables you to more easily troubleshoot a data service by returning more information in the error response message. This option is not intended to be used in a production environment. For more information, see [Developing and Deploying WCF Data Services](developing-and-deploying-wcf-data-services.md).| - - - -## Minimum Resource Access Requirements - - The following table details the minimum entity set rights that must be granted to execute a specific operation. Path examples are based on the Northwind data service that is created when you complete the [quickstart](quickstart-wcf-data-services.md). Because both the enumeration and the enumeration are defined by using the , you can use a logical OR operator to specify multiple permissions for a single entity set or operation. For more information, see [How to: Enable Access to the Data Service](how-to-enable-access-to-the-data-service-wcf-data-services.md). - -|Path/Action|`GET`|`DELETE`|`MERGE`|`POST`|`PUT`| -|------------------|-----------|--------------|-------------|------------|-----------| -|`/Customers`||Not supported|Not supported||Not supported| -|`/Customers('ALFKI')`|| and | and |n/a| and | -|`/Customers('ALFKI')/Orders`|`Customers`:

-and-

`Orders`: |Not supported|Not supported|`Customers`: and or

-and-

`Orders` `:` and |Not supported| -|`/Customers('ALFKI')/Orders(10643)`|`Customers`:

-and-

`Orders`: |`Customers`:

-and-

`Orders`: and |`Customers`:

-and-

`Orders`: and |Not supported|`Customers`:

-and-

`Orders`: and | -|`/Orders(10643)/Customer`|`Customers`:

-and-

`Orders`: |`Customers`: and

-and-

`Orders`: |`Customers`: and ;

-and-

`Orders`: |`Customers`:

-and-

`Orders`: and |Not supported| -|`/Customers('ALFKI')/$links/Orders`|`Customers`:

-and-

`Orders`: |Not supported|Not supported|`Customers`: and or

-and-

`Orders`: |Not supported| -|`/Customers('ALFKI')/$links/Orders(10643)`|`Customers`:

-and-

`Orders`: |`Customers`: and or

-and-

`Orders`: |Not supported|Not supported|Not supported| -|`/Orders(10643)/$links/Customer`|`Customers`:

-and-

`Orders`: |`Orders`: and or |`Customers`:

-and-

`Orders`: and |Not supported|`Customers`: ;

-and-

`Orders`: and | -|`/Customers/$count`||Not supported|Not supported|Not supported|Not supported| -|`/Customers('ALFKI')/ContactName`||Not supported||Not supported|| -|`/Customers('ALFKI')/Address/StreetAddress/$value` 1|||Not supported|Not supported|Not supported| -|`/Customers('ALFKI')/ContactName/$value`|| and ||Not supported|| -|`/Customers('ALFKI')/$value` 2||Not supported|Not supported|Not supported|| -|`/Customers?$select=Orders/*&$expand=Orders`|`Customers`:

-and-

`Orders`: |Not supported|Not supported|`Customers`: |Not supported| -|`/Customers('ALFKI')?$select=Orders/*&$expand=Orders`|`Customers`:

-and-

`Orders`: |Not supported|Not supported|Not supported|Not supported| - - 1 In this example, `Address` represents a complex type property of the `Customers` entity that has a property named `StreetAddress`. The model used by the Northwind data services does not explicitly define this complex type. When the data model is defined by using the Entity Framework provider, you can use the Entity Data Model tools to define such a complex type. For more information, see [How to: Create and Modify Complex Types](/previous-versions/dotnet/netframework-4.0/dd456820(v=vs.100)). - - 2 This URI is supported when a property that returns a binary large object (BLOB) is defined as the media resource that belongs to an entity that is a media link entry, which in this case, is `Customers`. For more information, see [Streaming Provider](streaming-provider-wcf-data-services.md). - - - -## Versioning Requirements - - The following data service configuration behaviors require version 2 of the OData protocol, or later versions: - -- Support for count requests. - -- Support for the $select query option for projection. - - For more information, see [Data Service Versioning](data-service-versioning-wcf-data-services.md). - -## See also - -- [Defining WCF Data Services](defining-wcf-data-services.md) -- [Hosting the Data Service](hosting-the-data-service-wcf-data-services.md) diff --git a/docs/framework/data/wcf/create-a-data-service-using-an-adonet-ef-data-wcf.md b/docs/framework/data/wcf/create-a-data-service-using-an-adonet-ef-data-wcf.md deleted file mode 100644 index 83bf0e2a1acfd..0000000000000 --- a/docs/framework/data/wcf/create-a-data-service-using-an-adonet-ef-data-wcf.md +++ /dev/null @@ -1,78 +0,0 @@ ---- -description: "Learn more about: How to: Create a Data Service Using an ADO.NET Entity Framework Data Source (WCF Data Services)" -title: "How to: Create a Data Service Using an ADO.NET Entity Framework Data Source (WCF Data Services)" -ms.date: 08/24/2018 -ms.topic: how-to -helpviewer_keywords: - - "WCF Data Services, providers" - - "WCF Data Services, Entity Framework" -ms.assetid: 6d11fec8-0108-42f5-8719-2a7866d04428 ---- -# How to: Create a Data Service Using an ADO.NET Entity Framework Data Source (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -WCF Data Services exposes entity data as a data service. This entity data is provided by the ADO.NETEntity Framework when the data source is a relational database. This topic shows you how to create an Entity Framework-based data model in a Visual Studio Web application that is based on an existing database and use this data model to create a new data service. - -The Entity Framework also provides a command line tool that can generate an Entity Framework model outside of a Visual Studio project. For more information, see [How to: Use EdmGen.exe to Generate the Model and Mapping Files](../adonet/ef/how-to-use-edmgen-exe-to-generate-the-model-and-mapping-files.md). - -## To add an Entity Framework model that is based on an existing database to an existing Web application - -1. On the **Project** menu, click **Add** > **New Item**. - -2. In the **Templates** pane, click the **Data** category, and then select **ADO.NET Entity Data Model**. - -3. Enter the model name and then click **Add**. - - The first page of the Entity Data Model Wizard is displayed. - -4. In the **Choose Model Contents** dialog box, select **Generate from database**. Then click **Next**. - -5. Click the **New Connection** button. - -6. In the **Connection Properties** dialog box, type your server name, select the authentication method, type the database name, and then click **OK**. - - The **Choose Your Data Connection** dialog box is updated with your database connection settings. - -7. Ensure that the **Save entity connection settings in App.Config as:** checkbox is checked. Then click **Next**. - -8. In the **Choose Your Database Objects** dialog box, select all of database objects that you plan to expose in the data service. - - > [!NOTE] - > Objects included in the data model are not automatically exposed by the data service. They must be explicitly exposed by the service itself. For more information, see [Configuring the Data Service](configuring-the-data-service-wcf-data-services.md). - -9. Click **Finish** to complete the wizard. - - This creates a default data model based on the specific database. The Entity Framework enables to customize the data model. For more information, see [Entity Data Model Tools Tasks](/previous-versions/dotnet/netframework-4.0/bb738480(v=vs.100)). - -## To create the data service by using the new data model - -1. In Visual Studio, open the .edmx file that represents the data model. - -2. In the **Model Browser**, right-click the model, click **Properties**, and then note the name of the entity container. - -3. In **Solution Explorer**, right-click the name of your ASP.NET project, and then click **Add** > **New Item**. - -4. In the **Add New Item** dialog box, select the **WCF Data Service** template in the **Web** category. - - ![WCF Data Service item template in Visual Studio 2015](./media/wcf-data-service-item-template.png) - - > [!NOTE] - > The **WCF Data Service** template is available in Visual Studio 2015, but not in Visual Studio 2017 or later. - -5. Supply a name for the service, and then click **OK**. - - Visual Studio creates the XML markup and code files for the new service. By default, the code-editor window opens. - -6. In the code for the data service, replace the comment `/* TODO: put your data source class name here */` in the definition of the class that defines the data service with the type that inherits from the class and that is the entity container of the data model, which was noted in step 2. - -7. In the code for the data service, enable authorized clients to access the entity sets that the data service exposes. For more information, see [Creating the Data Service](creating-the-data-service.md). - -8. To test the Northwind.svc data service by using a Web browser, follow the instructions in the topic [Accessing the Service from a Web Browser](accessing-the-service-from-a-web-browser-wcf-data-services-quickstart.md). - -## See also - -- [Defining WCF Data Services](defining-wcf-data-services.md) -- [Data Services Providers](data-services-providers-wcf-data-services.md) -- [How to: Create a Data Service Using the Reflection Provider](create-a-data-service-using-rp-wcf-data-services.md) -- [How to: Create a Data Service Using a LINQ to SQL Data Source](create-a-data-service-using-linq-to-sql-wcf.md) diff --git a/docs/framework/data/wcf/create-a-data-service-using-linq-to-sql-wcf.md b/docs/framework/data/wcf/create-a-data-service-using-linq-to-sql-wcf.md deleted file mode 100644 index a2c4090e8772c..0000000000000 --- a/docs/framework/data/wcf/create-a-data-service-using-linq-to-sql-wcf.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -description: "Learn more about: How to: Create a Data Service Using a LINQ to SQL Data Source (WCF Data Services)" -title: "How to: Create a Data Service Using a LINQ to SQL Data Source (WCF Data Services)" -ms.date: "03/30/2017" -ms.topic: how-to -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, LINQ to SQL" - - "WCF Data Services, providers" -ms.assetid: 3b01c2fd-8c6e-4bf5-b38f-9e61bdc3c328 ---- -# How to: Create a Data Service Using a LINQ to SQL Data Source (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -WCF Data Services exposes entity data as a data service. The reflection provider enables you to define a data model that is based on any class that exposes members that return an implementation. To be able to make updates to data in the data source, these classes must also implement the interface. For more information, see [Data Services Providers](data-services-providers-wcf-data-services.md). This topic shows you how to create LINQ to SQL classes that access the Northwind sample database by using the reflection provider, as well as how to create the data service that is based on these data classes. - -## To add LINQ to SQL classes to a project - -1. From within a Visual Basic or C# application, on the **Project** menu, click **Add** > **New Item**. - -2. Click the **LINQ to SQL Classes** template. - -3. Change the name to **Northwind.dbml**. - -4. Click **Add**. - - The Northwind.dbml file is added to the project and the Object Relational Designer (O/R Designer) opens. - -5. In **Server**/**Database Explorer**, under Northwind, expand **Tables** and drag the `Customers` table onto the Object Relational Designer (O/R Designer). - - A `Customer` entity class is created and appears on the design surface. - -6. Repeat step 6 for the `Orders`, `Order_Details`, and `Products` tables. - -7. Right-click the new .dbml file that represents the LINQ to SQL classes and click **View Code**. - - This creates a new code-behind page named Northwind.cs that contains a partial class definition for the class that inherits from the class, which in this case is `NorthwindDataContext`. - -8. Replace the contents of the Northwind.cs code file with the following code. This code implements the reflection provider by extending the and data classes generated by LINQ to SQL: - - [!code-csharp[Astoria Linq Provider#Linq2SqlProvider](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_linq_provider/cs/northwind.cs#linq2sqlprovider)] - [!code-vb[Astoria Linq Provider#Linq2SqlProvider](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_linq_provider/vb/northwind.vb#linq2sqlprovider)] - -### To create a data service by using a LINQ to SQL-based data model - -1. In **Solution Explorer**, right-click the name of your ASP.NET project, and then click **Add** > **New Item**. - -2. In the **Add New Item** dialog box, select the **WCF Data Service** template from the **Web** category. - - ![WCF Data Service item template in Visual Studio 2015](./media/wcf-data-service-item-template.png) - - > [!NOTE] - > The **WCF Data Service** template is available in Visual Studio 2015, but not in Visual Studio 2017 or later. - -3. Supply a name for the service, and then click **OK**. - - Visual Studio creates the XML markup and code files for the new service. By default, the code-editor window opens. - -4. In the code for the data service, replace the comment `/* TODO: put your data source class name here */` in the definition of the class that defines the data service with the type that is the entity container of the data model, which in this case is `NorthwindDataContext`. - -5. In the code for the data service, replace the placeholder code in the `InitializeService` function with the following: - - [!code-csharp[Astoria Linq Provider#EnableAccess](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_linq_provider/cs/northwind.svc.cs#enableaccess)] - [!code-vb[Astoria Linq Provider#EnableAccess](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_linq_provider/vb/northwind.svc.vb#enableaccess)] - - This enables authorized clients to access resources for the three specified entity sets. - -6. To test the Northwind.svc data service by using a Web browser, follow the instructions in the topic [Accessing the Service from a Web Browser](accessing-the-service-from-a-web-browser-wcf-data-services-quickstart.md). - -## See also - -- [How to: Create a Data Service Using an ADO.NET Entity Framework Data Source](create-a-data-service-using-an-adonet-ef-data-wcf.md) -- [How to: Create a Data Service Using the Reflection Provider](create-a-data-service-using-rp-wcf-data-services.md) -- [Data Services Providers](data-services-providers-wcf-data-services.md) diff --git a/docs/framework/data/wcf/create-a-data-service-using-rp-wcf-data-services.md b/docs/framework/data/wcf/create-a-data-service-using-rp-wcf-data-services.md deleted file mode 100644 index e3a8b3f595009..0000000000000 --- a/docs/framework/data/wcf/create-a-data-service-using-rp-wcf-data-services.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -description: "Learn more about: How to: Create a Data Service Using the Reflection Provider (WCF Data Services)" -title: "How to: Create a Data Service Using the Reflection Provider (WCF Data Services)" -ms.date: "03/30/2017" -ms.topic: how-to -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, providers" -ms.assetid: 7315c6d8-f452-4fb2-a0c1-76ab0593c146 ---- -# How to: Create a Data Service Using the Reflection Provider (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -WCF Data Services enables you to define a data model that is based on arbitrary classes as long as those classes are exposed as objects that implement the interface. For more information, see [Data Services Providers](data-services-providers-wcf-data-services.md). - -## Example - - The following example defines a data model that includes `Orders` and `Items`. The entity container class `OrderItemData` has two public methods that return interfaces. These interfaces are the entity sets of the `Orders` and `Items` entity types. An `Order` can include multiple `Items`, so the `Orders` entity type has an `Items` navigation property that returns a collection of `Items` objects. The `OrderItemData` entity container class is the generic type of the class from which the `OrderItems` data service is derived. - -> [!NOTE] -> Because this example demonstrates an in-memory data provider and changes are not persisted outside of the current object instances, there is no benefit derived from implementing the interface. For an example that implements the interface, see [How to: Create a Data Service Using a LINQ to SQL Data Source](create-a-data-service-using-linq-to-sql-wcf.md). - - [!code-csharp[Astoria Reflection Provider#CustomIQueryable](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_reflection_provider/cs/orderitems.svc.cs#customiqueryable)] - [!code-vb[Astoria Reflection Provider#CustomIQueryable](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_reflection_provider/vb/orderitems.svc.vb#customiqueryable)] - -## See also - -- [How to: Create a Data Service Using a LINQ to SQL Data Source](create-a-data-service-using-linq-to-sql-wcf.md) -- [Data Services Providers](data-services-providers-wcf-data-services.md) -- [How to: Create a Data Service Using an ADO.NET Entity Framework Data Source](create-a-data-service-using-an-adonet-ef-data-wcf.md) diff --git a/docs/framework/data/wcf/create-an-asynchronous-wpf-application-wcf-data-services.md b/docs/framework/data/wcf/create-an-asynchronous-wpf-application-wcf-data-services.md deleted file mode 100644 index c3fec98f9a346..0000000000000 --- a/docs/framework/data/wcf/create-an-asynchronous-wpf-application-wcf-data-services.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -description: "Learn more about: How to: Create an Asynchronous Windows Presentation Framework Application (WCF Data Services)" -title: "How to: Create an Asynchronous Windows Presentation Framework Application (WCF Data Services)" -ms.date: "03/30/2017" -ms.topic: how-to -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, asynchronous operations" -ms.assetid: 834614df-1427-4839-b0be-90f68e5afffd ---- -# How to: Create an Asynchronous Windows Presentation Framework Application (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -With WCF Data Services, you can bind data obtained from a data service to UI element of a Windows Presentation Framework (WPF) application. For more information, see [Binding Data to Controls](binding-data-to-controls-wcf-data-services.md).You can also execute operations against the data service in an asynchronous manner, which enables the application to continue to respond while waiting for a response to a data service request. Applications for Silverlight are required to access the data service asynchronously. For more information, see [Asynchronous Operations](asynchronous-operations-wcf-data-services.md). - - This topic shows how to access a data service asynchronously and bind the results to elements of a WPF application. The examples in this topic use the Northwind sample data service and autogenerated client data service classes. This service and the client data classes are created when you complete the [WCF Data Services quickstart](quickstart-wcf-data-services.md). - -## Example - - The following XAML defines the window of the WPF application. - - [!code-xaml[Astoria Northwind Client#WpfDataBindingAsyncXaml](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/customerordersasync.xaml#wpfdatabindingasyncxaml)] - -## Example - - The following code-behind page for the XAML file executes an asynchronous query by using the data service and binds the results to elements in the WPF window. - - [!code-csharp[Astoria Northwind Client#WpfDataBindingAsync](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/customerordersasync.xaml.cs#wpfdatabindingasync)] - [!code-vb[Astoria Northwind Client#WpfDataBindingAsync](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/customerordersasync.xaml.vb#wpfdatabindingasync)] - -## See also - -- [WCF Data Services Client Library](wcf-data-services-client-library.md) diff --git a/docs/framework/data/wcf/creating-the-data-service.md b/docs/framework/data/wcf/creating-the-data-service.md deleted file mode 100644 index da1f8b2a4b874..0000000000000 --- a/docs/framework/data/wcf/creating-the-data-service.md +++ /dev/null @@ -1,104 +0,0 @@ ---- -title: Create a WCF data service in Visual Studio -description: Learn how to create a sample data service that uses WCF Data Services to expose an OData feed based on a sample database. -ms.date: 08/24/2018 -dev_langs: - - "csharp" - - "vb" -ms.assetid: 34d1d971-5e18-4c22-9bf6-d3612e27ea59 -recommendations: false ---- -# Create the data service - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -In this topic, you create a sample data service that uses WCF Data Services to expose an Open Data Protocol (OData) feed that's based on the Northwind sample database. The task involves the following basic steps: - -1. Create an ASP.NET Web application. - -2. Define the data model by using the Entity Data Model tools. - -3. Add the data service to the Web application. - -4. Enable access to the data service. - -## Create the ASP.NET web app - -1. In Visual Studio, on the **File** menu, select **New** > **Project**. - -1. In the **New Project** dialog box, under either Visual Basic or Visual C# select the **Web** category, and then select **ASP.NET Web Application**. - -1. Enter `NorthwindService` as the name of the project and then select **OK**. - -1. In the **New ASP.NET Web Application** dialog, select **Empty** and then select **OK**. - -1. (Optional) Specify a specific port number for your Web application. Note: the port number `12345` is used in this series of quickstart topics. - - 1. In **Solution Explorer**, right-click on the ASP.NET project that you just created, and then choose **Properties**. - - 2. Select the **Web** tab, and set the value of the **Specific port** text box to `12345`. - -## Define the data model - -1. In **Solution Explorer**, right-click the name of the ASP.NET project, and then click **Add** > **New Item**. - -2. In the **Add New Item** dialog box, select the **Data** category, and then select **ADO.NET Entity Data Model**. - -3. For the name of the data model, enter `Northwind.edmx`. - -4. In the **Entity Data Model Wizard**, select **EF Designer from Database**, and then click **Next**. - -5. Connect the data model to the database by doing one of the following steps, and then click **Next**: - - - If you don't have a database connection already configured, click **New Connection** and create a new connection. For more information, see [How to: Create Connections to SQL Server Databases](/previous-versions/visualstudio/visual-studio-2008/s4yys16a(v=vs.90)). This SQL Server instance must have the Northwind sample database attached. - - \- or - - - - If you have a database connection already configured to connect to the Northwind database, select that connection from the list of connections. - -6. On the final page of the wizard, select the check boxes for all tables in the database, and clear the check boxes for views and stored procedures. - -7. Click **Finish** to close the wizard. - -## Create the WCF data service - -1. In **Solution Explorer**, right-click on the ASP.NET project, and then choose **Add** > **New Item**. - -2. In the **Add New Item** dialog box, select the **WCF Data Service** item template from the **Web** category. - - ![WCF Data Service item template in Visual Studio 2015](./media/wcf-data-service-item-template.png) - - > [!NOTE] - > The **WCF Data Service** template is available in Visual Studio 2015, but not in Visual Studio 2017 or later. - -3. For the name of the service, type `Northwind`. - - Visual Studio creates the XML markup and code files for the new service. By default, the code-editor window opens. In **Solution Explorer**, the service has the name Northwind with the extension *.svc.cs* or *.svc.vb*. - -4. In the code for the data service, replace the comment `/* TODO: put your data source class name here */` in the definition of the class that defines the data service with the type that is the entity container of the data model, which in this case is `NorthwindEntities`. The class definition should look this the following: - - [!code-csharp[Astoria Quickstart Service#ServiceDefinition](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_quickstart_service/cs/northwind.svc.cs#servicedefinition)] - [!code-vb[Astoria Quickstart Service#ServiceDefinition](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_quickstart_service/vb/northwind.svc.vb#servicedefinition)] - -## Enable access to data service resources - -1. In the code for the data service, replace the placeholder code in the `InitializeService` function with the following: - - [!code-csharp[Astoria Quickstart Service#AllReadConfig](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_quickstart_service/cs/northwind.svc.cs#allreadconfig)] - [!code-vb[Astoria Quickstart Service#AllReadConfig](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_quickstart_service/vb/northwind.svc.vb#allreadconfig)] - - This enables authorized clients to have read and write access to resources for the specified entity sets. - - > [!NOTE] - > Any client that can access the ASP.NET application can also access the resources exposed by the data service. In a production data service, to prevent unauthorized access to resources you should also secure the application itself. For more information, see [Securing WCF Data Services](securing-wcf-data-services.md). - -## Next steps - -You have successfully created a new data service that exposes an OData feed that is based on the Northwind sample database, and you have enabled access to the feed for clients that have permissions on the ASP.NET Web application. Next, you'll start the data service from Visual Studio and access the OData feed by submitting HTTP GET requests through a Web browser: - -> [!div class="nextstepaction"] -> [Access the service from a web browser](accessing-the-service-from-a-web-browser-wcf-data-services-quickstart.md) - -## See also - -- [ADO.NET Entity Data Model Tools](/previous-versions/dotnet/netframework-4.0/bb399249(v=vs.100)) diff --git a/docs/framework/data/wcf/creating-the-dotnet-client-application-wcf-data-services-quickstart.md b/docs/framework/data/wcf/creating-the-dotnet-client-application-wcf-data-services-quickstart.md deleted file mode 100644 index b6c6e10292f17..0000000000000 --- a/docs/framework/data/wcf/creating-the-dotnet-client-application-wcf-data-services-quickstart.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -description: "Learn more about: Creating the .NET Framework Client Application (WCF Data Services Quickstart)" -title: "Creating the .NET Framework Client Application (WCF Data Services Quickstart)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -ms.assetid: 41ade767-eeab-437d-9121-9797e8fb8045 ---- -# Creating the .NET Framework Client Application (WCF Data Services Quickstart) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -This is the final task of the WCF Data Services quickstart. In this task, you will add a console application to the solution, add a reference to the Open Data Protocol (OData) feed into this new client application, and access the OData feed from the client application by using the generated client data service classes and client libraries. - -> [!NOTE] -> A .NET Framework-based client application is not required to access a data feed. The data service can be accessed by any application component that consumes an OData feed. For more information, see [Using a Data Service in a Client Application](using-a-data-service-in-a-client-application-wcf-data-services.md). - -## To create the client application by using Visual Studio - -1. In **Solution Explorer**, right-click the solution, click **Add**, and then click **New Project**. - -2. In the left pane, select **Installed** > [**Visual C#** or **Visual Basic**] > **Windows Desktop**, and then select the **WPF App** template. - -3. Enter `NorthwindClient` for the project name, and then click **OK**. - -4. Open the file MainWindow.xaml and replace the XAML code with the following code: - - [!code-xaml[Astoria Quickstart Client#Window1Xaml](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_quickstart_client/vb/window1.xaml#window1xaml)] - -## To add a data service reference to the project - -1. In **Solution Explorer**, right-click the NorthwindClient project, click **Add** > **Service Reference**, and then click **Discover**. - - This displays the Northwind data service that you created in the first task. - -2. In the **Namespace** text box, type `Northwind`, and then click **OK**. - - This adds a new code file to the project, which contains the data classes that are used to access and interact with data service resources as objects. The data classes are created in the namespace `NorthwindClient.Northwind`. - -## To access data service data in the WPF application - -1. In **Solution Explorer** under **NorthwindClient**, right-click the project and click **Add Reference**. - -2. In the **Add Reference** dialog box, click the **.NET** tab, select the System.Data.Services.Client.dll assembly, and then click **OK**. - -3. In **Solution Explorer** under **NorthwindClient**, open the code page for the MainWindow.xaml file, and add the following `using` statement (`Imports` in Visual Basic). - - [!code-csharp[Astoria Quickstart Client#Using](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_quickstart_client/cs/window1.xaml.cs#using)] - [!code-vb[Astoria Quickstart Client#Using](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_quickstart_client/vb/window1.xaml.vb#using)] - -4. Insert the following code that queries that data service and binds the result to a into the `MainWindow` class: - - > [!NOTE] - > You must replace the host name `localhost:12345` with the server and port that is hosting your instance of the Northwind data service. - - [!code-csharp[Astoria Quickstart Client#QueryCode](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_quickstart_client/cs/window1.xaml.cs#querycode)] - [!code-vb[Astoria Quickstart Client#QueryCode](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_quickstart_client/vb/window1.xaml.vb#querycode)] - -5. Insert the following code that saves changes into the `MainWindow` class: - - [!code-csharp[Astoria Quickstart Client#SaveChanges](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_quickstart_client/cs/window1.xaml.cs#savechanges)] - [!code-vb[Astoria Quickstart Client#SaveChanges](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_quickstart_client/vb/window1.xaml.vb#savechanges)] - -## To build and run the NorthwindClient application - -1. In **Solution Explorer**, right-click the NorthwindClient project and select **Set as startup project**. - -2. Press **F5** to start the application. - - This builds the solution and starts the client application. Data is requested from the service and displayed in the console. - -3. Edit a value in the **Quantity** column of the data grid, and then click **Save**. - - Changes are saved to the data service. - - > [!NOTE] - > This version of the NorthwindClient application does not support adding and deleting of entities. - -## Next Steps - -You have successfully created the client application that accesses the sample Northwind OData feed. You've also completed the WCF Data Services quickstart! - -For more information about accessing an OData feed from a .NET Framework application, see [WCF Data Services Client Library](wcf-data-services-client-library.md). - -## See also - -- [Getting Started](getting-started-with-wcf-data-services.md) -- [Resources](wcf-data-services-resources.md) diff --git a/docs/framework/data/wcf/custom-data-service-providers-wcf-data-services.md b/docs/framework/data/wcf/custom-data-service-providers-wcf-data-services.md deleted file mode 100644 index 1d372f31e11f7..0000000000000 --- a/docs/framework/data/wcf/custom-data-service-providers-wcf-data-services.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -description: "Learn more about: Custom Data Service Providers (WCF Data Services)" -title: "Custom Data Service Providers (WCF Data Services)" -ms.date: "03/30/2017" -helpviewer_keywords: - - "WCF Data Services, providers" -ms.assetid: e702ecdb-3419-4743-92a9-c3c0e7d44082 ---- -# Custom Data Service Providers (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -WCF Data Services includes a set of providers that enables you to define a data model based on late-bound data types. - -|Provider|Description| -|--------------|-----------------| -|Metadata provider|This is the core custom data service provider that enables you to define a custom data model at runtime by implementing the interface.| -|Query provider|This provider enables you to execute queries against a custom data model that is defined by using the interface. The query provider is created by implementing the interface.| -|Update provider|This provider enables you to make updates to types that are exposed in a custom data service provider and to manage concurrency. An update provider is created by implementing the interface| -|Paging provider|This provider is used with the custom data service provider to enable server-driven paging support. A paging provider for a custom data service is created by implementing the interface.| -|Streaming provider|This provider enables you to expose binary large object data types as a stream. A streaming provider is created by implementing the interface. The streaming provider can also be used with Entity Framework and reflection data source providers. For more information, see [Streaming Provider](streaming-provider-wcf-data-services.md).| - -## See also - -- [Data Services Providers](data-services-providers-wcf-data-services.md) -- [Entity Framework Provider](entity-framework-provider-wcf-data-services.md) -- [Reflection Provider](reflection-provider-wcf-data-services.md) diff --git a/docs/framework/data/wcf/data-service-versioning-wcf-data-services.md b/docs/framework/data/wcf/data-service-versioning-wcf-data-services.md deleted file mode 100644 index 0afc6ad06392a..0000000000000 --- a/docs/framework/data/wcf/data-service-versioning-wcf-data-services.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -description: "Learn more about: Data Service Versioning (WCF Data Services)" -title: "Data Service Versioning (WCF Data Services)" -ms.date: "03/30/2017" -helpviewer_keywords: - - "versioning, WCF Data Services" - - "versioning [WCF Data Services]" - - "WCF Data Services, versioning" -ms.assetid: e3e899cc-7f25-4f67-958f-063f01f79766 ---- -# Data Service Versioning (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -The Open Data Protocol (OData) enables you to create data services so that clients can access data as resources using URIs that are based on a data model. OData also supports the definition of service operations. After initial deployment, and potentially several times during their lifetime, these data services may need to be changed for a variety of reasons, such as changing business needs, information technology requirements, or to address other issues. When you make changes to an existing data service, you must consider whether to define a new version of your data service and how best to minimize the impact on existing client applications. This topic provides guidance on when and how to create a new version of a data service. It also describes how WCF Data Services handles an exchange between clients and data services that support different versions of the OData protocol. - -## Versioning a WCF Data Service - - Once a data service is deployed and the data is being consumed, changes to the data service have the potential to cause compatibility issues with existing client applications. However, because changes are often required by the overall business needs of the service, you must consider when and how to create a new version of your data service with the least impact on client applications. - -### Data Model Changes that Recommend a New Data Service Version - - When considering whether to publish a new version of a data service, it is important to understand how the different kinds of changes may affect client applications. Changes to a data service that might require you to create a new version of a data service can be divided into the following two categories: - -- Changes to the service contract—which include updates to service operations, changes to the accessibility of entity sets (feeds), version changes, and other changes to service behaviors. - -- Changes to the data contract—which include changes to the data model, feed formats, or feed customizations. - - The following table details for which kinds of changes you should consider publishing a new version of the data service: - -|Type of Change|Requires a new version|New version not needed| -|--------------------|----------------------------|----------------------------| -|Service operations|- Add new parameter
- Change return type
- Remove service operation|- Delete existing parameter
- Add new service operation| -|Service behaviors|- Disable count requests
- Disable projection support
- Increase the required data service version|- Enable count requests
- Enable projection support
- Decrease the required data service version| -|Entity set permissions|- Restrict entity set permissions
- Change response code (new first digit value) 1|- Relax entity set permissions
- Change response code (same first digit value)| -|Entity properties|- Remove existing property or relationship
- Add non-nullable property
- Change existing property|- Add nullable property2| -|Entity sets|- Remove entity set|- Add derived type
- Change base type
- Add entity set| -|Feed customization|- Change entity-property mapping|| - - 1 This may depend on how strictly a client application relies on receiving a specific error code. - - 2 You can set the property to `true` to have the client ignore any new properties sent by the data service that are not defined on the client. However, when inserts are made, the properties not included by the client in the POST request are set to their default values. For updates, any existing data in a property unknown to the client might be overwritten with default values. In this case, you should send the update as a MERGE request, which is the default. For more information, see [Managing the Data Service Context](managing-the-data-service-context-wcf-data-services.md). - -### How to Version a Data Service - - When required, a new data service version is defined by creating a new instance of the service with an updated service contract or data model. This new service is then exposed by using a new URI endpoint, which differentiates it from the previous version. For example: - -- Old version: `http://services.odata.org/Northwind/v1/Northwind.svc/` - -- New version: `http://services.odata.org/Northwind/v2/Northwind.svc/` - - When upgrading a data service, clients will need to also be updated based on the new data service metadata and to use the new root URI. When possible, you should maintain the previous version of the data service to support clients that have not yet been upgraded to use the new version. Older versions of a data service can be removed when they are no longer needed. You should consider maintaining the data service endpoint URI in an external configuration file. - -## OData Protocol Versions - - As new versions of OData are released, client applications may not be using the same version of the OData protocol that is supported by the data service. An older client application may access a data service that supports a newer version of OData. A client application may also be using a newer version of the WCF Data Services client library, which supports a newer version of OData than does the data service that is being accessed. - - WCF Data Services leverages the support provided by OData to handle such versioning scenarios. There is also support for generating and using data model metadata to create client data service classes when the client uses a different version of OData than the data service uses. For more information, see the Protocol Versioning section in the [OData: Overview](https://www.odata.org/documentation/odata-version-2-0/overview/) article. - -### Version Negotiation - - The data service can be configured to define the highest version of the OData protocol that will be used by the service, regardless of the version requested by the client. You can do this by specifying a value for the property of the used by the data service. For more information, see [Configuring the Data Service](configuring-the-data-service-wcf-data-services.md). - - When an application uses the WCF Data Services client libraries to access a data service, the libraries automatically set these headers to the correct values, depending on the version of OData and the features that are used in your application. By default, WCF Data Services uses the lowest protocol version that supports the requested operation. - - The following table details the versions of .NET Framework and Silverlight that include WCF Data Services support for specific versions of the OData protocol. - -|OData Protocol Version|Support introduced in…| -|-----------------------------------------------------------------------------------|----------------------------| -|Version 1|- .NET Framework 3.5 Service Pack 1 (SP1)
- Silverlight version 3| -|Version 2|- .NET Framework 4
- Silverlight version 4| - -### Metadata Versions - - By default, WCF Data Services uses version 1.1 of CSDL to represent a data model. This is always the case for data models that are based on either a reflection provider or a custom data service provider. However, when the data model is defined by using the Entity Framework, the version of CSDL returned is the same as the version that is used by the Entity Framework. The version of the CSDL is determined by the namespace of the [Schema element (CSDL)](/ef/ef6/modeling/designer/advanced/edmx/csdl-spec#schema-element-csdl). - - The `DataServices` element of the returned metadata also contains a `DataServiceVersion` attribute, which is the same value as the `DataServiceVersion` header in the response message. Client applications, such as the **Add Service Reference** dialog box in Visual Studio, use this information to generate client data service classes that work correctly with the version of WCF Data Services that host the data service. For more information, see the Protocol Versioning section in the [OData: Overview](https://www.odata.org/documentation/odata-version-2-0/overview/) article. - -## See also - -- [Data Services Providers](data-services-providers-wcf-data-services.md) -- [Defining WCF Data Services](defining-wcf-data-services.md) diff --git a/docs/framework/data/wcf/data-services-providers-wcf-data-services.md b/docs/framework/data/wcf/data-services-providers-wcf-data-services.md deleted file mode 100644 index b223679ff9944..0000000000000 --- a/docs/framework/data/wcf/data-services-providers-wcf-data-services.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -description: "Learn more about: Data Services Providers (WCF Data Services)" -title: "Data Services Providers (WCF Data Services)" -ms.date: "03/30/2017" -helpviewer_keywords: - - "WCF Data Services, providers" -ms.assetid: a0160b1b-3d9c-4cc8-8391-cb0986a60a41 ---- -# Data Services Providers (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -WCF Data Services supports multiple provider models for exposing data as an Open Data Protocol (OData) feed. This topic provides information to enable you to select the best WCF Data Services provider for your data source. - -## Data Source Providers - - WCF Data Services supports the following providers for defining the data model of a data service. - -|Provider|Description| -|--------------|-----------------| -|Entity Framework provider|This provider uses the ADO.NET Entity Framework to enable you to use relational data with a data service by defining a data model that maps to relational data. Your data source can be SQL Server or any other data source with third-party provider support for the Entity Framework. You should use the Entity Framework provider when you have a relational data source, such as a SQL Server database. For more information, see [Entity Framework Provider](entity-framework-provider-wcf-data-services.md).| -|Reflection provider|This provider uses reflection to enable you to define a data model based on existing data classes that can be exposed as instances of the interface. Updates are enabled by implementing the interface. You should use this provider when you have static data classes that are defined at runtime, such as those generated by LINQ to SQL or defined by a typed DataSet. For more information, see [Reflection Provider](reflection-provider-wcf-data-services.md).| -|Custom Data Service Providers|WCF Data Services includes a set of providers that enable you to dynamically define a data model based on late-bound data types. You should implement these interfaces when the data being exposed is not known when the application is being designed or when the Entity Framework or reflection providers are not sufficient. For more information, see [Custom Data Service Providers](custom-data-service-providers-wcf-data-services.md).| - -## Other Data Service Providers - - WCF Data Services has the following additional data service provider that enhances the performance of a data source defined by using one of the other providers. - -|Provider|Description| -|--------------|-----------------| -|Streaming provider|This provider enables you to expose binary large object data types by using WCF Data Services. A streaming provider is created by implementing the interface. This provider can be implemented together with any data source provider. For more information, see [Streaming Provider](streaming-provider-wcf-data-services.md).| - -## See also - -- [Defining WCF Data Services](defining-wcf-data-services.md) -- [Configuring the Data Service](configuring-the-data-service-wcf-data-services.md) -- [Hosting the Data Service](hosting-the-data-service-wcf-data-services.md) diff --git a/docs/framework/data/wcf/defining-wcf-data-services.md b/docs/framework/data/wcf/defining-wcf-data-services.md deleted file mode 100644 index a419197f52357..0000000000000 --- a/docs/framework/data/wcf/defining-wcf-data-services.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -description: "Learn more about: Defining WCF Data Services" -title: "Defining WCF Data Services" -ms.date: "03/30/2017" -helpviewer_keywords: - - "WCF Data Services, configuring" -ms.assetid: 05006ff3-02dc-410e-831e-54ec3e7e24ef ---- -# Defining WCF Data Services - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -This section describes how to create and configure WCF Data Services to expose data as an Open Data Protocol (OData) feed. For more information about the basic steps required to create a data service, see [Exposing Your Data as a Service](exposing-your-data-as-a-service-wcf-data-services.md). - -## In This Section - - [Configuring the Data Service](configuring-the-data-service-wcf-data-services.md) - - Describes the data service configuration options provided by WCF Data Services. - - [Data Services Providers](data-services-providers-wcf-data-services.md) - - Describes the provider models for exposing data as a data service. - - [Service Operations](service-operations-wcf-data-services.md) - - Describes how to define service operations that expose methods on the server. - - [Feed Customization](feed-customization-wcf-data-services.md) - - Describes how to create a mapping between entities in the data model defined by the data service provider and elements in the data feed. - - [Interceptors](interceptors-wcf-data-services.md) - - Describes how to define interceptor methods to perform custom business logic on requests to the data service. - - [Developing and Deploying WCF Data Services](developing-and-deploying-wcf-data-services.md) - - Describes how to develop and deploy a data service by using Visual Studio. - - [Securing WCF Data Services](securing-wcf-data-services.md) - - Describes authentication and authorization for the data service and other security considerations. - - [Hosting the Data Service](hosting-the-data-service-wcf-data-services.md) - - Describes how to select a host for your data service. - - [Data Service Versioning](data-service-versioning-wcf-data-services.md) - - Describes how to work with different versions of the OData. - - [WCF Data Services Protocol Implementation Details](wcf-data-services-protocol-implementation-details.md) - - Describes optional functionalities of the OData protocol that are not currently implemented by WCF Data Services. - -## See also - -- [WCF Data Services Client Library](wcf-data-services-client-library.md) -- [Accessing Data Service Resources](accessing-data-service-resources-wcf-data-services.md) -- [Getting Started](getting-started-with-wcf-data-services.md) diff --git a/docs/framework/data/wcf/developing-and-deploying-wcf-data-services.md b/docs/framework/data/wcf/developing-and-deploying-wcf-data-services.md deleted file mode 100644 index adb5753e93f1c..0000000000000 --- a/docs/framework/data/wcf/developing-and-deploying-wcf-data-services.md +++ /dev/null @@ -1,129 +0,0 @@ ---- -description: "Learn more about: Develop and Deploy WCF Data Services" -title: "Developing and Deploying WCF Data Services" -ms.date: "03/30/2017" -helpviewer_keywords: - - "WCF Data Services, developing" - - "WCF Data Services, deploying" - - "deploying [WCF Data Services" - - "developing applications [WCF Data Services]" -ms.assetid: 6557c0e3-5aea-4f6e-bc14-77ad317a168b ---- -# Develop and Deploy WCF Data Services - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -This article provides information about developing and deploying WCF Data Services. For more basic information about WCF Data Services, see [Getting Started](getting-started-with-wcf-data-services.md) and [Overview](wcf-data-services-overview.md). - -## Develop WCF Data Services - -When you use WCF Data Services to create a data service that supports the Open Data Protocol (OData), you must perform the following basic tasks during development: - -1. **Define the data model** - - WCF Data Services supports a variety of data service providers that enable you to define a data model based on data from a variety of data sources, from relational databases to late-bound data types. For more information, see [Data Services Providers](data-services-providers-wcf-data-services.md). - -2. **Create the data service** - - The most basic data service exposes a class that inherits from the class, with a type `T` that is the namespace-qualified name of the entity container. For more information, see [Defining WCF Data Services](defining-wcf-data-services.md). - -3. **Configure the data service** - - By default, WCF Data Services disables access to resources that are exposed by an entity container. The interface enables you to configure access to resources and service operations, specify the supported version of OData, and to define other service-wide behaviors, such as batching behaviors or the maximum number of entities that can be returned in a single response feed. For more information, see [Configuring the Data Service](configuring-the-data-service-wcf-data-services.md). - -This article primarily covers the development and deployment of data services by using Visual Studio. For information about the flexibility provided by WCF Data Services for exposing your data as OData feeds, see [Defining WCF Data Services](defining-wcf-data-services.md). - -### Choose a Development Web Server - -When you develop a WCF Data Service as an ASP.NET application or ASP.NET Web site by using Visual Studio 2015, you have a choice of Web servers on which to run the data service during development. The following Web servers integrate with Visual Studio to make it easier to test and debug your data services on the local computer. - -1. **Local IIS Server** - - When you create a data service that is an ASP.NET application or ASP.NET Web site that runs on Internet Information Services (IIS), we recommend that you develop and test your data service by using IIS on the local computer. Running the data service on IIS makes it easier to trace HTTP requests during debugging. This also enables you to predetermine the necessary rights required by IIS to access files, databases, and other resources required by the data service. To run your data service on IIS, make sure that both IIS and Windows Communication Foundation (WCF) are installed and configured correctly and grant access to IIS accounts in the file system and databases. For more information, see [How to: Develop a WCF Data Service Running on IIS](how-to-develop-a-wcf-data-service-running-on-iis.md). - - > [!NOTE] - > You must run Visual Studio with administrator rights to enable the develop environment to configure the local IIS server. - -2. **Visual Studio Development Server** - - Visual Studio includes a built-in Web server, the Visual Studio Development Server, which is the default Web server for ASP.NET projects. This Web server is designed to run ASP.NET projects on the local computer during development. The [WCF Data Services quickstart](quickstart-wcf-data-services.md) shows how to create a data service that runs in the Visual Studio Development Server. - - Be aware of the following limitations when you use the Visual Studio Development Server to develop the data service: - - - This server can only be accessed on the local computer. - - - This server listens on `localhost` and on a specific port, not on port 80, which is the default port for HTTP messages. For more information, see [Web Servers in Visual Studio for ASP.NET Web Projects](/previous-versions/aspnet/58wxa9w5(v=vs.120)). - - - This server runs the data service in the context of your current user account. For example, if you are running as an administrator-level user, a data service running in the Visual Studio Development Server will have administrator-level privileges. This can cause the data service to be able to access resources that it does not have the rights to access when deployed to an IIS server. - - - This server does not include the extra facilities of IIS, such as authentication. - - - This server cannot handle chunked HTTP streams, which are sent by default by the WCF Data Services client when accessing large binary data from the data service. For more information, see [Streaming Provider](streaming-provider-wcf-data-services.md). - - - This server has issues with processing the period (`.`) character in a URL, even though this character is supported by WCF Data Services in key values. - - > [!TIP] - > Even though you can use the Visual Studio Development Server to test your data services during development, you should test them again after deploying to a Web server that is running IIS. - -3. **Azure Development Environment** - - Azure Tools for Visual Studio includes an integrated set of tools for developing Azure services in Visual Studio. With these tools, you can develop a data service that can be deployed to Azure, and you can test the data service on the local computer before deployment. Use these tools when using Visual Studio to develop a data service that runs on the Azure platform. For information about installing the tools, see [Azure tools for Visual Studio 2015](../../../azure/vs2015-install.md). For more information about developing a data service that runs on Azure, see the post [Deploying an OData Service in Azure](/archive/blogs/astoriateam/deploying-an-odata-service-in-windows-azure). - -### Development Tips - -Consider the following when you develop a data service: - -- If you plan to authenticate users or restrict access for specific users, determine the security requirements of your data service. For more information, see [Securing WCF Data Services](securing-wcf-data-services.md). - -- An HTTP inspection program can be helpful when debugging a data service by enabling you to inspect the contents of request and response messages. Any network packet analyzer that can display raw packets can be used to inspect HTTP requests to and responses from the data service. - -- When debugging a data service, you may want to get more information about an error from the data service than during regular operation. You can get additional error information from the data service by setting the property in the to `true` and by setting the property of the attribute on the data service class to `true`. For more information, see the post [Debugging WCF Data Services](/archive/blogs/phaniraj/debugging-wcf-data-services). You can also enable tracing in WCF to view exceptions raised in the HTTP messaging layer. For more information, see [Configuring Tracing](../../wcf/diagnostics/tracing/configuring-tracing.md). - -- A data service is usually developed as an ASP.NET application project, but you can also create you data service as an ASP.NET Web site project in Visual Studio. For information about the differences between the two types of projects, see [Web Application Projects versus Web Site Projects in Visual Studio](/previous-versions/aspnet/dd547590(v=vs.110)). - -- When you create a data service by using the **Add New Item** dialog box in Visual Studio, the data service is hosted by ASP.NET in IIS. While ASP.NET and IIS is the default host for a data service, other hosting options are supported. For more information, see [Hosting the Data Service](hosting-the-data-service-wcf-data-services.md). - -## Deploy WCF Data Services - -WCF Data Service provides flexibility in choosing the process that hosts the data service. You can use Visual Studio to deploy a data service to the following platforms: - -- **IIS-Hosted Web Server** - - When a data service is developed as an ASP.NET project, it can be deployed to an IIS Web server by using the standard ASP.NET deployment processes. Visual Studio provides the following deployment technologies for ASP.NET, depending on the kind of ASP.NET project that hosts the data service that you are deploying. - - - **Deployment Technologies for ASP.NET Web Applications** - - - [How to: Create a Web Deployment Package in Visual Studio](/previous-versions/aspnet/dd465323(v=vs.110)) - - - [How to: Deploy a Web Project Using One-Click Publish in Visual Studio](/previous-versions/aspnet/dd465337(v=vs.110)) - - - **Deployment Technologies for ASP.NET Web Sites** - - - [How to: Copy Web Site Files with the Copy Web Site Tool](/previous-versions/aspnet/c95809c0(v=vs.100)) - - - [How to: Publish Web Sites](/previous-versions/aspnet/20yh9f1b(v=vs.100)) - - - [Walkthrough: Deploying an ASP.NET Web Application Using XCOPY](/previous-versions/aspnet/f735abw9(v=vs.100)) - - For more information about the deployment options for an ASP.NET application, see [Web Deployment Overview for Visual Studio and ASP.NET](/previous-versions/aspnet/dd394698(v=vs.110)). - - > [!TIP] - > Before you attempt to deploy the data service to IIS, make sure that you have tested the deployment to a Web server that is running IIS. For more information, see [How to: Develop a WCF Data Service Running on IIS](how-to-develop-a-wcf-data-service-running-on-iis.md). - -- **Azure** - - You can deploy a data service to Azure by using [Azure Tools for Visual Studio](../../../azure/vs2015-install.md). For more information about deploying a data service to Azure, see [Deploying an OData Service in Azure](/archive/blogs/astoriateam/deploying-an-odata-service-in-windows-azure). - -### Deployment Considerations - -Consider the following when deploying a data service: - -- When you deploy a data service that uses the Entity Framework provider to access a SQL Server database, you might also have to propagate data structures, data, or both with your data service deployment. Visual Studio can automatically create scripts (.sql files) to do this in the destination database, and these scripts can be included in the Web deployment package of an ASP.NET application. For more information, see [How to: Deploy a Database With a Web Application Project](/previous-versions/dd465343(v=vs.100)). For an ASP.NET Web site, you can do this by using the **Database Publishing Wizard** in Visual Studio. For more information, see [Publishing a SQL Database](/previous-versions/aspnet/bb907585(v=vs.100)). - -- Because WCF Data Services includes a basic WCF implementation, you can use Windows Server AppFabric to monitor a data service deployed to IIS running on Windows Server. For more information about using Windows Server AppFabric to monitor a data service, see the post [Tracking WCF Data Services with Windows Server AppFabric](/archive/blogs/rjacobs/tracking-wcf-data-services-with-windows-server-appfabric). - -## See also - -- [Hosting the Data Service](hosting-the-data-service-wcf-data-services.md) -- [Securing WCF Data Services](securing-wcf-data-services.md) -- [Defining WCF Data Services](defining-wcf-data-services.md) diff --git a/docs/framework/data/wcf/entity-framework-provider-wcf-data-services.md b/docs/framework/data/wcf/entity-framework-provider-wcf-data-services.md deleted file mode 100644 index 366374f143f19..0000000000000 --- a/docs/framework/data/wcf/entity-framework-provider-wcf-data-services.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -description: "Learn more about: Entity Framework Provider (WCF Data Services)" -title: "Entity Framework Provider (WCF Data Services)" -ms.date: "03/30/2017" -helpviewer_keywords: - - "WCF Data Services, providers" -ms.assetid: 650b5eb6-c71d-4dc1-8b64-b6beaf752114 ---- -# Entity Framework Provider (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -Like WCF Data Services, the ADO.NET Entity Framework is based on the Entity Data Model, which is a type of entity-relationship model. The Entity Framework translates operations against its implementation of the Entity Data Model, which is called the *conceptual model*, into equivalent operations against a data source. This makes the Entity Framework an ideal provider for data services that are based on relational data, and any database that has a data provider that supports the Entity Framework can be used with WCF Data Services. For a list of the data sources that currently support the Entity Framework, see [Entity Framework Providers](/ef/ef6/fundamentals/providers/). - - In a conceptual model, the entity container is the root of the service. You must define a conceptual model in the Entity Framework before the data can be exposed by a data service. For more information, see [How to: Create a Data Service Using an ADO.NET Entity Framework Data Source](create-a-data-service-using-an-adonet-ef-data-wcf.md). - - WCF Data Services supports the optimistic concurrency model by enabling you to define a concurrency token for an entity. This concurrency token, which includes one or more properties of the entity, is used by the data service to determine whether a change has occurred in the data that is being requested, updated, or deleted. When token values obtained from the eTag in the request differ from the current values of the entity, an exception is raised by the data service. To indicate that a property is part of the concurrency token, you must apply the attribute `ConcurrencyMode="Fixed"` in the data model defined by the Entity Framework provider. The concurrency token cannot include a key property or a navigation property. For more information, see [Updating the Data Service](updating-the-data-service-wcf-data-services.md). - - To learn more about the Entity Framework, see [Entity Framework Overview](../adonet/ef/overview.md). - -## See also - -- [Data Services Providers](data-services-providers-wcf-data-services.md) -- [Reflection Provider](reflection-provider-wcf-data-services.md) -- [Entity Data Model](../adonet/entity-data-model.md) diff --git a/docs/framework/data/wcf/exposing-your-data-as-a-service-wcf-data-services.md b/docs/framework/data/wcf/exposing-your-data-as-a-service-wcf-data-services.md deleted file mode 100644 index 2658497a30752..0000000000000 --- a/docs/framework/data/wcf/exposing-your-data-as-a-service-wcf-data-services.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -description: "Learn more about: Expose Your Data as a Service (WCF Data Services)" -title: "Exposing Your Data as a Service (WCF Data Services)" -ms.date: "03/30/2017" -helpviewer_keywords: - - "WCF Data Services, configuring" - - "getting started, WCF Data Services" - - "WCF Data Services, getting started" -ms.assetid: df0bbcee-f66f-4a88-abb4-4e73c8b9c908 ---- -# Expose Your Data as a Service (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -WCF Data Services integrates with Visual Studio to enable you to more easily define services to expose your data as Open Data Protocol (OData) feeds. Creating a data service that exposes an OData feed involves the following basic steps: - -1. **Define the data model.** WCF Data Services natively supports data models that are based on the [ADO.NET Entity Framework](../adonet/ef/index.md). For more information, see [How to: Create a Data Service Using an ADO.NET Entity Framework Data Source](create-a-data-service-using-an-adonet-ef-data-wcf.md). - - WCF Data Services also supports data models that are based on common language runtime (CLR) objects that return an instance of the interface. This enables you to deploy data services that are based on lists, arrays, and collections in the .NET Framework. To enable create, update, and delete operations over these data structures, you must also implement the interface. For more information, see [How to: Create a Data Service Using the Reflection Provider](create-a-data-service-using-rp-wcf-data-services.md). - - For more advanced scenarios, WCF Data Services includes a set of providers that enable you to define a data model based on late-bound data types. For more information, see [Custom Data Service Providers](custom-data-service-providers-wcf-data-services.md). - -2. **Create the data service.** The most basic data service exposes a class that inherits from the class, with a type `T` that is the namespace-qualified name of the entity container. For more information, see [Defining WCF Data Services](defining-wcf-data-services.md). - -3. **Configure the data service.** By default, WCF Data Services disables access to resources that are exposed by an entity container. The interface enables you to configure access to resources and service operations, specify the supported version of OData, and to define other service-wide behaviors, such as batching behaviors or the maximum number of entities that can be returned in a single response. For more information, see [Configuring the Data Service](configuring-the-data-service-wcf-data-services.md). - -For an example of how to create a simple data service that is based on the Northwind sample database, see [Quickstart](quickstart-wcf-data-services.md). - -## See also - -- [Getting Started](getting-started-with-wcf-data-services.md) -- [Overview](wcf-data-services-overview.md) diff --git a/docs/framework/data/wcf/feed-customization-wcf-data-services.md b/docs/framework/data/wcf/feed-customization-wcf-data-services.md deleted file mode 100644 index b80ad290b4295..0000000000000 --- a/docs/framework/data/wcf/feed-customization-wcf-data-services.md +++ /dev/null @@ -1,103 +0,0 @@ ---- -description: "Learn more about: Feed Customization (WCF Data Services)" -title: "Feed Customization (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, feeds" - - "WCF Data Services, Atom protocol" - - "Atom Publishing Protocol [WCF Data Services]" - - "WCF Data Services, customizing feeds" -ms.assetid: 0d1a39bc-6462-4683-bd7d-e74e0fd28a85 ---- -# Feed Customization (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -WCF Data Services uses the Open Data Protocol (OData) to expose data as a feed. OData supports both Atom and JavaScript Object Notation (JSON) formats for data feeds. When you use an Atom feed, OData provides a standard method to serialize data, such as entities and relationships, into an XML format that can be included in the body of HTTP message. OData defines a default entity-property mapping between the data that is contained in entities and Atom elements. For more information, see [OData: Atom Format](https://www.odata.org/documentation/odata-version-2-0/atom-format/). - - You may have an application scenario that requires that the property data returned by the data service be serialized in a customized manner rather than in the standard feed format. With OData, you can customize the serialization in a data feed so that properties of an entity may be mapped to unused elements and attributes of an entry or to custom elements of an entry in the feed. - -> [!NOTE] -> Feed customization is only supported for Atom feeds. Custom feeds are not returned when the JSON format is requested for the returned feed. - - With WCF Data Services, you can define an alternate entity-property mapping for an Atom payload by manually applying attributes to entity types in the data model. The data source provider of the data service determines how you should apply these attributes. - -> [!IMPORTANT] -> When you define custom feeds, you must guarantee that all entity properties that have custom mappings defined are included in the projection. When a mapped entity property is not included in the projection, data loss might occur. For more information, see [Query Projections](query-projections-wcf-data-services.md). - -## Customizing Feeds with the Entity Framework Provider - - The data model used with the Entity Framework provider is represented as XML in the .edmx file. In this case, the attributes that define custom feeds are added to the `EntityType` and `Property` elements that represent entity types and properties in the data model. These feed customization attributes are not defined in [\[MC-CSDL\]: Conceptual Schema Definition File Format](/openspecs/windows_protocols/mc-csdl/c03ad8c3-e8b7-4306-af96-a9e52bb3df12), which is the format that the Entity Framework provider uses to define the data model. Therefore, you must declare feed customization attributes in a specific schema namespace, which is defined as `m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"`. The following XML fragment shows feed customization attributes applied to `Property` elements of the `Products` entity type that define the `ProductName`, `ReorderLevel`, and `UnitsInStock` properties. - - [!code-xml[Astoria Custom Feeds#EdmFeedAttributes](../../../../samples/snippets/xml/VS_Snippets_Misc/astoria_custom_feeds/xml/northwind.csdl#edmfeedattributes)] - - These attributes produce the following customized data feed for the `Products` entity set. In the customized data feed, the `ProductName` property value is displayed in both in the `author` element and as the `ProductName` property element, and the `UnitsInStock` property is displayed in a custom element that has its own unique namespace and with the `ReorderLevel` property as an attribute: - - [!code-xml[Astoria Custom Feeds#EdmFeedResultProduct](../../../../samples/snippets/xml/VS_Snippets_Misc/astoria_custom_feeds/xml/edmfeedresult.xml#edmfeedresultproduct)] - - For more information, see [How to: Customize Feeds with the Entity Framework Provider](how-to-customize-feeds-with-ef-provider-wcf-data-services.md). - -> [!NOTE] -> Because extensions to the data model are not supported by the Entity Designer, you must manually modify the XML file that contains the data model. For more information about the .edmx file that is generated by the Entity Data Model tools, see [.edmx File Overview (Entity Framework)](/previous-versions/dotnet/netframework-4.0/cc982042(v=vs.100)). - -### Custom Feed Attributes - - The following table shows the XML attributes that customize feeds that you can add to the conceptual schema definition language (CSDL) that defines the data model. These attributes are equivalent to the properties of the used with the reflection provider. - -|Attribute name|Description| -|--------------------|-----------------| -|`FC_ContentKind`|Indicates the type of the content. The following keywords define syndication content types.

`text:` The property value is displayed in the feed as text.

`html:` The property value is displayed in the feed as HTML.

`xhtml:` The property value is displayed in the feed as XML-formatted HTML.

These keywords are equivalent to the values of the enumeration used with the reflection provider.

This attribute is not supported when the `FC_NsPrefix` and `FC_NsUri` attributes are used.

When you specify a value of `xhtml` for the `FC_ContentKind` attribute, you must ensure that the property value contains properly formatted XML. The data service returns the value without performing any transformations. You must also ensure that any XML element prefixes in the returned XML have a namespace URI and prefix defined in the mapped feed.| -|`FC_KeepInContent`|Indicates that the referenced property value should be included both in the content section of the feed and in the mapped location. Valid values are `true` and `false`. To make the resulting feed backward-compatible with earlier versions of WCF Data Services, specify a value of `true` to make sure that the value is included in the content section of the feed.| -|`FC_NsPrefix`|The namespace prefix of the XML element in a non-syndication mapping. This attribute must be used with the `FC_NsUri` attribute and cannot be used with the `FC_ContentKind` attribute.| -|`FC_NsUri`|The namespace URI of the XML element in a non-syndication mapping. This attribute must be used with the `FC_NsPrefix` attribute and cannot be used with the `FC_ContentKind` attribute.| -|`FC_SourcePath`|The path of the property of the entity to which this feed mapping rule applies. This attribute is only supported when it is used in an `EntityType` element.

The property cannot directly reference a complex type. For complex types, you must use a path expression where property names are separated by a backslash (`/`) character. For example, the following values are allowed for an entity type `Person` with an integer property `Age` and a complex property

`Address`:

`Age`

`Address/Street`

The property cannot be set to a value that contains a space or any other character that is not valid in a property name.| -|`FC_TargetPath`|The name of the target element of the resulting feed to map the property. This element can be an element defined by the Atom specification or a custom element.

The following keywords are predefined syndication target-path values that point to specific location in an OData feed.

`SyndicationAuthorEmail:` The `atom:email` child element of the `atom:author` element.

`SyndicationAuthorName:` The `atom:name` child element of the `atom:author` element.

`SyndicationAuthorUri:` The `atom:uri` child element of the `atom:author` element.

`SyndicationContributorEmail:` The `atom:email` child element of the `atom:contributor` element.

`SyndicationContributorName:` The `atom:name` child element of the `atom:contributor` element.

`SyndicationContributorUri:` The `atom:uri` child element of the `atom:contributor` element.

`SyndicationCustomProperty:` A custom property element. When mapping to a custom element, the target must be a path expression in which nested elements are separated by a backslash (`/`) and attributes are specified by an ampersand (`@`). In the following example, the string `UnitsInStock/@ReorderLevel` maps a property value to an attribute named `ReorderLevel` on a child element named `UnitsInStock` of the root entry element.

``

When the target is a custom element name, the `FC_NsPrefix` and `FC_NsUri` attributes must also be specified.

`SyndicationPublished:` The `atom:published` element.

`SyndicationRights:` The `atom:rights` element.

`SyndicationSummary:` The `atom:summary` element.

`SyndicationTitle:` The `atom:title` element.

`SyndicationUpdated:` The `atom:updated` element.

These keywords are equivalent to the values of the enumeration used with the reflection provider.| - -> [!NOTE] -> Attribute names and values are case-sensitive. Attributes can be applied either to the `EntityType` element or to one or more `Property` elements, but not to both. - -## Customizing Feeds with the Reflection Provider - - To customize feeds for a data model that was implemented by using the reflection provider, add one or more instances of the attribute to the classes that represent entity types in the data model. The properties of the class correspond to the feed customization attributes that are described in the previous section. The following is an example of the declaration of the `Order` type, with custom feed mapping defined for both properties. - -> [!NOTE] -> The data model for this example is defined in the topic [How to: Create a Data Service Using the Reflection Provider](create-a-data-service-using-rp-wcf-data-services.md). - - [!code-csharp[Astoria Custom Feeds#CustomOrderFeed](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_custom_feeds/cs/orderitems.svc.cs#customorderfeed)] - [!code-vb[Astoria Custom Feeds#CustomOrderFeed](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_custom_feeds/vb/orderitems.svc.vb#customorderfeed)] - - These attributes produce the following customized data feed for the `Orders` entity set. In this customized feed, the `OrderId` property value displays only in the `title` element of the `entry` and the `Customer` property value displays both in the `author` element and as the `Customer` property element: - - [!code-xml[Astoria Custom Feeds#IQueryableFeedResult](../../../../samples/snippets/xml/VS_Snippets_Misc/astoria_custom_feeds/xml/iqueryablefeedresult.xml#iqueryablefeedresult)] - - For more information, see [How to: Customize Feeds with the Reflection Provider](how-to-customize-feeds-with-the-reflection-provider-wcf-data-services.md). - -## Customizing Feeds with a Custom Data Service Provider - - Feed customization for a data model defined by using a custom data service provider is defined for a resource type by calling the on the that represents an entity type in the data model. For more information, see [Custom Data Service Providers](custom-data-service-providers-wcf-data-services.md). - -## Consuming Custom Feeds - - When your application directly consumes an OData feed, it must be able to process any customized elements and attributes in the returned feed. When you have implemented custom feeds in your data model, regardless of the data service provider, the `$metadata` endpoint returns custom feed information as custom feed attributes in the CSDL returned by the data service. When you use the **Add Service Reference** dialog or the [datasvcutil.exe](wcf-data-service-client-utility-datasvcutil-exe.md) tool to generate client data service classes, the customized feed attributes are used to guarantee that requests and responses to the data service are handled correctly. - -## Feed Customization Considerations - - You should consider the following when defining custom feed mappings. - -- The WCF Data Services client treats mapped elements in a feed as empty when they contain only white space. Because of this, mapped elements that contain only white space are not materialized on the client with the same white space. To preserve this white space on the client, you must set the value of `KeepInContext` to `true` in the feed mapping attribute. - -## Versioning Requirements - - Feed customization has the following OData protocol versioning requirements: - -- Feed customization requires that both the client and data service support version 2.0 of the OData protocol and later versions. - - For more information, see [Data Service Versioning](data-service-versioning-wcf-data-services.md). - -## See also - -- [Reflection Provider](reflection-provider-wcf-data-services.md) -- [Entity Framework Provider](entity-framework-provider-wcf-data-services.md) diff --git a/docs/framework/data/wcf/generating-the-data-service-client-library-wcf-data-services.md b/docs/framework/data/wcf/generating-the-data-service-client-library-wcf-data-services.md deleted file mode 100644 index 79d7e28b0c695..0000000000000 --- a/docs/framework/data/wcf/generating-the-data-service-client-library-wcf-data-services.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -description: "Learn more about: Generating the Data Service Client Library (WCF Data Services)" -title: "Generating the Data Service Client Library (WCF Data Services)" -ms.date: "03/30/2017" -helpviewer_keywords: - - "client applications, WCF Data Services" - - "WCF Data Services, client library" - - "Add Service Reference dialog box" -ms.assetid: 314077c1-ac10-47e1-bed4-940b5462359d ---- -# Generating the Data Service Client Library (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -A data service that implements the Open Data Protocol (OData) can return a service metadata document that describes the data model exposed by the OData feed. For more information, see the Service Metadata Document section in the [OData: Overview](https://www.odata.org/documentation/odata-version-2-0/overview/) article. You can use the **Add Service Reference** dialog in Visual Studio to add a reference to an OData-based service. When you use this tool to add a reference to the metadata returned by an OData feed in a client project, it performs the following actions: - -- Requests the service metadata document from the data service and interprets the returned metadata. - - > [!NOTE] - > The returned metadata is stored in the client project as an .edmx file. This .edmx file cannot be opened by using the Entity Data Model designer because it does not have the same format an .edmx file used by the Entity Framework. You can view this metadata file by using the XML editor or any text editor. For more information, see [\[MC-EDMX\]: Entity Data Model for Data Services Packaging Format](/openspecs/windows_protocols/mc-edmx/5dff5e25-56a1-408b-9d44-bff6634c7d16). - -- Generates a representation of the service as an entity container class that inherits from . This generated entity container class resembles the entity container that the Entity Data Model tools generate. For more information, see [Object Services Overview (Entity Framework)](/previous-versions/bb386871(v=vs.100)). - -- Generates data classes for the data model types that it discovers in the service metadata. - -- Adds a reference to the `System.Data.Services.Client` assembly to the project. - - For more information, see [How to: Add a Data Service Reference](how-to-add-a-data-service-reference-wcf-data-services.md). - - The client data service classes can also be generated by using the [DataSvcUtil.exe](wcf-data-service-client-utility-datasvcutil-exe.md) tool at the command prompt. For more information, see [How to: Manually Generate Client Data Service Classes](how-to-manually-generate-client-data-service-classes-wcf-data-services.md). - -## Client Data Type Mapping - - When you use the **Add Service Reference** dialog in Visual Studio or the `DataSvcUtil.exe` tool to generate client data classes that are based on an OData feed, the .NET Framework data types are mapped to the primitive types from the data model as follows: - -|Data model type|.NET Framework data type| -|---------------------|------------------------------| -|`Edm.Binary`| `[]`| -|`Edm.Boolean`|| -|`Edm.Byte`|| -|`Edm.DateTime`|| -|`Edm.Decimal`|| -|`Edm.Double`|| -|`Edm.Guid`|| -|`Edm.Int16`|| -|`Edm.Int32`|| -|`Edm.Int64`|| -|`Edm.SByte`|| -|`Edm.Single`|| -|`Edm.String`|| - - For more information, see the Primitive Data Types section in the [OData: Overview](https://www.odata.org/documentation/odata-version-2-0/overview/) article. - -## See also - -- [WCF Data Services Client Library](wcf-data-services-client-library.md) -- [Quickstart](quickstart-wcf-data-services.md) diff --git a/docs/framework/data/wcf/getting-started-with-wcf-data-services.md b/docs/framework/data/wcf/getting-started-with-wcf-data-services.md deleted file mode 100644 index 71dd6a658c9f7..0000000000000 --- a/docs/framework/data/wcf/getting-started-with-wcf-data-services.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -description: "Learn more about: Getting Started with WCF Data Services" -title: "Getting Started with WCF Data Services" -ms.date: "03/30/2017" -helpviewer_keywords: - - "WCF Data Services, getting started" -ms.assetid: c832fa5b-cf86-4690-be5a-a226c0e49530 ---- -# Getting Started with WCF Data Services - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -The topics in this section help you quickly understand Open Data Protocol (OData) and how to use WCF Data Services to expose and consume OData feeds by explaining the underlying technologies. This section includes both conceptual content and a [quickstart](quickstart-wcf-data-services.md) tutorial. - -## In This Section - - The following topics describe how to create data services by using WCF Data Services. - - [Exposing Your Data as a Service](exposing-your-data-as-a-service-wcf-data-services.md) - Describes the steps that are required to create a data service by using WCF Data Services. - - [Accessing Data Service Resources](accessing-data-service-resources-wcf-data-services.md) - Describes how to work with OData feeds. - - [Using a Data Service in a Client Application](using-a-data-service-in-a-client-application-wcf-data-services.md) - Describes how to work with an OData feed in a .NET Framework client application. - - [Quickstart](quickstart-wcf-data-services.md) - Shows how to create and access a simple OData-based service that exposes a feed based on the Northwind sample database. - - [Application Scenarios](application-scenarios-wcf-data-services.md) - Highlights a core set of OData scenarios that are supported by WCF Data Services. - - [Resources](wcf-data-services-resources.md) - Provides links to WCF Data Services and OData resources. - -## Related Sections - - [WCF Data Services (Silverlight)](/previous-versions/windows/silverlight/dotnet-windows-silverlight/cc838234(v=vs.95)) - - [Getting Started](../adonet/ef/getting-started.md) diff --git a/docs/framework/data/wcf/hosting-the-data-service-wcf-data-services.md b/docs/framework/data/wcf/hosting-the-data-service-wcf-data-services.md deleted file mode 100644 index b955437f0a571..0000000000000 --- a/docs/framework/data/wcf/hosting-the-data-service-wcf-data-services.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -description: "Learn more about: Hosting the Data Service (WCF Data Services)" -title: "Hosting the Data Service (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, configuring" - - "WCF Data Services, Windows Communication Foundation" -ms.assetid: b48f42ce-22ce-4f8d-8f0d-f7ddac9125ee ---- -# Hosting the Data Service (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -By using WCF Data Services, you can create a service that exposes data as an Open Data Protocol (OData) feed. This data service is defined as a class that inherits from . This class provides the functionality required to process request messages, perform updates against the data source, and generate responses messages, as required by OData. However, a data service cannot bind to and listen on a network socket for incoming HTTP requests. For this required functionality, the data service relies on a hosting component. - - The data service host performs the following tasks on behalf of the data service: - -- Listens for requests and routes these requests to the data service. - -- Creates an instance of the data service for each request. - -- Requests that the data service process the incoming request. - -- Sends the response on behalf of the data service. - - To simplify hosting a data service, WCF Data Services is designed to integrate with Windows Communication Foundation (WCF). The data service provides a default WCF implementation that serves as the data service host in an ASP.NET application. Therefore, you can host a data service in one of the following ways: - -- In an ASP.NET application. - -- In a managed application that supports self-hosted WCF services. - -- In some other custom data service host. - -## Hosting a Data Service in an ASP.NET Application - -When you use the **Add New Item** dialog in Visual Studio 2015 to define a data service in an ASP.NET application, the tool generates two new files in the project. The first file has a `.svc` extension and instructs the WCF runtime how to instantiate the data service. The following is an example of this file for the Northwind sample data service created when you complete the [quickstart](quickstart-wcf-data-services.md): - -```aspx-csharp -<%@ ServiceHost Language="C#" - Factory="System.Data.Services.DataServiceHostFactory, - System.Data.Services, Version=4.0.0.0, - Culture=neutral, PublicKeyToken=b77a5c561934e089" - Service="NorthwindService.Northwind" %> -``` - - This directive tells the application to create the service host for the named data service class by using the class. - - The code-behind page for the `.svc` file contains the class that is the implementation of the data service itself, which is defined as follows for the Northwind sample data service: - - [!code-csharp[Astoria Quickstart Service#ServiceDefinition](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_quickstart_service/cs/northwind.svc.cs#servicedefinition)] - [!code-vb[Astoria Quickstart Service#ServiceDefinition](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_quickstart_service/vb/northwind.svc.vb#servicedefinition)] - - Because a data service behaves like a WCF service, the data service integrates with ASP.NET and follows the WCF Web programming model. For more information, see [WCF Services and ASP.NET](../../wcf/feature-details/wcf-services-and-aspnet.md) and [WCF Web HTTP Programming Model](../../wcf/feature-details/wcf-web-http-programming-model.md). - -## Self-Hosted WCF Services - - Because it incorporates a WCF implementation, WCF Data Services support self-hosting a data service as a WCF service. A service can be self-hosted in any .NET Framework application, such as a console application. The class, which inherits from , is used to instantiate the data service at a specific address. - - Self-hosting can be used for development and testing because it can make it easier to deploy and troubleshoot the service. However, this kind of hosting does not provide the advanced hosting and management features provided by ASP.NET or by Internet Information Services (IIS). For more information, see [Hosting in a Managed Application](../../wcf/feature-details/hosting-in-a-managed-application.md). - -## Defining a Custom Data Service Host - - For cases where the WCF host implementation is too restrictive, you can also define a custom host for a data service. Any class that implements interface can be used as the network host for a data service. A custom host must implement the interface and be able to handle the following basic responsibilities of the data service host: - -- Provide the data service with the service root path. - -- Process request and response headers information to the appropriate member implementation. - -- Handle exceptions raised by the data service. - -- Validate parameters in the query string. - -## See also - -- [Defining WCF Data Services](defining-wcf-data-services.md) -- [Exposing Your Data as a Service](exposing-your-data-as-a-service-wcf-data-services.md) -- [Configuring the Data Service](configuring-the-data-service-wcf-data-services.md) diff --git a/docs/framework/data/wcf/how-to-add-a-data-service-reference-wcf-data-services.md b/docs/framework/data/wcf/how-to-add-a-data-service-reference-wcf-data-services.md deleted file mode 100644 index 4067db084961f..0000000000000 --- a/docs/framework/data/wcf/how-to-add-a-data-service-reference-wcf-data-services.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -description: "Learn more about: How to: Add a data service reference (WCF Data Services)" -title: "How to: Add a Data Service Reference (WCF Data Services)" -ms.date: 08/24/2018 -helpviewer_keywords: - - "WCF Data Services, configuring" -ms.assetid: 62c6f318-3ee1-433a-b7a3-efa234c3034c ---- -# How to: Add a data service reference (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -You can use the **Add Service Reference** dialog in Visual Studio to add a reference to WCF Data Services. This enables you to more easily access a data service in a client application that you develop in Visual Studio. When you complete this procedure, data classes are generated based on metadata that is obtained from the data service. For more information, see [Generating the Data Service Client Library](generating-the-data-service-client-library-wcf-data-services.md). - -## Add a data service reference - -1. (Optional) If the data service is not part of the solution and is not already running, start the data service and note the URI of the data service. - -2. In Visual Studio, in **Solution Explorer**, right-click the client project and then select **Add** > **Service Reference**. - -3. If the data service is part of the current solution, click **Discover**. - - -or- - - In the **Address** text box, type the base URL of the data service, such as `http://localhost:1234/Northwind.svc`, and then click **Go**. - -4. Select **OK**. - - A new code file that contains the data classes that can access and interact with data service resources is added to the project. - -## See also - -- [Quickstart](quickstart-wcf-data-services.md) diff --git a/docs/framework/data/wcf/how-to-add-modify-and-delete-entities-wcf-data-services.md b/docs/framework/data/wcf/how-to-add-modify-and-delete-entities-wcf-data-services.md deleted file mode 100644 index 4b00cd3670eb9..0000000000000 --- a/docs/framework/data/wcf/how-to-add-modify-and-delete-entities-wcf-data-services.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -description: "Learn more about: How to: Add, Modify, and Delete Entities (WCF Data Services)" -title: "How to: Add, Modify, and Delete Entities (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, changing data" -ms.assetid: a00f8933-b232-4445-95ba-adc634f055d8 ---- -# How to: Add, Modify, and Delete Entities (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -With the WCF Data Services client libraries, you can create, update, and delete entity data in a data service by performing equivalent actions on objects in the . For more information, see [Updating the Data Service](updating-the-data-service-wcf-data-services.md). - - The example in this topic uses the Northwind sample data service and autogenerated client data service classes. This service and the client data classes are created when you complete the [WCF Data Services quickstart](quickstart-wcf-data-services.md). - -## Example - - The following example creates a new object instance and then calls the method on the to create the item in the context. An HTTP POST message is sent to the data service when the method is called. - - [!code-csharp[Astoria Northwind Client#AddProduct](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#addproduct)] - [!code-vb[Astoria Northwind Client#AddProduct](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#addproduct)] - -## Example - - The following example retrieves and modifies an existing object and then calls the method on the to mark the item in the context as updated. An HTTP MERGE message is sent to the data service when the method is called. - - [!code-csharp[Astoria Northwind Client#ModifyCustomer](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#modifycustomer)] - [!code-vb[Astoria Northwind Client#ModifyCustomer](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#modifycustomer)] - -## Example - - The following example calls the method on the to mark the item in the context as deleted. An HTTP DELETE message is sent to the data service when the method is called. - - [!code-csharp[Astoria Northwind Client#DeleteProduct](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#deleteproduct)] - [!code-vb[Astoria Northwind Client#DeleteProduct](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#deleteproduct)] - -## Example - - The following example creates a new object instance and then calls the method on the to create the item in the context along with the link to the related order. An HTTP POST message is sent to the data service when the method is called. - - [!code-csharp[Astoria Northwind Client#AddOrderDetailToOrderAuto](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#addorderdetailtoorderauto)] - [!code-vb[Astoria Northwind Client#AddOrderDetailToOrderAuto](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#addorderdetailtoorderauto)] - -## See also - -- [WCF Data Services Client Library](wcf-data-services-client-library.md) -- [How to: Attach an Existing Entity to the DataServiceContext](attach-an-existing-entity-to-dc-wcf-data.md) -- [How to: Define Entity Relationships](how-to-define-entity-relationships-wcf-data-services.md) -- [Batching Operations](batching-operations-wcf-data-services.md) diff --git a/docs/framework/data/wcf/how-to-add-query-options-to-a-data-service-query-wcf-data-services.md b/docs/framework/data/wcf/how-to-add-query-options-to-a-data-service-query-wcf-data-services.md deleted file mode 100644 index c622f1bd06bfd..0000000000000 --- a/docs/framework/data/wcf/how-to-add-query-options-to-a-data-service-query-wcf-data-services.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -description: "Learn more about: How to: Add Query Options to a Data Service Query (WCF Data Services)" -title: "How to: Add Query Options to a Data Service Query (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "querying the data service [WCF Data Services]" - - "WCF Data Services, querying" - - "WCF Data Services, accessing data" -ms.assetid: e4258526-557e-4e96-91e1-2175400c7c8f ---- -# How to: Add Query Options to a Data Service Query (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -WCF Data Services enables you to query a data service from a .NET Framework-based client application by using the generated client data service classes. The easiest to do this is to compose a Language Integrated Query (LINQ) query expression that includes the desired query options. You can also call a series of LINQ query methods to compose an equivalent query. Finally, you can use the method to add query options to a query. In each of these cases, the URI that is generated by the client includes the requested entity set with the selected query options applied. For more information, see [Querying the Data Service](querying-the-data-service-wcf-data-services.md). - - The example in this topic uses the Northwind sample data service and autogenerated client data service classes. This service and the client data classes are created when you complete the [WCF Data Services quickstart](quickstart-wcf-data-services.md). - -## Example - - The following example shows how to compose a LINQ query expression that returns only orders with a freight cost of more than $30 and that orders the results by the ship date in descending order. - - [!code-csharp[Astoria Northwind Client#AddQueryOptionsLinq](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#addqueryoptionslinq)] - [!code-vb[Astoria Northwind Client#AddQueryOptionsLinq](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#addqueryoptionslinq)] - -## Example - - The following example shows how to compose a LINQ query by using LINQ query methods that is equivalent to the previous query. - - [!code-csharp[Astoria Northwind Client#AddQueryOptionsLinqExpression](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#addqueryoptionslinqexpression)] - [!code-vb[Astoria Northwind Client#AddQueryOptionsLinqExpression](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#addqueryoptionslinqexpression)] - -## Example - - The following example shows how to use to the method to create a that is equivalent to the previous examples. - - [!code-csharp[Astoria Northwind Client#AddQueryOptions](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#addqueryoptions)] - [!code-vb[Astoria Northwind Client#AddQueryOptions](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#addqueryoptions)] - -## Example - - The following example shows how to use the `$orderby` query option to both filter and order returned Orders objects by the Freight property. - - [!code-csharp[Astoria Northwind Client#OrderWithFilter](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#orderwithfilter)] - [!code-vb[Astoria Northwind Client#OrderWithFilter](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#orderwithfilter)] - -## See also - -- [Querying the Data Service](querying-the-data-service-wcf-data-services.md) -- [How to: Project Query Results](how-to-project-query-results-wcf-data-services.md) diff --git a/docs/framework/data/wcf/how-to-bind-data-using-a-project-data-source-wcf-data-services.md b/docs/framework/data/wcf/how-to-bind-data-using-a-project-data-source-wcf-data-services.md deleted file mode 100644 index 831e790e8bdf6..0000000000000 --- a/docs/framework/data/wcf/how-to-bind-data-using-a-project-data-source-wcf-data-services.md +++ /dev/null @@ -1,120 +0,0 @@ ---- -description: "Learn more about: How to: Bind Data Using a Project Data Source (WCF Data Services)" -title: "How to: Bind Data Using a Project Data Source (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "data binding, WCF Data Services" - - "WCF Data Services, data binding" -ms.assetid: 2477af0a-676f-44f7-b73d-e66208785509 ---- -# How to: Bind Data Using a Project Data Source (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -You can create data sources that are based on the generated data objects in an WCF Data Services client application. When you add a reference to a data service by using the **Add Service Reference** dialog, a project data source is created along with the generated client data classes. One data source is created for each entity set that the data service exposes. You can create forms that display data from the service by dragging these data source items from the **Data Sources** window onto the designer. These items become controls that are bound to the data source. During execution, this data source is bound to an instance of the class, which is filled with objects that are returned by a query to the data service. For more information, see [Binding Data to Controls](binding-data-to-controls-wcf-data-services.md). - - The examples in this topic use the Northwind sample data service and autogenerated client data service classes. This service and the client data classes are created when you complete the [WCF Data Services quickstart](quickstart-wcf-data-services.md). - -## Use a project data source in a WPF window - -1. In Visual Studio, in a WPF project, add a reference to the Northwind data service. For more information, see [How to: Add a Data Service Reference](how-to-add-a-data-service-reference-wcf-data-services.md). - -2. In the **Data Sources** window, expand the `Customers` node in the **NorthwindEntities** project data source. - -3. Click the **CustomerID** item, select **ComboBox** from the list, and drag the **CustomerID** item from the **Customers** node to the designer. - - This creates the following object elements in the XAML file for the window: - - - A element named `customersViewSource`. The property of the top-level object element is set to this new . - - - A data-bound named `CustomerID`. - - - A . - -4. Drag the **Orders** navigation property to the designer. - - This creates the following additional object elements in the XAML file for the window: - - - A second element named `customersOrdersViewSource`, the source of which is the `customerViewSource`. - - - A data-bound control named `ordersDataGrid`. - -5. (Optional) Drag additional items from the **Customers** node to the designer. - -6. Open the code page for the form and add the following `using` statements (`Imports` in Visual Basic): - - [!code-csharp[Astoria Northwind Client#CustomersOrdersUsingWpf](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/customerorderswpf2.xaml.cs#customersordersusingwpf)] - -7. In the partial class that defines the form, add the following code that creates an instance and defines the `customerID` constant. - - [!code-csharp[Astoria Northwind Client#CustomersOrdersDefinitionWpf](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/customerorderswpf2.xaml.cs#customersordersdefinitionwpf)] - [!code-vb[Astoria Northwind Client#CustomersOrdersDefinitionWpf](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/customerorderswpf2.xaml.vb#customersordersdefinitionwpf)] - -8. In the designer, select the window. - - > [!NOTE] - > Make sure that you select the window itself, rather than selecting content that is within the window. If the window is selected, the **Name** text box near the top of the **Properties** window should contain the name of the window. - -9. In the **Properties** window, select the **Events** button. - -10. Find the **Loaded** event, and then double-click the drop-down list next to this event. - - Visual Studio opens the code-behind file for the window and generates a event handler. - -11. In the newly created event handler, copy and paste the following code. - - [!code-csharp[Astoria Northwind Client#CustomersOrdersDataBindingWpf](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/customerorderswpf2.xaml.cs#customersordersdatabindingwpf)] - [!code-vb[Astoria Northwind Client#CustomersOrdersDataBindingWpf](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/customerorderswpf2.xaml.vb#customersordersdatabindingwpf)] - -12. This code creates an instance of for the `Customers` type based on the execution of a LINQ query that returns an of `Customers` along with related `Orders` objects from the Northwind data service and binds it to the `customersViewSource`. - -## Use a project data source in a Windows form - -1. In the **Data Sources** window, expand the **Customers** node in the **NorthwindEntities** project data source. - -2. Click the **CustomerID** item, select **ComboBox** from the list, and drag the **CustomerID** item from the **Customers** node to the designer. - - This creates the following controls on the form: - - - An instance of named `customersBindingSource`. - - - An instance of named `customersBindingNavigator`. You can delete this control as it will not be needed. - - - A data-bound named `CustomerID`. - - - A . - -3. Drag the **Orders** navigation property to the form. - -4. This creates the `ordersBindingSource` control with the property of the control set to the `customersBindingSource` and the property set to `Customers`. It also creates the `ordersDataGridView` data-bound control on the form, accompanied by an appropriately titled label control. - -5. (Optional) Drag additional items from the **Customers** node to the designer. - -6. Open the code page for the form and add the following `using` statements (`Imports` in Visual Basic): - - [!code-csharp[Astoria Northwind Client#CustomersOrdersUsing](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/customerorders.cs#customersordersusing)] - [!code-vb[Astoria Northwind Client#CustomersOrdersUsing](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/customerorders.vb#customersordersusing)] - -7. In the partial class that defines the form, add the following code that creates an instance and defines the `customerID` constant. - - [!code-csharp[Astoria Northwind Client#CustomersOrdersDefinition](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/customerorders.cs#customersordersdefinition)] - [!code-vb[Astoria Northwind Client#CustomersOrdersDefinition](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/customerorders.vb#customersordersdefinition)] - -8. In the form designer, double-click the form. - - This opens the code page for the form and creates the method that handles the `Load` event for the form. - -9. In the `Load` event handler, copy and paste the following code. - - [!code-csharp[Astoria Northwind Client#CustomersOrdersDataBinding](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/customerorders.cs#customersordersdatabinding)] - [!code-vb[Astoria Northwind Client#CustomersOrdersDataBinding](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/customerorders.vb#customersordersdatabinding)] - -10. This code creates an instance of for the `Customers` type based on the execution of a that returns an of `Customers` from the Northwind data service and binds it to the `customersBindingSource`. - -## See also - -- [WCF Data Services Client Library](wcf-data-services-client-library.md) -- [How to: Bind Data to Windows Presentation Foundation Elements](bind-data-to-wpf-elements-wcf-data-services.md) diff --git a/docs/framework/data/wcf/how-to-customize-data-binding-behaviors-wcf-data-services.md b/docs/framework/data/wcf/how-to-customize-data-binding-behaviors-wcf-data-services.md deleted file mode 100644 index 2ba1a3612848f..0000000000000 --- a/docs/framework/data/wcf/how-to-customize-data-binding-behaviors-wcf-data-services.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -description: "Learn more about: How to: Customize Data Binding Behaviors (WCF Data Services)" -title: "How to: Customize Data Binding Behaviors (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, customizing" - - "WCF Data Services, data binding" -ms.assetid: 40476b89-8941-4771-8d21-2fe430c85a9d ---- -# How to: Customize Data Binding Behaviors (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -With WCF Data Services, you can supply custom logic that is called by the when an object is added or removed from the binding collection or when a property change is detected. This custom logic is provided as methods, referenced as delegates, that return a value of `false` when the default behavior should still be performed when the custom method completes and `true` when subsequent processing of the event should be stopped. - - The examples in this topic supply custom methods for both the `entityChanged` and `entityCollectionChanged` parameters of . The examples in this topic use the Northwind sample data service and autogenerated client data service classes. This service and the client data classes are created when you complete the [WCF Data Services quickstart](quickstart-wcf-data-services.md). - -## Example - - The following code-behind page for the XAML file creates a with custom methods that are called when changes occur to data that is bound to the binding collection. When the event occurs, the supplied method prevents an item that has been removed from the binding collection from being deleted from the data service. When the event occurs, the `ShipDate` value is validated to ensure that changes are not made to orders that have already shipped. - - [!code-csharp[Astoria Northwind Client#WpfDataBindingCustom](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/customerorderscustom.xaml.cs#wpfdatabindingcustom)] - [!code-vb[Astoria Northwind Client#WpfDataBindingCustom](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/customerorderscustom.xaml.vb#wpfdatabindingcustom)] - [!code-vb[Astoria Northwind Client#WpfDataBindingCustom](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/customerorderscustom2.xaml.vb#wpfdatabindingcustom)] - -## Example - - The following XAML defines the window for the previous example. - - [!code-xaml[Astoria Northwind Client#WpfDataBindingCustomXaml](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/customerorderscustom.xaml#wpfdatabindingcustomxaml)] - -## See also - -- [WCF Data Services Client Library](wcf-data-services-client-library.md) diff --git a/docs/framework/data/wcf/how-to-customize-feeds-with-ef-provider-wcf-data-services.md b/docs/framework/data/wcf/how-to-customize-feeds-with-ef-provider-wcf-data-services.md deleted file mode 100644 index e2d95ed461bba..0000000000000 --- a/docs/framework/data/wcf/how-to-customize-feeds-with-ef-provider-wcf-data-services.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -description: "Learn more about: How to: Customize Feeds with the Entity Framework Provider (WCF Data Services)" -title: "How to: Customize Feeds with the Entity Framework Provider (WCF Data Services)" -ms.date: "03/30/2017" -helpviewer_keywords: - - "WCF Data Services, customizing" - - "WCF Data Services, customizing feeds" -ms.assetid: fd16272e-36f2-415e-850e-8a81f2b17525 ---- -# How to: Customize Feeds with the Entity Framework Provider (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -WCF Data Services enables you to customize the Atom serialization in a data service response so that properties of an entity may be mapped to unused elements that are defined in the AtomPub protocol. This topic shows how to define mapping attributes for the entity types in a data model that is defined in an .edmx file by using the Entity Framework provider. For more information, see [Feed Customization](feed-customization-wcf-data-services.md). - - In this topic you will manually modify the tool-generated .edmx file that contains the data model. You must manually modify the file because extensions to the data model are not supported by the Entity Designer. For more information about the .edmx file that the Entity Data Model tools generate, see [.edmx File Overview (Entity Framework)](/previous-versions/dotnet/netframework-4.0/cc982042(v=vs.100)). The example in this topic uses the Northwind sample data service and autogenerated client data service classes. This service and the client data classes are created when you complete the [WCF Data Services quickstart](quickstart-wcf-data-services.md). - -### To manually modify the Northwind.edmx file to add feed customization attributes - -1. In **Solution Explorer**, right-click the `Northwind.edmx` file, and then click **Open with**. - -2. In the **Open With - Northwind.edmx** dialog box, select **XML Editor**, and then click **OK**. - -3. Locate the `ConceptualModels` element and replace the existing `Customers` entity type with the following element that contains feed customization mapping attributes: - - [!code-xml[Astoria Custom Feeds#EdmFeedCustomers](../../../../samples/snippets/xml/VS_Snippets_Misc/astoria_custom_feeds/xml/northwind.csdl#edmfeedcustomers)] - -4. Save changes and close the Northwind.edmx file. - -5. (Optional) Right-click the Northwind.edmx file and then click **Run Custom Tool**. - - This regenerates the object layer file, which may be required. - -6. Recompile the project. - -## Example - - The previous example returns the following result for the URI `http://myservice/Northwind.svc/Customers('ALFKI')`. - - [!code-xml[Astoria Custom Feeds#EdmFeedResult](../../../../samples/snippets/xml/VS_Snippets_Misc/astoria_custom_feeds/xml/edmfeedresult.xml#edmfeedresult)] - -## See also - -- [Entity Framework Provider](entity-framework-provider-wcf-data-services.md) diff --git a/docs/framework/data/wcf/how-to-customize-feeds-with-the-reflection-provider-wcf-data-services.md b/docs/framework/data/wcf/how-to-customize-feeds-with-the-reflection-provider-wcf-data-services.md deleted file mode 100644 index 0462abe041842..0000000000000 --- a/docs/framework/data/wcf/how-to-customize-feeds-with-the-reflection-provider-wcf-data-services.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -description: "Learn more about: How to: Customize Feeds with the Reflection Provider (WCF Data Services)" -title: "How to: Customize Feeds with the Reflection Provider (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, customizing" - - "WCF Data Services, customizing feeds" -ms.assetid: 00c23dcf-9bb8-459a-a012-6c4d9bcad7e9 ---- -# How to: Customize Feeds with the Reflection Provider (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -WCF Data Services enables you to customize the Atom serialization in a data service response so that properties of an entity may be mapped to unused elements that are defined in the AtomPub protocol. This topic shows how to define mapping attributes for the entity types in a data model that is defined by using the reflection provider. For more information, see [Feed Customization](feed-customization-wcf-data-services.md). - - The data model for this example is defined in the topic [How to: Create a Data Service Using the Reflection Provider](create-a-data-service-using-rp-wcf-data-services.md) - -## Example - - In the following example, both properties of the `Order` type are mapped to existing Atom elements. The `Product` property of the `Item` type is mapped to a custom feed attribute in a separate namespace. - - [!code-csharp[Astoria Custom Feeds#CustomIQueryableFeeds](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_custom_feeds/cs/orderitems.svc.cs#customiqueryablefeeds)] - [!code-vb[Astoria Custom Feeds#CustomIQueryableFeeds](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_custom_feeds/vb/orderitems.svc.vb#customiqueryablefeeds)] - -## Example - - The previous example returns the following result for the URI `http://myservice/OrderItems.svc/Orders(0)?$expand=Items`. - - [!code-xml[Astoria Custom Feeds#IQueryableFeedResultInline](../../../../samples/snippets/xml/VS_Snippets_Misc/astoria_custom_feeds/xml/iqueryablefeedresultinline.xml#iqueryablefeedresultinline)] - -## See also - -- [Reflection Provider](reflection-provider-wcf-data-services.md) diff --git a/docs/framework/data/wcf/how-to-define-a-service-operation-wcf-data-services.md b/docs/framework/data/wcf/how-to-define-a-service-operation-wcf-data-services.md deleted file mode 100644 index 0ca6b870e9876..0000000000000 --- a/docs/framework/data/wcf/how-to-define-a-service-operation-wcf-data-services.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -description: "Learn more about: How to: Define a Service Operation (WCF Data Services)" -title: "How to: Define a Service Operation (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "Service Operations [WCF Data Services]" - - "WCF Data Services, service operations" -ms.assetid: dfcd3cb1-2f07-4d0b-b16a-6b056c4f45fa ---- -# How to: Define a Service Operation (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -WCF Data Services expose methods that are defined on the server as service operations. Service operations allow a data service to provide access through a URI to a method that is defined on the server. To define a service operation, apply the [`WebGet]` or `[WebInvoke]` attribute to the method. To support query operators, the service operation must return an instance. Service operations may access the underlying data source through the property on the . For more information, see [Service Operations](service-operations-wcf-data-services.md). - -The example in this topic defines a service operation named `GetOrdersByCity` that returns a filtered instance of `Orders` and related `Order_Details` objects. The example accesses the instance that is the data source for the Northwind sample data service. This service is created when you complete the [WCF Data Services quickstart](quickstart-wcf-data-services.md). - -### To define a service operation in the Northwind data service - -1. In the Northwind data service project, open the Northwind.svc file. - -2. In the `Northwind` class, define a service operation method named `GetOrdersByCity` as follows: - - [!code-csharp[Astoria Northwind Service#ServiceOperationDef](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_service/cs/northwind2.svc.cs#serviceoperationdef)] - [!code-vb[Astoria Northwind Service#ServiceOperationDef](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_service/vb/northwind2.svc.vb#serviceoperationdef)] - -3. In the `InitializeService` method of the `Northwind` class, add the following code to enable access to the service operation: - - [!code-csharp[Astoria Northwind Service#ServiceOperationConfig](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_service/cs/northwind2.svc.cs#serviceoperationconfig)] - [!code-vb[Astoria Northwind Service#ServiceOperationConfig](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_service/vb/northwind2.svc.vb#serviceoperationconfig)] - -### To query the GetOrdersByCity service operation - -- In a Web browser, enter one of the following URIs to invoke the service operation that is defined in the following example: - - - `http://localhost:12345/Northwind.svc/GetOrdersByCity?city='London'` - - - `http://localhost:12345/Northwind.svc/GetOrdersByCity?city='London'&$top=2` - - - `http://localhost:12345/Northwind.svc/GetOrdersByCity?city='London'&$expand=Order_Details&$orderby=RequiredDate desc` - -## Example - -The following example implements a service operation named `GetOrderByCity` on the Northwind data service. This operation uses the ADO.NET Entity Framework to return a set of `Orders` and related `Order_Details` objects as an instance based on the provided city name. - -> [!NOTE] -> Query operators are supported on this service operation endpoint because the method returns an instance. - -[!code-csharp[Astoria Northwind Service#ServiceOperation](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_service/cs/northwind2.svc.cs#serviceoperation)] -[!code-vb[Astoria Northwind Service#ServiceOperation](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_service/vb/northwind2.svc.vb#serviceoperation)] - -## See also - -- [Defining WCF Data Services](defining-wcf-data-services.md) diff --git a/docs/framework/data/wcf/how-to-define-entity-relationships-wcf-data-services.md b/docs/framework/data/wcf/how-to-define-entity-relationships-wcf-data-services.md deleted file mode 100644 index fae982a16a6ec..0000000000000 --- a/docs/framework/data/wcf/how-to-define-entity-relationships-wcf-data-services.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -description: "Learn more about: How to: Define Entity Relationships (WCF Data Services)" -title: "How to: Define Entity Relationships (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, changing data" -ms.assetid: cc255524-1534-4fae-b83c-250933d5a72b ---- -# How to: Define Entity Relationships (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -When you add a new entity in WCF Data Services, any relationships between the new entity and related entities are not automatically defined. You can create and change relationships between entity instances and have the client library reflect those changes in the data service. For more information, see [Updating the Data Service](updating-the-data-service-wcf-data-services.md). - - The example in this topic uses the Northwind sample data service and autogenerated client data service classes. This service and the client data classes are created when you complete the [WCF Data Services quickstart](quickstart-wcf-data-services.md). - -## Example - - The following example creates a new object instance and then calls the method on the to create the item in the context along with the link to the related order. An HTTP POST message is sent to the data service when the method is called. - - [!code-csharp[Astoria Northwind Client#AddOrderDetailToOrderAuto](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#addorderdetailtoorderauto)] - [!code-vb[Astoria Northwind Client#AddOrderDetailToOrderAuto](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#addorderdetailtoorderauto)] - -## Example - - The following example shows how to use the method to add an `Order_Details` object to a related `Orders` object with a reference to a specific `Products` object. The and methods define the relationships. In this example, the navigation properties on the `Order_Details` object are also explicitly set. - - [!code-csharp[Astoria Northwind Client#AddOrderDetailToOrder](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#addorderdetailtoorder)] - [!code-vb[Astoria Northwind Client#AddOrderDetailToOrder](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#addorderdetailtoorder)] - -## See also - -- [WCF Data Services Client Library](wcf-data-services-client-library.md) -- [How to: Add, Modify, and Delete Entities](how-to-add-modify-and-delete-entities-wcf-data-services.md) diff --git a/docs/framework/data/wcf/how-to-develop-a-wcf-data-service-running-on-iis.md b/docs/framework/data/wcf/how-to-develop-a-wcf-data-service-running-on-iis.md deleted file mode 100644 index 465d70c131a02..0000000000000 --- a/docs/framework/data/wcf/how-to-develop-a-wcf-data-service-running-on-iis.md +++ /dev/null @@ -1,164 +0,0 @@ ---- -description: "Learn more about: How to: Develop a WCF data service running on IIS" -title: "How to: Develop a WCF Data Service Running on IIS" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, developing" - - "WCF Data Services, deploying" - - "WCF Data Services, hosting" -ms.assetid: f6f768c5-4989-49e3-a36f-896ab4ded86e ---- -# How to: Develop a WCF data service running on IIS - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -This article shows how to use WCF Data Services to create a data service that's based on the Northwind sample database that's hosted by an ASP.NET Web app running on Internet Information Services (IIS). For an example of how to create the same Northwind data service as an ASP.NET Web app that runs on the ASP.NET Development Server, see the [WCF Data Services quickstart](quickstart-wcf-data-services.md). - -> [!NOTE] -> To create the Northwind data service, first install the Northwind sample database on the local computer. To install the database, run the Transact-SQL script from [Northwind and pubs sample databases for Microsoft SQL Server](https://github.com/Microsoft/sql-server-samples/tree/master/samples/databases/northwind-pubs). - -This article shows how to create a data service by using the Entity Framework provider. Other data services providers are available. For more information, see [Data Services Providers](data-services-providers-wcf-data-services.md). - -After you create the service, you must explicitly provide access to data service resources. For more information, see [How to: Enable Access to the Data Service](how-to-enable-access-to-the-data-service-wcf-data-services.md). - -## Create the ASP.NET web application that runs on IIS - -1. In Visual Studio, on the **File** menu, select **New** > **Project**. - -2. In the **New Project** dialog box, select the **Installed** > [**Visual C#** or **Visual Basic**] > **Web** category. - -3. Select the **ASP.NET Web Application** template. - -4. Enter `NorthwindService` as the name of the project. - -5. Click **OK**. - -6. On the **Project** menu, select **NorthwindService Properties**. - -7. Select the **Web** tab, and then select **Use Local IIS Web Server**. - -8. Click **Create Virtual Directory** and then click **OK**. - -9. From the command prompt with administrator privileges, execute one of the following commands (depending on the operating system): - - - 32-bit systems: - - ```console - "%windir%\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -i - ``` - - - 64-bit systems: - - ```console - "%windir%\Microsoft.NET\Framework64\v3.0\Windows Communication Foundation\ServiceModelReg.exe" -i - ``` - - This makes sure that Windows Communication Foundation (WCF) is registered on the computer. - -10. From the command prompt with administrator privileges, execute one of the following commands (depending on the operating system): - - - 32-bit systems: - - ```console - "%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe" -i -enable - ``` - - - 64-bit systems: - - ```console - "%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe" -i -enable - ``` - - This makes sure that IIS runs correctly after WCF has been installed on the computer. You might have to also restart IIS. - -11. When the ASP.NET application runs on IIS7, you must also perform the following steps: - - 1. Open IIS Manager and navigate to the PhotoService application under **Default Web Site**. - - 2. In **Features View**, double-click **Authentication**. - - 3. On the **Authentication** page, select **Anonymous Authentication**. - - 4. In the **Actions** pane, click **Edit** to set the security principal under which anonymous users will connect to the site. - - 5. In the **Edit Anonymous Authentication Credentials** dialog box, select **Application pool identity**. - - > [!IMPORTANT] - > When you use the Network Service account, you grant anonymous users all the internal network access associated with that account. - -12. By using SQL Server Management Studio, the sqlcmd.exe utility, or the Transact-SQL Editor in Visual Studio, execute the following Transact-SQL command against the instance of SQL Server that has the Northwind database attached: - - ```sql - CREATE LOGIN [NT AUTHORITY\NETWORK SERVICE] FROM WINDOWS; - GO - ``` - - This creates a login in the SQL Server instance for the Windows account used to run IIS. This enables IIS to connect to the SQL Server instance. - -13. With the Northwind database attached, execute the following Transact-SQL commands: - - ```sql - USE Northwind - GO - CREATE USER [NT AUTHORITY\NETWORK SERVICE] - FOR LOGIN [NT AUTHORITY\NETWORK SERVICE] WITH DEFAULT_SCHEMA=[dbo]; - GO - ALTER LOGIN [NT AUTHORITY\NETWORK SERVICE] - WITH DEFAULT_DATABASE=[Northwind]; - GO - EXEC sp_addrolemember 'db_datareader', 'NT AUTHORITY\NETWORK SERVICE' - GO - EXEC sp_addrolemember 'db_datawriter', 'NT AUTHORITY\NETWORK SERVICE' - GO - ``` - - This grants rights to the new login, which enables IIS to read data from and write data to the Northwind database. - -## Define the data model - -1. In **Solution Explorer**, right-click the name of the ASP.NET project, and then click **Add** > **New Item**. - -2. In the **Add New Item** dialog box, select **ADO.NET Entity Data Model**. - -3. For the name of the data model, type `Northwind.edmx`. - -4. In the Entity Data Model Wizard, select **Generate from Database**, and then click **Next**. - -5. Connect the data model to the database by doing one of the following steps, and then click **Next**: - - - If you do not have a database connection already configured, click **New Connection** and create a new connection. For more information, see [How to: Create Connections to SQL Server Databases](/previous-versions/visualstudio/visual-studio-2008/s4yys16a(v=vs.90)). This SQL Server instance must have the Northwind sample database attached. - - \- or - - - - If you have a database connection already configured to connect to the Northwind database, select that connection from the list of connections. - -6. On the final page of the wizard, select the check boxes for all tables in the database, and clear the check boxes for views and stored procedures. - -7. Click **Finish** to close the wizard. - -## Create the data service - -1. In **Solution Explorer**, right-click the name of your ASP.NET project, and then click **Add** > **New Item**. - -2. In the **Add New Item** dialog box, select **WCF Data Service**. - - ![WCF Data Service item template in Visual Studio 2015](./media/wcf-data-service-item-template.png) - - > [!NOTE] - > The **WCF Data Service** template is available in Visual Studio 2015, but not in Visual Studio 2017 or later. - -3. For the name of the service, enter `Northwind`. - - Visual Studio creates the XML markup and code files for the new service. By default, the code-editor window opens. In **Solution Explorer**, the service has the name, Northwind, and the extension .svc.cs or .svc.vb. - -4. In the code for the data service, replace the comment `/* TODO: put your data source class name here */` in the definition of the class that defines the data service with the type that is the entity container of the data model, which in this case is `NorthwindEntities`. The class definition should look this the following: - - [!code-csharp[Astoria Quickstart Service#ServiceDefinition](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_quickstart_service/cs/northwind.svc.cs#servicedefinition)] - [!code-vb[Astoria Quickstart Service#ServiceDefinition](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_quickstart_service/vb/northwind.svc.vb#servicedefinition)] - -## See also - -- [Exposing Your Data as a Service](exposing-your-data-as-a-service-wcf-data-services.md) diff --git a/docs/framework/data/wcf/how-to-enable-access-to-the-data-service-wcf-data-services.md b/docs/framework/data/wcf/how-to-enable-access-to-the-data-service-wcf-data-services.md deleted file mode 100644 index 49ba3c3b1349e..0000000000000 --- a/docs/framework/data/wcf/how-to-enable-access-to-the-data-service-wcf-data-services.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -description: "Learn more about: How to: Enable Access to the Data Service (WCF Data Services)" -title: "How to: Enable Access to the Data Service (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, configuring" -ms.assetid: 3d830bcd-32b4-4f26-9287-d58a071452c6 ---- -# How to: Enable Access to the Data Service (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -In WCF Data Services, you must explicitly grant access to the resources that are exposed by a data service. This means that after you create a new data service, you must still explicitly provide access to individual resources as entity sets. This topic shows how to enable read and write access to five of the entity sets in the Northwind data service that is created when you complete the [quickstart](quickstart-wcf-data-services.md). Because the enumeration is defined by using the , you can use a logical OR operator to specify multiple permissions for a single entity set. - -> [!NOTE] -> Any client that can access the ASP.NET application can also access the resources exposed by the data service. In a production data service, to prevent unauthorized access to resources, you should also secure the application itself. For more information, see [Securing ASP.NET Web Sites](/previous-versions/aspnet/91f66yxt(v=vs.100)). - -### To enable access to the data service - -- In the code for the data service, replace the placeholder code in the `InitializeService` function with the following: - - [!code-csharp[Astoria Quickstart Service#AllReadConfig](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_quickstart_service/cs/northwind.svc.cs#allreadconfig)] - [!code-vb[Astoria Quickstart Service#AllReadConfig](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_quickstart_service/vb/northwind.svc.vb#allreadconfig)] - - This enables clients to have read and write access to the `Orders` and `Order_Details` entity sets and read-only access to the `Customers` entity sets. - -## See also - -- [How to: Develop a WCF Data Service Running on IIS](how-to-develop-a-wcf-data-service-running-on-iis.md) -- [Configuring the Data Service](configuring-the-data-service-wcf-data-services.md) diff --git a/docs/framework/data/wcf/how-to-enable-paging-of-data-service-results-wcf-data-services.md b/docs/framework/data/wcf/how-to-enable-paging-of-data-service-results-wcf-data-services.md deleted file mode 100644 index af33b2d7d8db5..0000000000000 --- a/docs/framework/data/wcf/how-to-enable-paging-of-data-service-results-wcf-data-services.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -description: "Learn more about: How to: Enable Paging of Data Service Results (WCF Data Services)" -title: "How to: Enable Paging of Data Service Results (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "paging output [WCF Data Services]" -ms.assetid: 9a316cbd-9612-4482-a541-a10bc78b2635 ---- -# How to: Enable Paging of Data Service Results (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -WCF Data Services enables you to limit the number of entities returned by a data service query. Page limits are defined in the method that is called when the service is initialized and can be set separately for each entity set. - - When paging is enabled, the final entry in the feed contains a link to the next page of data. For more information, see [Configuring the Data Service](configuring-the-data-service-wcf-data-services.md). - - This topic shows how to modify a data service to enable paging of returned `Customers` and `Orders` entity sets. The example in this topic uses the Northwind sample data service. This service is created when you complete the [WCF Data Services quickstart](quickstart-wcf-data-services.md). - -### How to enable paging of returned Customers and Orders entity sets - -- In the code for the data service, replace the placeholder code in the `InitializeService` function with the following: - - [!code-csharp[Astoria Northwind Service#DataServiceConfigPaging](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_service/cs/northwind.svc.cs#dataserviceconfigpaging)] - [!code-vb[Astoria Northwind Service#DataServiceConfigPaging](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_service/vb/northwind.svc.vb#dataserviceconfigpaging)] - -## See also - -- [Loading Deferred Content](loading-deferred-content-wcf-data-services.md) -- [How to: Load Paged Results](how-to-load-paged-results-wcf-data-services.md) diff --git a/docs/framework/data/wcf/how-to-execute-asynchronous-data-service-queries-wcf-data-services.md b/docs/framework/data/wcf/how-to-execute-asynchronous-data-service-queries-wcf-data-services.md deleted file mode 100644 index a6d0c7388a064..0000000000000 --- a/docs/framework/data/wcf/how-to-execute-asynchronous-data-service-queries-wcf-data-services.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -description: "Learn more about: How to: Execute Asynchronous Data Service Queries (WCF Data Services)" -title: "How to: Execute Asynchronous Data Service Queries (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, asynchronous operations" - - "asynchronous operations [WCF Data Services]" -ms.assetid: 902a2dc1-d0e9-4b00-90a8-becc4cb1f6a7 ---- -# How to: Execute Asynchronous Data Service Queries (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -By using the WCF Data Services client library, you can asynchronously perform client-server operations, such as executing queries and saving changes. For more information, see [Asynchronous Operations](asynchronous-operations-wcf-data-services.md). - -> [!NOTE] -> In an application where the callback must be invoked on a specific thread, you must explicitly marshal the execution of the method. For more information, see [Asynchronous Operations](asynchronous-operations-wcf-data-services.md). - - The example in this topic uses the Northwind sample data service and autogenerated client data service classes. This service and the client data classes are created when you complete the [WCF Data Services quickstart](quickstart-wcf-data-services.md). - -## Example - - The following example shows how to execute an asynchronous query by calling the method to start the query. The inline delegate calls the method to display the query results. - - [!code-csharp[Astoria Northwind Client#ExecuteQueryAsync](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#executequeryasync)] - [!code-vb[Astoria Northwind Client#ExecuteQueryAsync](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#executequeryasync)] - -## See also - -- [WCF Data Services Client Library](wcf-data-services-client-library.md) diff --git a/docs/framework/data/wcf/how-to-execute-data-service-queries-wcf-data-services.md b/docs/framework/data/wcf/how-to-execute-data-service-queries-wcf-data-services.md deleted file mode 100644 index f94d594311b7b..0000000000000 --- a/docs/framework/data/wcf/how-to-execute-data-service-queries-wcf-data-services.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -description: "Learn more about: How to: Execute Data Service Queries (WCF Data Services)" -title: "How to: Execute Data Service Queries (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "querying the data service [WCF Data Services]" - - "WCF Data Services, querying" - - "WCF Data Services, accessing data" -ms.assetid: 62997821-e0c6-4c4d-9fb7-1273fb5e5d18 ---- -# How to: Execute Data Service Queries (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -WCF Data Services enables you to query a data service from a .NET Framework-based client application by using the generated client data service classes. You can execute queries by using one of these methods: - -- Executing a LINQ query against the named that you obtain from the that the `Add Data Service Reference` tool generates. - -- Implicitly, by enumerating over the named that you obtain from the that the `Add Data Service Reference` tool generates. - -- Explicitly, by calling the method on the , or the method for asynchronous execution. - - For more information, see [Querying the Data Service](querying-the-data-service-wcf-data-services.md). - - The example in this topic uses the Northwind sample data service and autogenerated client data service classes. This service and the client data classes are created when you complete the [WCF Data Services quickstart](quickstart-wcf-data-services.md). - -## Example - - The following example shows how to define and execute a LINQ query that returns all `Customers` against the Northwind data service. - - [!code-csharp[Astoria Northwind Client#GetAllCustomersLinq](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#getallcustomerslinq)] - [!code-vb[Astoria Northwind Client#GetAllCustomersLinq](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#getallcustomerslinq)] - -## Example - - The following example shows how to use the context that the `Add Data Service Reference` tool generates to implicitly execute a query that returns all `Customers` against the Northwind data service. The URI of the requested `Customers` entity set is determined automatically by the context. The query is executed implicitly when the enumeration occurs. - - [!code-csharp[Astoria Northwind Client#GetAllCustomers](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#getallcustomers)] - [!code-vb[Astoria Northwind Client#GetAllCustomers](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#getallcustomers)] - -## Example - - The following example shows how to use the to explicitly execute a query that returns all `Customers` against the Northwind data service. - - [!code-csharp[Astoria Northwind Client#GetAllCustomersExplicit](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#getallcustomersexplicit)] - [!code-vb[Astoria Northwind Client#GetAllCustomersExplicit](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#getallcustomersexplicit)] - -## See also - -- [How to: Add Query Options to a Data Service Query](how-to-add-query-options-to-a-data-service-query-wcf-data-services.md) diff --git a/docs/framework/data/wcf/how-to-execute-queries-in-a-batch-wcf-data-services.md b/docs/framework/data/wcf/how-to-execute-queries-in-a-batch-wcf-data-services.md deleted file mode 100644 index 5d9ca70d10915..0000000000000 --- a/docs/framework/data/wcf/how-to-execute-queries-in-a-batch-wcf-data-services.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -description: "Learn more about: How to: Execute Queries in a Batch (WCF Data Services)" -title: "How to: Execute Queries in a Batch (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, batch requests" -ms.assetid: 3b4db7df-bd33-43a1-8ea4-63a18e131f97 ---- -# How to: Execute Queries in a Batch (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -By using the WCF Data Services client library, you can execute more than one query against the data service in a single batch. For more information, see [Batching Operations](batching-operations-wcf-data-services.md). - - The example in this topic uses the Northwind sample data service and autogenerated client data service classes. This service and the client data classes are created when you complete the [WCF Data Services quickstart](quickstart-wcf-data-services.md). - -## Example - - The following example shows how to call the method to execute an array of objects that contains queries that return both `Customers` and `Products` objects from the Northwind data service. The collection of objects in the returned is enumerated, and the collection of objects contained in each is also enumerated. - - [!code-csharp[Astoria Northwind Client#BatchQuery](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#batchquery)] - [!code-vb[Astoria Northwind Client#BatchQuery](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#batchquery)] - -## See also - -- [WCF Data Services Client Library](wcf-data-services-client-library.md) diff --git a/docs/framework/data/wcf/how-to-intercept-data-service-messages-wcf-data-services.md b/docs/framework/data/wcf/how-to-intercept-data-service-messages-wcf-data-services.md deleted file mode 100644 index 26bafaafccb92..0000000000000 --- a/docs/framework/data/wcf/how-to-intercept-data-service-messages-wcf-data-services.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -description: "Learn more about: How to: Intercept Data Service Messages (WCF Data Services)" -title: "How to: Intercept Data Service Messages (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, customizing" - - "query interceptors [WCF Data Services]" -ms.assetid: 24b9df1b-b54b-4795-a033-edf333675de6 ---- -# How to: Intercept Data Service Messages (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -With WCF Data Services, you can intercept request messages so that you can add custom logic to an operation. To intercept a message, you use specially attributed methods in the data service. For more information, see [Interceptors](interceptors-wcf-data-services.md). - - The example in this topic uses the Northwind sample data service. This service is created when you complete the [WCF Data Services quickstart](quickstart-wcf-data-services.md). - -### To define a query interceptor for the Orders entity set - -1. In the Northwind data service project, open the Northwind.svc file. - -2. In the code page for the `Northwind` class, add the following `using` statement (`Imports` in Visual Basic). - - [!code-csharp[Astoria Northwind Service#UsingLinqExpressions](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_service/cs/northwind2.svc.cs#usinglinqexpressions)] - [!code-vb[Astoria Northwind Service#UsingLinqExpressions](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_service/vb/northwind2.svc.vb#usinglinqexpressions)] - -3. In the `Northwind` class, define a service operation method named `OnQueryOrders` as follows: - - [!code-csharp[Astoria Northwind Service#QueryInterceptorDef](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_service/cs/northwind2.svc.cs#queryinterceptordef)] - [!code-vb[Astoria Northwind Service#QueryInterceptorDef](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_service/vb/northwind2.svc.vb#queryinterceptordef)] - -### To define a change interceptor for the Products entity set - -1. In the Northwind data service project, open the Northwind.svc file. - -2. In the `Northwind` class, define a service operation method named `OnChangeProducts` as follows: - - [!code-csharp[Astoria Northwind Service#ChangeInterceptorDef](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_service/cs/northwind2.svc.cs#changeinterceptordef)] - [!code-vb[Astoria Northwind Service#ChangeInterceptorDef](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_service/vb/northwind2.svc.vb#changeinterceptordef)] - -## Example - - This example defines a query interceptor method for the `Orders` entity set that returns a lambda expression. This expression contains a delegate that filters the requested `Orders` based on related `Customers` that have a specific contact name. The name is in turn determined based on the requesting user. This example assumes that the data service is hosted within an ASP.NET Web application that uses WCF, and that authentication is enabled. The class is used to retrieve the principle of the current request. - - [!code-csharp[Astoria Northwind Service#QueryInterceptor](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_service/cs/northwind2.svc.cs#queryinterceptor)] - [!code-vb[Astoria Northwind Service#QueryInterceptor](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_service/vb/northwind2.svc.vb#queryinterceptor)] - -## Example - - This example defines a change interceptor method for the `Products` entity set. This method validates input to the service for an or operation and raises an exception if a change is being made to a discontinued product. It also blocks the deletion of products as an unsupported operation. - - [!code-csharp[Astoria Northwind Service#ChangeInterceptor](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_service/cs/northwind2.svc.cs#changeinterceptor)] - [!code-vb[Astoria Northwind Service#ChangeInterceptor](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_service/vb/northwind2.svc.vb#changeinterceptor)] - -## See also - -- [How to: Define a Service Operation](how-to-define-a-service-operation-wcf-data-services.md) -- [Defining WCF Data Services](defining-wcf-data-services.md) diff --git a/docs/framework/data/wcf/how-to-load-paged-results-wcf-data-services.md b/docs/framework/data/wcf/how-to-load-paged-results-wcf-data-services.md deleted file mode 100644 index 3116158b33339..0000000000000 --- a/docs/framework/data/wcf/how-to-load-paged-results-wcf-data-services.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -description: "Learn more about: How to: Load Paged Results (WCF Data Services)" -title: "How to: Load Paged Results (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, deferred content" - - "WCF Data Services, loading data" -ms.assetid: bb786ea4-f3ef-4ad3-9a41-3a0b7feb6a1f ---- -# How to: Load Paged Results (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -WCF Data Services enables the data service to limit the number of entities that are returned in a single response feed. When this happens, the final entry in the feed contains a link to the next page of data. The URI for the next page of data is obtained by calling the method of the , which is returned when the is executed. The URI represented by this object is then used to load the next page of results. For more information, see [Loading Deferred Content](loading-deferred-content-wcf-data-services.md). - - The example in this topic uses the Northwind sample data service and autogenerated client data service classes. This service and the client data classes are created when you complete the [WCF Data Services quickstart](quickstart-wcf-data-services.md). - -## Example - - This example uses a `do…while` loop to load `Customers` entities from a paged results from the data service. - - [!code-csharp[Astoria Northwind Client#GetCustomersPaged](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#getcustomerspaged)] - [!code-vb[Astoria Northwind Client#GetCustomersPaged](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#getcustomerspaged)] - -## Example - - This example returns related `Orders` entities with each `Customers` entity and uses a `do…while` loop to load `Customers` entities pages and a nested `while` loop to load pages of related `Orders` entities from the data service. - - [!code-csharp[Astoria Northwind Client#GetCustomersPagedNested](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#getcustomerspagednested)] - [!code-vb[Astoria Northwind Client#GetCustomersPagedNested](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#getcustomerspagednested)] - -## See also - -- [Loading Deferred Content](loading-deferred-content-wcf-data-services.md) -- [How to: Load Related Entities](how-to-load-related-entities-wcf-data-services.md) diff --git a/docs/framework/data/wcf/how-to-load-related-entities-wcf-data-services.md b/docs/framework/data/wcf/how-to-load-related-entities-wcf-data-services.md deleted file mode 100644 index c8423b660514a..0000000000000 --- a/docs/framework/data/wcf/how-to-load-related-entities-wcf-data-services.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -description: "Learn more about: How to: Load Related Entities (WCF Data Services)" -title: "How to: Load Related Entities (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, deferred content" - - "WCF Data Services, loading data" -ms.assetid: 6f143d30-d997-4e6b-bcf0-d5c394ecb108 ---- -# How to: Load Related Entities (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -When you need to load associated entities in WCF Data Services, you can use the method on the class. You can also use the method on the to require that related entities be eagerly loaded in the same query response. - - The example in this topic uses the Northwind sample data service and autogenerated client data service classes. This service and the client data classes are created when you complete the [WCF Data Services quickstart](quickstart-wcf-data-services.md). - -## Example - - The following example shows how to explicitly load the `Customer` that is related to each returned `Orders` instance. - - [!code-csharp[Astoria Northwind Client#LoadRelatedOrderCustomer](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#loadrelatedordercustomer)] - [!code-vb[Astoria Northwind Client#LoadRelatedOrderCustomer](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#loadrelatedordercustomer)] - -## Example - - The following example shows how to use the method to return `Order Details` that belong to the `Orders` returned by the query. - - [!code-csharp[Astoria Northwind Client#ExpandOrderDetails](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#expandorderdetails)] - [!code-vb[Astoria Northwind Client#ExpandOrderDetails](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#expandorderdetails)] - -## See also - -- [Querying the Data Service](querying-the-data-service-wcf-data-services.md) diff --git a/docs/framework/data/wcf/how-to-manually-generate-client-data-service-classes-wcf-data-services.md b/docs/framework/data/wcf/how-to-manually-generate-client-data-service-classes-wcf-data-services.md deleted file mode 100644 index a1ac83ec232d3..0000000000000 --- a/docs/framework/data/wcf/how-to-manually-generate-client-data-service-classes-wcf-data-services.md +++ /dev/null @@ -1,98 +0,0 @@ ---- -description: "Learn more about: How to: Manually Generate Client Data Service Classes (WCF Data Services)" -title: "How to: Manually Generate Client Data Service Classes (WCF Data Services)" -ms.date: "03/30/2017" -helpviewer_keywords: - - "WCF Data Services, configuring" - - "WCF Data Services, client library" -ms.assetid: b98cb1d6-956a-4e50-add6-67e4f2587346 ---- -# How to: Manually Generate Client Data Service Classes (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -WCF Data Services integrates with Visual Studio to enable you to automatically generate client data service classes when you use the **Add Service Reference** dialog box to add a reference to a data service in a Visual Studio project. For more information, see [How to: Add a Data Service Reference](how-to-add-a-data-service-reference-wcf-data-services.md). You can also manually generate the same client data service classes by using the code-generation tool, `DataSvcUtil.exe`. This tool, which is included with WCF Data Services, generates .NET Framework classes from the data service definition. It can also be used to generate data service classes from the conceptual model (.csdl) file and from the .edmx file that represents an Entity Framework model in a Visual Studio project. - - The example in this topic creates client data service classes based on the Northwind sample data service. This service is created when you complete the [WCF Data Services quickstart](quickstart-wcf-data-services.md). Some examples in this topic require the conceptual model file for the Northwind model. For more information, see [How to: Use EdmGen.exe to Generate the Model and Mapping Files](../adonet/ef/how-to-use-edmgen-exe-to-generate-the-model-and-mapping-files.md). Some examples in this topic require the .edmx file for the Northwind model. For more information, see [.edmx File Overview](/previous-versions/dotnet/netframework-4.0/cc982042(v=vs.100)). - -### To generate C# classes that support data binding - -- At the command prompt, execute the following command without line breaks: - - ```console - "%windir%\Microsoft.NET\Framework\v3.5\DataSvcUtil.exe" /dataservicecollection /version:2.0 /language:CSharp /out:Northwind.cs /uri:http://localhost:12345/Northwind.svc - ``` - - > [!NOTE] - > You must replace the value supplied to the `/uri:` parameter with the URI of your instance of the Northwind sample data service. - -### To generate Visual Basic classes that support data binding - -- At the command prompt, execute the following command without line breaks: - - ```console - "%windir%\Microsoft.NET\Framework\v3.5\DataSvcUtil.exe" /dataservicecollection /version:2.0 /language:VB /out:Northwind.vb /uri:http://localhost:12345/Northwind.svc - ``` - - > [!NOTE] - > You must replace value supplied to the `/uri:` parameter with the URI of your instance of the Northwind sample data service. - -### To generate C# classes based on the service URI - -- At the command prompt, execute the following command without line breaks: - - ```console - "%windir%\Microsoft.NET\Framework\v3.5\DataSvcUtil.exe" /language:CSharp /out:northwind.cs /uri:http://localhost:12345/Northwind.svc - ``` - - > [!NOTE] - > You must replace the value supplied to the `/uri:` parameter with the URI of your instance of the Northwind sample data service. - -### To generate Visual Basic classes based on the service URI - -- At the command prompt, execute the following command without line breaks: - - ```console - "%windir%\Microsoft.NET\Framework\v3.5\datasvcutil.exe" /language:VB /out:Northwind.vb /uri:http://localhost:12345/Northwind.svc - ``` - - > [!NOTE] - > You must replace value supplied to the `/uri:` parameter with the URI of your instance of the Northwind sample data service. - -### To generate C# classes based on the conceptual model file (CSDL) - -- At the command prompt, execute the following command without line breaks: - - ```console - "%windir%\Microsoft.NET\Framework\v3.5\datasvcutil.exe" /language:CSharp /in:Northwind.csdl /out:Northwind.cs - ``` - -### To generate Visual Basic classes based on the conceptual model file (CSDL) - -- At the command prompt, execute the following command without line breaks: - - ```console - "%windir%\Microsoft.NET\Framework\v3.5\datasvcutil.exe" /language:VB /in:Northwind.csdl /out:Northwind.vb - ``` - -### To generate C# classes based on the .edmx file - -- At the command prompt, execute the following command without line breaks: - - ```console - "%windir%\Microsoft.NET\Framework\v3.5\datasvcutil.exe" /language:CSharp /in:Northwind.edmx /out:c:\northwind.cs - ``` - -### To generate Visual Basic classes based on the .edmx file - -- At the command prompt, execute the following command without line breaks: - - ```console - "%windir%\Microsoft.NET\Framework\v3.5\datasvcutil.exe" /language:VB /in:Northwind.edmx /out:c:\northwind.vb - ``` - -## See also - -- [Generating the Data Service Client Library](generating-the-data-service-client-library-wcf-data-services.md) -- [How to: Add a Data Service Reference](how-to-add-a-data-service-reference-wcf-data-services.md) -- [WCF Data Service Client Utility (DataSvcUtil.exe)](wcf-data-service-client-utility-datasvcutil-exe.md) diff --git a/docs/framework/data/wcf/how-to-project-query-results-wcf-data-services.md b/docs/framework/data/wcf/how-to-project-query-results-wcf-data-services.md deleted file mode 100644 index c581bf495136e..0000000000000 --- a/docs/framework/data/wcf/how-to-project-query-results-wcf-data-services.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -description: "Learn more about: How to: Project Query Results (WCF Data Services)" -title: "How to: Project Query Results (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "projection [WCF Data Services]" - - "WCF Data Services, projection" - - "query projection [WCF Data Services]" - - "WCF Data Services, querying" -ms.assetid: 474ac625-8770-43ba-8320-d3315ea9530f ---- -# How to: Project Query Results (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -Projection provides a mechanism to reduce the amount of data returned by a query by specifying that only certain properties of an entity are returned in the response. You can perform projections on the results of an WCF Data Services query either by using the `$select` query option or by using the [select](../../../csharp/language-reference/keywords/select-clause.md) clause ([Select](../../../visual-basic/language-reference/queries/select-clause.md) in Visual Basic) in a LINQ query. For more information, see [Querying the Data Service](querying-the-data-service-wcf-data-services.md). - - The example in this topic uses the Northwind sample data service and autogenerated client data service classes. This service and the client data classes are created when you complete the [WCF Data Services quickstart](quickstart-wcf-data-services.md). - -## Example - - The following example shows a LINQ query that projects Customers entities into a new CustomerAddress type, which contains only address-specific properties plus the identity property. This `CustomerAddress` class is defined on the client and is attributed so that the client library can recognize it as an entity type. - - [!code-csharp[Astoria Northwind Client#SelectCustomerAddress](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#selectcustomeraddress)] - [!code-vb[Astoria Northwind Client#SelectCustomerAddress](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#selectcustomeraddress)] - -## Example - - The following example shows a LINQ query that projects returned Customers entities into a new CustomerAddressNonEntity type, which contains only address-specific properties and no identity property. This `CustomerAddressNonEntity` class is defined on the client and is not attributed as an entity type. - - [!code-csharp[Astoria Northwind Client#SelectCustomerAddressNonEntity](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#selectcustomeraddressnonentity)] - [!code-vb[Astoria Northwind Client#SelectCustomerAddressNonEntity](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#selectcustomeraddressnonentity)] - -## Example - - The following example shows the definitions of the `CustomerAddress` and `CustomerAddressNonEntity` types that are used in the previous examples. - - [!code-csharp[Astoria Northwind Client#CustomerAddressDefinition](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/customeraddress.cs#customeraddressdefinition)] - [!code-vb[Astoria Northwind Client#CustomerAddressDefinition](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/customeraddress.vb#customeraddressdefinition)] diff --git a/docs/framework/data/wcf/how-to-set-headers-in-the-client-request-wcf-data-services.md b/docs/framework/data/wcf/how-to-set-headers-in-the-client-request-wcf-data-services.md deleted file mode 100644 index 53220eda450ba..0000000000000 --- a/docs/framework/data/wcf/how-to-set-headers-in-the-client-request-wcf-data-services.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: "How to: Set Headers in the Client Request (WCF Data Services)" -description: Learn how to handle the SendingRequest event to add a new header to the request message before it is sent to the data service in WCF Data Services. -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, customizing requests" -ms.assetid: 3d55168d-5901-4f48-8117-6c93da3ab5ae ---- -# How to: Set Headers in the Client Request (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -When you use the WCF Data Services client library to access a data service that supports the Open Data Protocol (OData), the client library automatically sets the required HTTP headers in request messages sent to the data service. However, the client library does not know to set message headers that are required in certain cases, such as when the data service requires claims-based authentication or cookies. For more information, see [Securing WCF Data Services](securing-wcf-data-services.md#clientAuthentication). In these cases, you must manually set message headers in the request message before it is sent. The example in this topic shows how to handle the event to add a new header to the request message before it is sent to the data service. - - The example in this topic uses the Northwind sample data service and autogenerated client data service classes. This service and the client data classes are created when you complete the [WCF Data Services quickstart](quickstart-wcf-data-services.md). You can also use the [Northwind sample data service](https://services.odata.org/Northwind/Northwind.svc/) that is published on the OData Web site; this sample data service is read-only and attempting to save changes returns an error. The sample data services on the OData website allow anonymous authentication. - -## Example - - The following example registers a handler for the event and then executes a query against the data service. - -> [!NOTE] -> When a data service requires you to manually set the message header for every request, consider registering the handler for the event by overriding the `OnContextCreated` partial method in the entity container that represents the data service, which in this case is `NorthwindEntities`. - -[!code-csharp[Astoria Northwind Client#RegisterHeadersQuery](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#registerheadersquery)] -[!code-vb[Astoria Northwind Client#RegisterHeadersQuery](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#registerheadersquery)] - -## Example - - The following method handles the event and adds an Authentication header to the request. - - [!code-csharp[Astoria Northwind Client#OnSendingRequest](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#onsendingrequest)] - [!code-vb[Astoria Northwind Client#OnSendingRequest](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#onsendingrequest)] - -## See also - -- [Securing WCF Data Services](securing-wcf-data-services.md) -- [WCF Data Services Client Library](wcf-data-services-client-library.md) diff --git a/docs/framework/data/wcf/index.md b/docs/framework/data/wcf/index.md deleted file mode 100644 index b776989e44a1c..0000000000000 --- a/docs/framework/data/wcf/index.md +++ /dev/null @@ -1,106 +0,0 @@ ---- -title: "WCF Data Services 4.5" -description: Learn about WCF Data Services, a .NET Framework component which supports services to expose and consume data using REST semantics. -ms.date: "03/30/2017" -helpviewer_keywords: - - "Astoria" - - "WCF Data Services, getting started" -ms.assetid: 73d2bec3-7c92-4110-b905-11bb0462357a ---- - -# WCF Data Services 4.5 - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -## Overview - -WCF Data Services (formerly known as "ADO.NET Data Services") is a component of the .NET Framework that enables you to create services that use the Open Data Protocol (OData) to expose and consume data over the Web or intranet by using the semantics of [representational state transfer (REST)](https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm). OData exposes data as resources that are addressable by URIs. Data is accessed and changed by using standard HTTP verbs of GET, PUT, POST, and DELETE. OData uses the entity-relationship conventions of the [Entity Data Model](../adonet/entity-data-model.md) to expose resources as sets of entities that are related by associations. - -WCF Data Services uses the OData protocol for addressing and updating resources. In this way, you can access these services from any client that supports OData. OData enables you to request and write data to resources by using well-known transfer formats: Atom, a set of standards for exchanging and updating data as XML, and JavaScript Object Notation (JSON), a text-based data exchange format used extensively in AJAX applications. - -WCF Data Services can expose data that originates from various sources as OData feeds. Visual Studio tools make it easier for you to create an OData-based service by using an ADO.NET Entity Framework data model. You can also create OData feeds based on common language runtime (CLR) classes and even late-bound or un-typed data. - -WCF Data Services also includes a set of client libraries, one for general .NET Framework client applications and another specifically for Silverlight-based applications. These client libraries provide an object-based programming model when you access an OData feed from environments such as the .NET Framework and Silverlight. - -## Where Should I Start? - -Depending on your interests, consider getting started with WCF Data Services in one of the following topics. - -I want to jump right in... - -- [Quickstart](quickstart-wcf-data-services.md) - -- [Getting Started](getting-started-with-wcf-data-services.md) - -Just show me some code... - -- [Quickstart](quickstart-wcf-data-services.md) - -- [How to: Execute Data Service Queries](how-to-execute-data-service-queries-wcf-data-services.md) - -- [How to: Bind Data to Windows Presentation Foundation Elements](bind-data-to-wpf-elements-wcf-data-services.md) - -I want to know more about OData... - -- [White paper: Introducing OData](https://download.microsoft.com/download/E/5/A/E5A59052-EE48-4D64-897B-5F7C608165B8/IntroducingOData.pdf) -- [Open Data Protocol website](https://www.odata.org/) -- [OData: SDK](https://www.odata.org/ecosystem/) - -I want to see end-to-end samples... - -- [WCF Data Services Quickstart](https://github.com/microsoftarchive/msdn-code-gallery-community-s-z/tree/master/WCF%20Data%20Services%20Quickstart%20(OData%20Service%20and%20WPF%20Client)) -- [OData SDK - Sample Code](https://www.odata.org/ecosystem/#sdk) - -How does it integrate with Visual Studio? - -- [Generating the Data Service Client Library](generating-the-data-service-client-library-wcf-data-services.md) - -- [Creating the Data Service](creating-the-data-service.md) - -- [Entity Framework Provider](entity-framework-provider-wcf-data-services.md) - -What can I do with it? - -- [Overview](wcf-data-services-overview.md) - -- [Application Scenarios](application-scenarios-wcf-data-services.md) - -I want to use LINQ... - -- [Querying the Data Service](querying-the-data-service-wcf-data-services.md) - -- [LINQ Considerations](linq-considerations-wcf-data-services.md) - -- [How to: Execute Data Service Queries](how-to-execute-data-service-queries-wcf-data-services.md) - -I still need some more information... - -- [WCF Data Services Team Blog](/archive/blogs/astoriateam/) - -- [Resources](wcf-data-services-resources.md) - -## In This Section - -[Overview](wcf-data-services-overview.md) - -Provides an overview of the features and functionality available in WCF Data Services. - -[What's New in WCF Data Services 5.0](/previous-versions/dotnet/wcf-data-services/ee373845(v=vs.103)) - -Describes new functionality in WCF Data Services and support for new OData features. - -[Getting Started](getting-started-with-wcf-data-services.md) - -Describes how to expose and consume OData feeds by using WCF Data Services. - -[Defining WCF Data Services](defining-wcf-data-services.md) - -Describes how to create and configure a data service that exposes OData feeds. - -[WCF Data Services Client Library](wcf-data-services-client-library.md) - -Describes how to use client libraries to consume OData feeds from a .NET Framework client application. - -## See also - -- [Representational State Transfer (REST)](https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm) diff --git a/docs/framework/data/wcf/interceptors-wcf-data-services.md b/docs/framework/data/wcf/interceptors-wcf-data-services.md deleted file mode 100644 index 455e871d32620..0000000000000 --- a/docs/framework/data/wcf/interceptors-wcf-data-services.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -description: "Learn more about: Interceptors (WCF Data Services)" -title: "Interceptors (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, customizing" - - "query interceptors [WCF Data Services]" -ms.assetid: e33ae8dc-8069-41d0-99a0-75ff28db7050 ---- -# Interceptors (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -WCF Data Services enables an application to intercept request messages so that you can add custom logic to an operation. You can use this custom logic to validate data in incoming messages. You can also use it to further restrict the scope of a query request, such as to insert a custom authorization policy on a per request basis. - - Interception is performed by specially attributed methods in the data service. These methods are called by WCF Data Services at the appropriate point in message processing. Interceptors are defined on a per-entity set basis, and interceptor methods cannot accept parameters from the request like service operations can. Query interceptor methods, which are called when processing an HTTP GET request, must return a lambda expression that determines whether an instance of the interceptor's entity set should be returned by the query results. This expression is used by the data service to further refine the requested operation. The following is an example definition of a query interceptor. - - [!code-csharp[Astoria Northwind Service#QueryInterceptorDef](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_service/cs/northwind2.svc.cs#queryinterceptordef)] - [!code-vb[Astoria Northwind Service#QueryInterceptorDef](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_service/vb/northwind2.svc.vb#queryinterceptordef)] - - For more information, see [How to: Intercept Data Service Messages](how-to-intercept-data-service-messages-wcf-data-services.md). - - Change interceptors, which are called when processing non-query operations, must return `void` (`Nothing` in Visual Basic). Change interceptor methods must accept the following two parameters: - -1. A parameter of a type that is compatible with the entity type of the entity set. When the data service invokes the change interceptor, the value of this parameter will reflect the entity information that is sent by the request. - -2. A parameter of type . When the data service invokes the change interceptor, the value of this parameter will reflect the operation that the request is trying to perform. - - The following is an example definition of a change interceptor. - - [!code-csharp[Astoria Northwind Service#ChangeInterceptorDef](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_service/cs/northwind2.svc.cs#changeinterceptordef)] - [!code-vb[Astoria Northwind Service#ChangeInterceptorDef](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_service/vb/northwind2.svc.vb#changeinterceptordef)] - - For more information, see [How to: Intercept Data Service Messages](how-to-intercept-data-service-messages-wcf-data-services.md). - - The following attributes are supported for interception. - - **[QueryInterceptor(** *EntitySetName* **)]** - Methods with the attribute applied are called when an HTTP GET request is received for the targeted entity set resource. These methods must always return a lambda expression in the form of `Expression>`. - - **[ChangeInterceptor(** *EntitySetName* **)]** - Methods with the attribute applied are called when an HTTP request other than HTTP GET request is received for the targeted entity set resource. These methods must always return `void` (`Nothing` in Visual Basic). - - For more information, see [How to: Intercept Data Service Messages](how-to-intercept-data-service-messages-wcf-data-services.md). - -## See also - -- [Service Operations](service-operations-wcf-data-services.md) diff --git a/docs/framework/data/wcf/linq-considerations-wcf-data-services.md b/docs/framework/data/wcf/linq-considerations-wcf-data-services.md deleted file mode 100644 index 3bf78f1c07562..0000000000000 --- a/docs/framework/data/wcf/linq-considerations-wcf-data-services.md +++ /dev/null @@ -1,233 +0,0 @@ ---- -description: "Learn more about: LINQ Considerations (WCF Data Services)" -title: "LINQ Considerations (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, LINQ" - - "querying the data service [WCF Data Services]" - - "WCF Data Services, querying" -ms.assetid: cc4ec9e9-348f-42a6-a78e-1cd40e370656 ---- -# LINQ Considerations (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -This topic provides information about the way in which LINQ queries are composed and executed when you are using the WCF Data Services client and limitations of using LINQ to query a data service that implements the Open Data Protocol (OData). For more information about composing and executing queries against an OData-based data service, see [Querying the Data Service](querying-the-data-service-wcf-data-services.md). - -## Composing LINQ Queries - - LINQ enables you to compose queries against a collection of objects that implements . Both the **Add Service Reference** dialog box in Visual Studio and the DataSvcUtil.exe tool are used to generate a representation of an OData service as an entity container class that inherits from , as well as objects that represent the entities returned in feeds. These tools also generate properties on the entity container class for the collections that are exposed as feeds by the service. Each of these properties of the class that encapsulates the data service return a . Because the class implements the interface defined by LINQ, you can compose a LINQ query against feeds exposed by the data service, which are translated by the client library into a query request URI that is sent to the data service on execution. - -> [!IMPORTANT] -> The set of queries expressible in the LINQ syntax is broader than those enabled in the URI syntax that is used by OData data services. A is raised when the query cannot be mapped to a URI in the target data service. For more information, see the [Unsupported LINQ Methods](linq-considerations-wcf-data-services.md#unsupportedMethods) in this topic. - - The following example is a LINQ query that returns `Orders` that have a freight cost of more than $30 and sorts the results by the shipping date, starting with the latest ship date: - -[!code-csharp[Astoria Northwind Client#AddQueryOptionsLinqSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#addqueryoptionslinqspecific)] -[!code-vb[Astoria Northwind Client#AddQueryOptionsLinqSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#addqueryoptionslinqspecific)] - - This LINQ query is translated into the following query URI that is executed against the Northwind-based [quickstart](quickstart-wcf-data-services.md) data service: - -```http -http://localhost:12345/Northwind.svc/Orders?Orderby=ShippedDate&?filter=Freight gt 30 -``` - - For more general information about LINQ, see [Language-Integrated Query (LINQ) - C#](../../../csharp/programming-guide/concepts/linq/index.md) or [Language-Integrated Query (LINQ) - Visual Basic](../../../visual-basic/programming-guide/concepts/linq/index.md). - - LINQ enables you to compose queries by using both the language-specific declarative query syntax, shown in the previous example, as well as a set of query methods known as standard query operators. An equivalent query to the previous example can be composed by using only the method-based syntax, as shown the following example: - -[!code-csharp[Astoria Northwind Client#AddQueryOptionsLinqExpressionSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#addqueryoptionslinqexpressionspecific)] -[!code-vb[Astoria Northwind Client#AddQueryOptionsLinqExpressionSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#addqueryoptionslinqexpressionspecific)] - - The WCF Data Services client is able to translate both kinds of composed queries into a query URI, and you can extend a LINQ query by appending query methods to a query expression. When you compose LINQ queries by appending method syntax to a query expression or a , the operations are added to the query URI in the order in which methods are called. This is equivalent to calling the method to add each query option to the query URI. - -## Executing LINQ Queries - - Certain LINQ query methods, such as or , when appended to the query, cause the query to be executed. A query is also executed when results are enumerated implicitly, such as during a `foreach` loop or when the query is assigned to a `List` collection. For more information, see [Querying the Data Service](querying-the-data-service-wcf-data-services.md). - - The client executes a LINQ query in two parts. Whenever possible, LINQ expressions in a query are first evaluated on the client, and then a URI-based query is generated and sent to the data service for evaluation against data in the service. For more information, see the section [Client versus Server Execution](querying-the-data-service-wcf-data-services.md#executingQueries) in [Querying the Data Service](querying-the-data-service-wcf-data-services.md). - - When a LINQ query cannot be translated in an OData-compliant query URI, an exception is raised when execution is attempted. For more information, see [Querying the Data Service](querying-the-data-service-wcf-data-services.md). - -## LINQ Query Examples - - The examples in the following sections demonstrate the kinds of LINQ queries that can be executed against an OData service. - - - -### Filtering - - The LINQ query examples in this section filter data in the feed returned by the service. - - The following examples are equivalent queries that filter the returned `Orders` entities so that only orders with a freight cost greater than $30 are returned: - -- Using LINQ query syntax: - -[!code-csharp[Astoria Northwind Client#LinqWhereClauseSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#linqwhereclausespecific)] -[!code-vb[Astoria Northwind Client#LinqWhereClauseSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#linqwhereclausespecific)] - -- Using LINQ query methods: - -[!code-csharp[Astoria Northwind Client#LinqWhereMethodSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#linqwheremethodspecific)] -[!code-vb[Astoria Northwind Client#LinqWhereMethodSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#linqwheremethodspecific)] - -- The URI query string `$filter` option: - -[!code-csharp[Astoria Northwind Client#ExplicitQueryWhereMethodSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#explicitquerywheremethodspecific)] -[!code-vb[Astoria Northwind Client#ExplicitQueryWhereMethodSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#explicitquerywheremethodspecific)] - - All of the previous examples are translated to the query URI: `http://localhost:12345/northwind.svc/Orders()?$filter=Freight gt 30M`. - - - -### Sorting - - The following examples show equivalent queries that sort returned data both by the company name and by postal code, descending: - -- Using LINQ query syntax: - -[!code-csharp[Astoria Northwind Client#LinqOrderByClauseSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#linqorderbyclausespecific)] -[!code-vb[Astoria Northwind Client#LinqOrderByClauseSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#linqorderbyclausespecific)] - -- Using LINQ query methods: - -[!code-csharp[Astoria Northwind Client#LinqOrderByMethodSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#linqorderbymethodspecific)] -[!code-vb[Astoria Northwind Client#LinqOrderByMethodSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#linqorderbymethodspecific)] - -- URI query string `$orderby` option): - -[!code-csharp[Astoria Northwind Client#ExplicitQueryOrderByMethodSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#explicitqueryorderbymethodspecific)] -[!code-vb[Astoria Northwind Client#ExplicitQueryOrderByMethodSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#explicitqueryorderbymethodspecific)] - - All of the previous examples are translated to the query URI: `http://localhost:12345/northwind.svc/Customers()?$orderby=CompanyName,PostalCode desc`. - - - -### Projection - - The following examples show equivalent queries that project returned data into the narrower `CustomerAddress` type: - -- Using LINQ query syntax: - -[!code-csharp[Astoria Northwind Client#LinqSelectClauseSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#linqselectclausespecific)] -[!code-vb[Astoria Northwind Client#LinqSelectClauseSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#linqselectclausespecific)] - -- Using LINQ query methods: - -[!code-csharp[Astoria Northwind Client#LinqSelectMethodSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#linqselectmethodspecific)] -[!code-vb[Astoria Northwind Client#LinqSelectMethodSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#linqselectmethodspecific)] - -> [!NOTE] -> The `$select` query option cannot be added to a query URI by using the method. We recommend that you use the LINQ method to have the client generate the `$select` query option in the request URI. - - Both of the previous examples are translated to the query URI: `"http://localhost:12345/northwind.svc/Customers()?$filter=Country eq 'GerGerm'&$select=CustomerID,Address,City,Region,PostalCode,Country"`. - - - -### Client Paging - - The following examples show equivalent queries that request a page of sorted order entities that includes 25 orders, skipping the first 50 orders: - -- Applying query methods to a LINQ query: - -[!code-csharp[Astoria Northwind Client#LinqSkipTakeMethodSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#linqskiptakemethodspecific)] -[!code-vb[Astoria Northwind Client#LinqSkipTakeMethodSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#linqskiptakemethodspecific)] - -- URI query string `$skip` and `$top` options): - -[!code-csharp[Astoria Northwind Client#ExplicitQuerySkipTakeMethodSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#explicitqueryskiptakemethodspecific)] -[!code-vb[Astoria Northwind Client#ExplicitQuerySkipTakeMethodSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#explicitqueryskiptakemethodspecific)] - - Both of the previous examples are translated to the query URI: `http://localhost:12345/northwind.svc/Orders()?$orderby=OrderDate desc&$skip=50&$top=25`. - - - -### Expand - - When you query an OData data service, you can request that entities related to the entity targeted by the query be included the returned feed. The method is called on the for the entity set targeted by the LINQ query, with the related entity set name supplied as the `path` parameter. For more information, see [Loading Deferred Content](loading-deferred-content-wcf-data-services.md). - - The following examples show equivalent ways to use the method in a query: - -- In LINQ query syntax: - -[!code-csharp[Astoria Northwind Client#LinqQueryExpandSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#linqqueryexpandspecific)] -[!code-vb[Astoria Northwind Client#LinqQueryExpandSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#linqqueryexpandspecific)] - -- With LINQ query methods: - -[!code-csharp[Astoria Northwind Client#LinqQueryExpandMethodSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#linqqueryexpandmethodspecific)] -[!code-vb[Astoria Northwind Client#LinqQueryExpandMethodSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#linqqueryexpandmethodspecific)] - - Both of the previous examples are translated to the query URI: `http://localhost:12345/northwind.svc/Orders()?$filter=CustomerID eq 'ALFKI'&$expand=Order_Details`. - - - -## Unsupported LINQ Methods - - The following table contains the classes of LINQ methods are not supported and cannot be included in a query executed against an OData service: - -|Operation Type|Unsupported Method| -|--------------------|------------------------| -|Set operators|All set operators are unsupported against a , which included the following:

-
-
-
-
-
-
-
-
- | -|Ordering operators|The following ordering operators that require are unsupported against a :

-
-
-
- | -|Projection and filtering operators|The following projection and filtering operators that accept a positional argument are unsupported against a :

-
-
-
-
-
-
- | -|Grouping operators|All grouping operators are unsupported against a , including the following:

-
-

Grouping operations must be performed on the client.| -|Aggregate operators|All aggregate operations are unsupported against a , including the following:

-
-
-
-
-
-
-

Aggregate operations must either be performed on the client or be encapsulated by a service operation.| -|Paging operators|The following paging operators are not supported against a :

-
-
-
-
-

**Note:** Paging operators that are executed on an empty sequence return null.| -|Other operators|The following operators are also not supported against a :

-
-
-
-
- | - - - -## Supported Expression Functions - - The following common-language runtime (CLR) methods and properties are supported because they can be translated in a query expression for inclusion in the request URI to an OData service: - -| Member|Supported OData Function| -|-----------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| -||`string concat(string p0, string p1)`| -||`bool substringof(string p0, string p1)`| -||`bool endswith(string p0, string p1)`| -||`int indexof(string p0, string p1)`| -||`int length(string p0)`| -||`string replace(string p0, string find, string replace)`| -||`string substring(string p0, int pos)`| -||`string substring(string p0, int pos, int length)`| -||`string tolower(string p0)`| -||`string toupper(string p0)`| -||`string trim(string p0)`| - -| Member1|Supported OData Function| -|-------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| -||`int day(DateTime p0)`| -||`int hour(DateTime p0)`| -||`int minute(DateTime p0)`| -||`int month(DateTime p0)`| -||`int second(DateTime p0)`| -||`int year(DateTime p0)`| - - 1The equivalent date and time properties of and the method in Visual Basic are also supported. - -| Member|Supported OData Function| -|---------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| -||`decimal ceiling(decimal p0)`| -||`double ceiling(double p0)`| -||`decimal floor(decimal p0)`| -||`double floor(double p0)`| -||`decimal round(decimal p0)`| -||`double round(double p0)`| - -| Member|Supported OData Function| -|---------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------| -||`bool isof(type p0)`| - - The client may also be able to evaluate additional CLR functions on the client. A is raised for any expression that cannot be evaluated on the client and cannot be translated into a valid request URI for evaluation on the server. - -## See also - -- [Querying the Data Service](querying-the-data-service-wcf-data-services.md) -- [Query Projections](query-projections-wcf-data-services.md) -- [Object Materialization](object-materialization-wcf-data-services.md) -- [OData: URI Conventions](https://www.odata.org/documentation/odata-version-2-0/uri-conventions/) diff --git a/docs/framework/data/wcf/loading-deferred-content-wcf-data-services.md b/docs/framework/data/wcf/loading-deferred-content-wcf-data-services.md deleted file mode 100644 index c310e6e54d614..0000000000000 --- a/docs/framework/data/wcf/loading-deferred-content-wcf-data-services.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -description: "Learn more about: Loading Deferred Content (WCF Data Services)" -title: "Loading Deferred Content (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, client library" - - "WCF Data Services, deferred content" - - "WCF Data Services, loading data" -ms.assetid: 32f9b588-c832-44c4-a7e0-fcce635df59a ---- -# Loading Deferred Content (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -By default, WCF Data Services limits the amount of data that a query returns. However, you can explicitly load additional data, including related entities, paged response data, and binary data streams, from the data service when it is needed. This topic describes how to load such deferred content into your application. - -## Related Entities - - When you execute a query, only entities in the addressed entity set are returned. For example, when a query against the Northwind data service returns `Customers` entities, by default the related `Orders` entities are not returned, even though there is a relationship between `Customers` and `Orders`. Also, when paging is enabled in the data service, you must explicitly load subsequent data pages from the service. There are two ways to load related entities: - -- **Eager loading**: You can use the `$expand` query option to request that the query return entities that are related by an association to the entity set that the query requested. Use the method on the to add the `$expand` option to the query that is sent to the data service. You can request multiple related entity sets by separating them by a comma, as in the following example. All entities requested by the query are returned in a single response. The following example returns `Order_Details` and `Customers` together with the `Orders` entity set: - - [!code-csharp[Astoria Northwind Client#ExpandOrderDetailsSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#expandorderdetailsspecific)] - [!code-vb[Astoria Northwind Client#ExpandOrderDetailsSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#expandorderdetailsspecific)] - - WCF Data Services limits to 12 the number of entity sets that can be included in a single query by using the `$expand` query option. - -- **Explicit loading**: You can call the method on the instance to explicitly load related entities. Each call to the method creates a separate request to the data service. The following example explicitly loads `Order_Details` for an `Orders` entity: - - [!code-csharp[Astoria Northwind Client#LoadRelatedOrderDetailsSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#loadrelatedorderdetailsspecific)] - [!code-vb[Astoria Northwind Client#LoadRelatedOrderDetailsSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#loadrelatedorderdetailsspecific)] - - When you consider which option to use, realize that there is a tradeoff between the number of requests to the data service and the amount of data that is returned in a single response. Use eager loading when your application requires associated objects and you want to avoid the added latency of additional requests to explicitly retrieve them. However, if there are cases when the application only needs the data for specific related entity instances, you should consider explicitly loading those entities by calling the method. For more information, see [How to: Load Related Entities](how-to-load-related-entities-wcf-data-services.md). - -## Paged Content - - When paging is enabled in the data service, the number of entries in the feed that the data service returns is limited by the configuration of the data service. Page limits can be set separately for each entity set. For more information, see [Configuring the Data Service](configuring-the-data-service-wcf-data-services.md). When paging is enabled, the final entry in the feed contains a link to the next page of data. This link is contained in a object. You obtain the URI to the next page of data by calling the method on the returned when the is executed. The returned object is then used to load the next page of results. You must enumerate the query result before you call the method. Consider using a `do…while` loop to first enumerate the query result and then check for a `non-null` next link value. When the method returns `null` (`Nothing` in Visual Basic), there are no additional result pages for the original query. The following example shows a `do…while` loop that loads paged customer data from the Northwind sample data service. - - [!code-csharp[Astoria Northwind Client#LoadNextLink](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#loadnextlink)] - [!code-vb[Astoria Northwind Client#LoadNextLink](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#loadnextlink)] - - When a query requests that related entities are returned in a single response together with the requested entity set, paging limits may affect nested feeds that are included inline with the response. For example, when a paging limit is set in the Northwind sample data service for the `Customers` entity set, an independent paging limit can also be set for the related `Orders` entity set, as in the following example from the Northwind.svc.cs file that defines the Northwind sample data service. - - [!code-csharp[Astoria Northwind Service#DataServiceConfigPaging](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_service/cs/northwind.svc.cs#dataserviceconfigpaging)] - [!code-vb[Astoria Northwind Service#DataServiceConfigPaging](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_service/vb/northwind.svc.vb#dataserviceconfigpaging)] - - In this case, you must implement paging for both the top-level `Customers` and the nested `Orders` entity feeds. The following example shows the `while` loop used to load pages of `Orders` entities related to a selected `Customers` entity. - - [!code-csharp[Astoria Northwind Client#LoadNextOrdersLink](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#loadnextorderslink)] - [!code-vb[Astoria Northwind Client#LoadNextOrdersLink](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#loadnextorderslink)] - - For more information, see [How to: Load Paged Results](how-to-load-paged-results-wcf-data-services.md). - -## Binary Data Streams - - WCF Data Services enables you to access binary large object (BLOB) data as a data stream. Streaming defers the loading of binary data until it is needed, and the client can more efficiently process this data. In order to take advantage of this functionality, the data service must implement the provider. For more information, see [Streaming Provider](streaming-provider-wcf-data-services.md). When streaming is enabled, entity types are returned without the related binary data. In this case, you must use the method of the class to access the data stream for the binary data from the service. Similarly, use the method to add or change binary data for an entity as a stream. For more information, see [Working with Binary Data](working-with-binary-data-wcf-data-services.md). - -## See also - -- [WCF Data Services Client Library](wcf-data-services-client-library.md) -- [Querying the Data Service](querying-the-data-service-wcf-data-services.md) diff --git a/docs/framework/data/wcf/managing-the-data-service-context-wcf-data-services.md b/docs/framework/data/wcf/managing-the-data-service-context-wcf-data-services.md deleted file mode 100644 index ebd7b8f40a586..0000000000000 --- a/docs/framework/data/wcf/managing-the-data-service-context-wcf-data-services.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -description: "Learn more about: Managing the Data Service Context (WCF Data Services)" -title: "Managing the Data Service Context (WCF Data Services)" -ms.date: "03/30/2017" -ms.assetid: 15b19d09-7de7-4638-9556-6ef396cc45ec ---- -# Managing the Data Service Context (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -The class encapsulates operations that are supported against a specified data service. Although OData services are stateless, the context is not. Therefore, you can use the class to maintain state on the client between interactions with the data service in order to support features such as change management. This class also manages identities and tracks changes. - -## Merge Options and Identity Resolution - - When a is executed, the entities in the response feed are materialized into objects. For more information, see [Object Materialization](object-materialization-wcf-data-services.md). The way in which entries in a response message are materialized into objects is performed based on identity resolution and depends on the merge option under which the query was executed. When multiple queries or load requests are executed in the scope of a single , the WCF Data Services client only tracks a single instance of an object that has a specific key value. This key, which is used to perform identity resolution, uniquely identifies an entity. - - By default, the client only materializes an entry in the response feed into an object for entities that are not already being tracked by the . This means that changes to objects already in the cache are not overwritten. This behavior is controlled by specifying a value for queries and load operations. This option is specified by setting the property on the . The default merge option value is . This only materializes objects for entities that are not already being tracked, which means that existing objects are not overwritten. Another way to prevent changes to objects on the client from being overwritten by updates from the data service is to specify . When you specify , values of objects on the client are replaced by the latest values from the entries in the response feed, even if changes have already been made to these objects. When a merge option is used, the cannot send changes made on client objects to the data service. With this option, changes are always overwritten with values from the data service. - -## Managing Concurrency - - OData supports optimistic concurrency that enables the data service to detect update conflicts. The data service provider can be configured in such a way that the data service checks for changes to entities by using a concurrency token. This token includes one or more properties of an entity type that are validated by the data service to determine whether a resource has changed. Concurrency tokens, which are included in the eTag header of requests to and responses from the data service, are managed for you by the WCF Data Services client. For more information, see [Updating the Data Service](updating-the-data-service-wcf-data-services.md). - - The tracks changes made to objects that have been reported manually by using , , and , or by a . When the method is called, the client sends changes back to the data service. can fail when data changes in the client conflict with changes in the data service. When this occurs, you must query for the entity resource again to receive the update data. To overwrite changes in the data service, execute the query using the merge option. When you call again, the changes preserved on the client are persisted to the data service, as long as other changes have not already been made to the resource in the data service. - -## Saving Changes - - Changes are tracked in the instance but not sent to the server immediately. After you are finished with the required changes for a specified activity, call to submit all the changes to the data service. A object is returned after the operation is complete. The object includes a sequence of objects that, in turn, contain a sequence of or instances that represent the changes persisted or attempted. When an entity is created or modified in the data service, the includes a reference to the updated entity, including any server-generated property values, such as the generated `ProductID` value in the previous example. The client library automatically updates the .NET Framework object to have these new values. - - For successful insert and update operations, the state property of the or object associated with the operation is set to and the new values are merged by using . When an insert, update, or delete operation fails in the data service, the entity state remains the same as it was before was called, and the property of the is set to an that contains information about the error. For more information, see [Updating the Data Service](updating-the-data-service-wcf-data-services.md). - -### Setting the HTTP Method for Updates - - By default, the .NET Framework client library sends updates to existing entities as MERGE requests. A MERGE request updates selected properties of the entity; however the client always includes all properties in the MERGE request, even properties that have not changed. The OData protocol also supports sending PUT requests to update entities. In a PUT request, an existing entity is essentially replaced with a new instance of the entity with property values from the client. To use PUT requests, set the flag on the enumeration when calling . - -> [!NOTE] -> A PUT request will behave differently than a MERGE request when the client does not know about all properties of the entity. This might occur when projecting an entity type into a new type on the client. It might also occur when new properties have been added to the entity in the service data model and the property on the is set to `true` to ignore such client mapping errors. In these cases, a PUT request will reset any properties that are unknown to the client to their default values. - -### POST Tunneling - - By default, the client library sends create, read, update, and delete requests to an OData service by using the corresponding HTTP methods of POST, GET, PUT/MERGE/PATCH, and DELETE. This upholds the basic principles of Representational State Transfer (REST). However, not every Web server implementation supports the full set of HTTP methods. In some cases, the supported methods might be restricted to just GET and POST. This can happen when an intermediary, like a firewall, blocks requests with certain methods. Because the GET and POST methods are most often supported, OData prescribes a way to execute any unsupported HTTP methods by using a POST request. Known as *method tunneling* or *POST tunneling*, this enables a client to send a POST request with the actual method specified in the custom `X-HTTP-Method` header. To enable POST tunneling for requests, set the property on the instance to `true`. - -## See also - -- [WCF Data Services Client Library](wcf-data-services-client-library.md) -- [Updating the Data Service](updating-the-data-service-wcf-data-services.md) -- [Asynchronous Operations](asynchronous-operations-wcf-data-services.md) -- [Batching Operations](batching-operations-wcf-data-services.md) diff --git a/docs/framework/data/wcf/media/wcf-data-service-item-template.png b/docs/framework/data/wcf/media/wcf-data-service-item-template.png deleted file mode 100644 index db28963ad62c8c1480853cbc6e27bf30c369ddcd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30553 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 diff --git a/docs/framework/data/wcf/media/wcf-data-services-overview/windows-communication-foundation-data-services-architecture.gif b/docs/framework/data/wcf/media/wcf-data-services-overview/windows-communication-foundation-data-services-architecture.gif deleted file mode 100644 index bebcbc014338a84113e7b9029ad2dc4e42297db8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25542 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�*FGd zCDHjxjDhg}kOS#eo%>!tKGn@vb|fx=`AXDY*0SI>($Vf=wPSqi~Q&72wBu*XDoTV*pGiYvMUIAO~5vcjD)Vnm`Ez zK!?d^2v1;sn}~#vsCle52}h`G8i+nU*gcLAc&;`EPvCe-(29ka1kbl>nb&z3=z_FJ zdi4j2Oc;M6*ni)XiePAMUC2EE*lVolim;f5ndlFOFoKs*d%QOZIgo0Eh=hfhdFM9? zQb>QjR*c$njJzg`x!8=F5vZ7=QLxe#imgTomv9O8cL_-_f87Xr6}V~>n2AJKgX-6eNce_hu#c|>j@l!P!?Q=X9%Pa zdY|`@{s51ArwNzvfzCLTo`;08sDkE~Y^At;@^n5N`D$*sfO2qpe7I_a*NYCRYG1jK zC`oz*KzJ>gkpbC}9w~;sww2`9mCTruBWMR($a@KBk4oqdIdBP+K!}A%e@W1nvi6Z7 z8Eapef}`ku^;m+{xN4-pf4InuA4rh#7n!d%nW{E}uvV2k_>bO)iUQecR+xO6d67?G z2v|swO=y3bkOR86iH48_6FCN#KzY`;ju`1`AIT3{>1wVBfhZV#$+nLTscMvfgTMBh zi5Y9BX_KmUmM&?JnwJDX`HJm0g_mi2n!uW$$7_iHIfk+}26mu{ib#S6S%b`Io`!&# zbNHT;mjjfbhNKsV{O6vS$!e59pS5Y2u?Cv{c$MZ8oWemaldR=lKNg*L-5xYe4y+J?WYqx|6)NnyHqc)_8gj8kp*s z1l*{cHcFNaTA`GXkiIsazgC+$YK=Y0ocQN>n!taxNeP6|8(EsDx}v0Mfijr`m4Jx$Igj%v zkE8&hyho0e$$Lu4jKm6*uBvLzxvI6gr^e{4&suJ<8a}d`J&ii8srH-Mx@wh5ozF;o zE@*%D=MTgRr*KNF?w730SgO>*QF1@cM4m3O?5goU}Tx+?ubpr)qXEf7I!ha&VHh zr+eqRsg_E9d&jQHw}sFuuk+e!KpL^s+K*f+npnxNtj3$8w`?@paQg~tV~_)x_j~~x zo1J-im7s(NTbW~Ed=tsAo7kJI)~we5)}uaZt|_{66MJpcsCy2Ivp9IJ*5;`WYi;%V zJ@?wJ5xA?)7@o=Yu>=>gV~2e5SZy|2ZF2CPV-SlwTXQ{YZ5@k*h{&~G`);0UZb|Ds zORKS}wvekv3FSAKav-8>d4`e@p43+fk0*YeC!?50v+jzhZd-CBo1Vl7ms*RK<~pZ2 zPx(9{Vn3nP9r;J*-wVJidmXg)zhwgZUPe^#=sJu)$yLXtl znR{)NaDCvKyoJb=&8xHKy1hsLD7`o+34@8W7Hg;&TcE`2j*hpo=1Q_Q`FIm}k9b*~ zOemDacb9y-tP(4x6uYg8d%V?Wu+PVm$a$#+{Jx#nhtvzP)n>cXsfGjWy>Qx+D#@<4 zxxlk1xKw$*v6{Z+!?a^+u25TA(MLyvo*#>}tUXjEiuK zxemN+5L}lPc*6%w!NXd@(^;{m2*Tte!nVhxw)c_~8K~&0rVL!2k2r+$XML47f0{6a zviXfNOtCb4oI#wxez}7GO2m~H#YdZLVY_TG8Nn*bu<92HY0R$FD2ZE`w@7T2I5nEw z!wb^dYLmcukcfQbD|(&(Tcu~1f8qIv^*eoXP`@I$!eQz?g8aX$HpahZoJe?*DR_}M z_@>F1e-}9hIq7Rr@O7rj3gwoz(5HKzOv?K>38GA-BxuTtoN8lhzDZ1=<&z4otjYdR zbpJQZnrzJ8GYgDI%>G~l9?TETd~F$8bF+JGzW2+2j6MMndzyRz;s8F~Ow8a6KDvNv z#GHNKlMCovv^Z&UcAUz}_5eQT$83c@fJe+d2R`|%$@?6PK={8WundT|J;E@^&iram zhjAYa%((`8|9b$e>~9cFu@WtE0-y+*>;lou4;rV@3EgWC0Cxkr&FJF`$PBMhAOLjkMXl1$Mm`C^ z3Pz2piXZ^>96nDS)jjPGwN}t2eb4DL3#GscAYH3lAOPAoK42}@(^}SNJw6GL(bIYY z&Q{gp^VaR0)&6h-E^v4Wr^M*v2yJ!%-rSKb7t)Hb*M@-ET^(KQGYi5{3IY%Ss=eB*-P*4G+OQqlv8@XUAk*k$ z+Ndqty1m=H4coMB+vhV2xL^pW-P^`}+_9Yt2>{vVGu*|E+|V7}$DIqlAljkn&_9;l z+HJ3Xz1`mb?cMkK-QwM1;XU5w9b)Bu-s(+Z>Al|W?O@&g-trA%?LFW2T~qaa-}?PW z`7PYUE!_al+rPa&{{7qme&DV>;Ob)lr;XseEdZq;3_vYD2H*>q=HR-m+{|4*1&-l+ zR^9GX-@>riVCvY2jXonj1eEQTCcfd|GYgIo01sdTj9qavZ~#MK)})5oE}#flJ#e3m z0+)^ABo1#UU<2Bg027YB*v;Y7HrA-h)=rKBP_C#_PCm1c3qw%jHKz#sw&dYhZ$I8~ zi4XvEEplO9~S~fT$c!juz0`Tbhdu!%KmawZR*5MKI8n&;ru<_9?{>I&aBL>eD4Avb?YvGtgzwY;Otzd2&JCyP3Ho_ZmsbRKAG&yzuEA_ zOtoOB&fQZAYTkC|E_Ddqapi2!q#eTRtEdvM$s@1p!fx>$S@K=Z>ukI5VH~k45A!eo z-*$;`@)zHBF>i9L%RR2^@G}puIX`wa?>#6#j6vUVJHI_WAMro0tw&FFLtpVXKXy;= za7nK{OW$h5CkOI8aGtDcQv0xk`)-_P#5~*dtoDo!*m=ykyUd5CGudlV&pk!&YmYd| zy2r<{?1^} z2ycI%YM^_46zmVA@Wq*lh^h-~bH6=x?|glGh|<=~M4&>S})&xvnOg`Ta}#LudQAzl6&t3BP!a=h*l~3=sbOMT$f! zlE6rYa!e8^$B;jV{wC${XGo4fj2Q(6;MdV(M@NY?jwDIaBF2Q39xn7Zh7v|YW0I7l zNs{A7k0EPjq%_7KOMyvdwxl#Mqn%0zcVbNB2xrGqik4;+TG5~(QgXDCdRP^!(y9J# zKGhl4>{3Ogp051};K)C?ap6vY#FlMYnh_~gx-{mZKZBPv`IA&hCIN|Za@dh{66Rls z4=*G4@XTFw~WmLnQRzWH@dk*%d?Oly~|Te))SS|=Ml??VCy9ShEJP|g#9h!G}X zOz|OKGb`LHzv6*Mrc>bS!RyX@wwOGW5tqU4G4{Ha8fC+zrZ5(0dxa128( zK}-`(V(L$hOANVCImwa)O(L#T%^Q7kH_ zdP2%yKYd73ur!H;()BW=sm_n?oJv=WO2z0@Xi4nVEJG~KRv=1-MNutA`AIapMGrM` z*XbrR>s55yb?#bsPh{33XXBlYU3+UX^w4p&d(m7+^9`%kb>S8G;EeD^*sOV>l4{|1 z*E)CMePQf3u5w|V7~*yn=Gb13KVH@;4j&eIsgNPASjCH740q#`%QQIVj%TKMq=xya z_h#2@=6Gf9TK*?v6=CMtPoIyLF6E2z2(x8gYwo)5y~~BX{TYIn;cUn|3IW){o90A(30GXV z6^&a(0|MxKGaGVYEAq+Ds@!l^`WC=|wS3{b?gPZRe3_dcz-95PA6GG#12PXw7RA|u zUG}MHw@ZK->b5}_ws=7y?;%#VJ@%7N2mthOTVEWP&T+44hUM*oUi#^)XUmrd>K=mR zwRAzAYefW@#d^9=PQ;MK8Gjq@_I23;`;vyJ-7fj*C&_;6W)VPeu5CdV=L?P(vF!4vPlR#Sj1}yAvD$1*I4vcev<9>4kBOWwZ`21n_{e{cH%jK%uz;kci%i z>;#DrKmypB1=V5Ucj?l#$6Y)q$MpBZKq+}&6X~`i3pcH^x+#(zK zfJ=r_l%uRMG61~pd@80C;0#r=)w_yw2lE15CB%l!j-#xqzf`>h&qPLlaAyi zC1rtvJ~9uBiNs<@41fzqL{pm6q-Hg(c};BpVv`rj+#)oy`Au+!)0*3CrZa^hPIOum z7u-Z;D$@DRX{LgfjCv+KuPKaRmXn#~ibRGljOrRYXI`caUERHPT}=txa^Qk14trFJRlN?rO=n8wthEtP3a zZF*Cj!iWnuYZk;R~-NVNJLiuvXiB3Wi5MI%w|@zo8@e0J^NYEhE}wrC2eU< zds@_{HnLoBzyyrS*cJtW2NR%eZEbs7+~!udyX9?fefwMB()Jb3AZ~Gudyn8ISGmij zEeM$VT-9r z10e&R@I;)m0N*|{8qq{3bfqnQX+r}cA2{}}j`#d&P?uN%tMCL6v~cMS2pY_U#&oL- z0fbY);sV*F0W3~IX;Lo&Rorc z&MSQinFm?bZtgC!mwjnaWFYAv=Cq7G{SO6r;^~C|g(q6n=Rap4(I9s<5fXh0M$_Wl zKW95*6>tGhh@I@Z#x$ZAeeNtEybwf~y3(N?X70j*<%K>)&*gh$XeW8ea9PFR_x|T> z(_QkI)`FrN-S@T|TLH8XJKZZk_C#-;?nE#=S4$3f?$UtetGKTZ*qwMRXQ$}8Zg$$K zEthG_nbC63^`SlgG4IS1JLN9lH@W?d`Ru%%)UMEbrIAnar3)O=T9CMXNfCYjnmNPS z(RZc!E$jJK+Y`)hwH7j<@!+fZ+mw&>zvBycToXaNr$70NX`Xoh;yF7+aD~Vd>}PO; zI(bXKEmMFDaJ)irg_sjCWMjSTqQ4&tFZ}DTt6Q;JYd$Slh0-Iy9`l4tQ@H2jFbM21 z#G63HdocraybR<(AIm#S0|f`{u@U4k*E7K@%d!{C0#9%}AlN__{4f{vJ|A?k8LYAE zvqApSz8+Hmy(7IJY%ve4G%XlHBE&w_TQN?60VM1%{j0Ir6T&B4F}?G;A}c~7#DXp4 zuL|U`EZ92#G7Lixo4Z1Q1tv2?7Rv-|@U=8lvLB;`7lgwP>%Kw*f;zOq`dhIYOhf*P zz3$3{O;E5)bHDnE0aa)OPKd7$$wCV zPRNdXgo_v;1@?MGS!6E)c!WoMuad0CA44|cyR=g%#=l#}4#Pt|Oh!J`u95r)Rb)k1 zjK%=t#gC-Moje3={43QHw+xWP^_E}$Kf)}rh3v3VOiWWm%CwqD*fg;J zHQ0c)tW0V=P2>Eo3%oQS=*;bEge)sb%7lxN?8!&`2h*HRx!B1V*nsyUNTIY#PHY5U z?9RVzF`I^ld9XK4d(b;6I+|;lbpwIavfW%XR4)xMQxXvdFLI|BNCk;OTSQtn9 zs?bA#(;Kx?67$MO$V%AS(iQ_#Xj1|PO*0yRML<+9$0NomrO~>?(Hw;fX*`5ZFjFn< zQ6J+|8S_(6)4L29)bzT5OOw&>qS8dA(>d)fJ!LUU6){WwG?aWbP5mxTwKV(!)lr?* zMcuAaU9nS*uvAskN5Dnwe1sjvuLpI72GhhA=|)`KMETkTaQweZ!!J(QzD$5dR{Tq2 zUCTe!ucu_PT=lPA^)6001eTOVACSgN?9xu~MqiA^p|nf-$^uV}iwdn!NPQpo^e#n( zi%x(>4)p;l*Z^pp*A3_dUzH0^pw<@I*93!COZ!ALyVVlw*8cj|?_$aSQCPf3Ojm#_ z(75~uwTv$)?K#Wb1fSGMNBjp$R0U4#PF0}MMi|RX;Kl9ZghtrDe9eTqTmfwC$qbv# zi`-CN#KunOgkFsSnpIhzB+dkDQ%j3ME`!()lUV+uSnp!Vp+!nO{fCN#OKSXB^~!<= zEd(i*%NPL0f878dD9M9eff(3GjfKuf7zOm=Pz=C;_@si^q{e)0geBupx$psS%uL@jyxgbl|C9_fSolJLi*DT%1d(79m z^xL=qT)Bh`!0pb)ecJ%LNLt*>zKTHKV>9@F9P%0x)bglmn9O#oKa+`dfIE~Yg!{}p6k)kwM61W1Ksp6u1_G*dt> z}X13iIV6i{)1Jut2pm_S|JX<}qgeF=4bcU4G{K zdeut1;cBk2Ywj^zE`(s_W(HFLLG3V2Y-e{)wZ9`;cW&ok4d5^x;1(-qWJYHWd(lb* z1?JslR8RtfE@*-#MH#~agEnXaK-h@AXCTu-rrc)#ezvbKG&G0RF#haM9mrZ-h3Fo0 zx)+q?ir%mtOt^)suYi7=-Rw^<$VnF)=MtlVm3u+&E$KHqX-iYUX>O5Gt7$y8*Vju- zY^c|V?o)jJhb*9I^}2u<{=k&R=@wf*s3W%vSZUl7KUa|9jD8=fc2AUxbWvnQ?$W! zRcqU7aq|SMhHEc`J8Zk_T&ujh%K`<^OdufXxVXQE?C63`D+g`0rlc>z{s(WaY(!%; z)^2Uqb_GQ1y|jkxJbOE#le5RZfK=wX0c?@~BTUAZ&MsQm?Uz&Q%mrz0gItI!wdR{V z%7e8grtL7yIvGxDdP7V_ENaniI0STs3jo^>%z($vu5pH873AzVBemBCz1B9jo|f*m zqk*<&HXta5UMt10ejBa6YnU532Sq?osNwPcMdaSRr$%YPhHnLr3se@p4XC;;RDyV5 zG}zWmOXD{UZZ9u$_}Xj#6YT3B<8m`^^S`n)69nxwCv!Ki^X;Oz2@LKz zM`}Co^XD9DXv6X`=W{TuhgVA^g_Qe{8MuvV{=FEb2yhVIiGYouXIj_ z3p^JwJ=b(X?{rd+MnLZ`LEm#mFZEJKbp8_a=iPKxH*`qXRlnY2S)X-3zjXe}^jIHt zU9a>{--l5D^;HjcPOmcmN_9~`c4T+-5`=Yb&Gl!m^IDhmCZqIfr*b><^=Sw8ZTIsr zYXO*cGHnm{Aa8^kV0L3i)ka76DQ_=D&vt5uclZ(kMc9G|*mr*KcYptPfDd?qA9#W< zc!Mu^d4Pk1UwDRZ_)?suXu~Uc!o~|MKJDSgM|lhBt-~$kso=IFL{$c zd6Z9im0x+5Z+Vx0d65*cmQJ4g8;~*x!-%f2OH%Pfl!-)^yz!TFMOJLfG7yH1DG1aZ+yo` zmqa)K#bb8){-6ko&)^NMfE0h|emfYJB%2mTQ(Xz(DygbEijZ0L~Sfkgf$Qmkn4BF2mwH*)OAQO=koNyf;T zn8Q#cJCyv9lH^a5zexlPxg;==z!QHe{ZXmMr@%xQKdjNJA?qnWzQ=%&;xH?YjH!MaF6nF1^c!g3TifZGsA;tgxahya5Y5 z@TVuR;zqp*C+kHg3pL_Jqi6g}FvS&HjGMt{AgeIPkEXD~LZh6!Xc=w@aKObWtGqHs z2cR(j&c+?f%qRg19TLH#>7w9*4T|{uGtfZ`Jv7lp8+|m=Nh`fH(@i`5G}KW`J@wBv zxPXEH^Ul2WqBSdYbE_IuV+q-1n|(IgX{)_9+iko3Hr#Q`JvZHT+kH3Qd7sUS)?E9I zsMiUB9kvFA8-6(Ai7UQ1#e)~I_$B_K0EET+kQLlx$C|=>L>)@M&F)q9XLXR_Zxr<>$1E&^8(M1hybj_ zEPThrA7p%@Wk{@i^WA&T?hLGGOufw38-zWz4*>i<`|T4e%NgWX5Bj3jOzb}X`I~D0 zaG~-iY<@w|w+~z?LVpH4;FF>dfa&?~TL2`80JXs>1X8eq?vaHy8c44P{zHJ4K$!(Y zD8jwiAbuJI7Y79x0Pc;jg)Y>{2?B6J6w)tI0eE3w(1XM8$#90tN@3^_bwdQUsZCbO z2qi+Z5nq)BG;l$aURu*8Gj&7~W}3_nFVaIFCJTs)8sY(`QW`0VL`9?8%1<RrxGragdb5OiAiW;jy!RYiaKM* zB;@v>^pIGX}C4;t30q!%-&j1WI5=H5Ac`CSN3nRp#LTCa9DI zDO3cN=uko_l$fI&C}B!H=HLlWpdxk*nI`1O!49o-%y=F|6hl<$34*auFo#(|PIi)2 zpA=#!NAs9SJfSs9L6amjK@y8ZVhlMTg&kBB62Le}GTnI$K9Q0GP4)yZA@NnIDq@r* z*g;E8VP+i%^PD}A#+lFDWH(>+%|n6FfSb95CVcgmdX{GlZoDQ&B0*5;ux5~06xBY} zBhaIWWGTHQfGc6M71u12Fb7p=V;K6Hfwpv;5%pvZ!AZo<_)4UzX-at}1E?2Kq${Ix zWqKx3P!v6erjh6+MIzCi3lS12zEaUmvvZsbc?ml_9A!u&WjXN7>kTXkD#(6 zMeb$VNUgl9R0DB{SK`KL#>(-@B+3sGtQ( zxH6WrtmQ3pxyxSuGMK|G<}s7G%w|3_n$xW2HM1GZUckb%pd4iuHwp`=Kt(Nlu!BAG zxzB$7GoS-4=s^>@(1t!Vq7$v?MKik5j(#+x_q+#D1cCr9(1Dy+OyEX^LJ6p#LO((+ z>QR%r)TTZ)s#C4%RkOO)u6{MFV=e1h)4JBSJ~akvk)%u;O30yrK_J#}>tPeS*v39K zvXiasWrunPyUw(bl~4<2Q@h&MzBabAo$Om+!wArpvYmzht?hA>yWHkJ_p$dNEje=- z6+1vTyyGqJdBb}HDq#0}jerVz^Sj^v{`al-z%MA1*9)QmIKmUI@P%Uo(?BM#65hS= ziBr7d<=#Mn1q^YCTRhgc*z+xhjR7Bsf(qh(H3l$HYYc!~)@um)s5j7YYh#???~VA( zW4(b|h@uuNfO)A!ad1^*;L|&xbgZcWYFdk81C*XNtZxwqQWGHO)UNr%Z_aV6vw8y( zzXd9UO@$3OJ=A0u1}@qS~y+Udsceh{m%7QV_n4?AAPI6 zF6ub=pdULBb|64qi(0(?7Ap4v)J5%VJ&Sq|!7jS62@nXhqvG%Tc6%JAj)6S{2m_Ds zI@s5+hNX-8@WppF&->x-HN;-~#&^BUsqp*EC%zwXIJhWK5eF*x;1G^4JnFli@%x@W z{;F1e+YgR`rlSJ=Lw`j3t$@st+786Q1`t5&1p?2d-@9dAKTyH6)dHxw9X6a?5;$Gc zp&cpkp5Zy&&VgUE4d4!hUj%~M2=+rDz+csYozQV!-VI$NtN;}No&BX+=^aWC<=~+h zfeNTV3K$BGIGmw`!i~gPxYS<_o*Mr3g9H};UE#Ui;jKUt?A-vG+8R{d2I$$I1>f6+ zUD&-~KR96C(cYe^-2Mrm;nAMTfgl^6;2L$%04JT3q*hsC;`q8Ko6>benkK(^dJmC49&C(680gf;a?28-U@_T_KCvO zg`wD0VW=@*sDWMH1wyE;fy#*?=Ruv@L0&5Ez!&y|?Fri>h#?s2-T=O#upM43hM@T! z+!bmbHozPn4js(JohB+_#(9AZ?1Ky_!8FPM#K=GkAWEhX0HZ|8p|rrg>425hzz;@% zBPxj(T$#7c*`_55&OPHM3ScGF!XtqHVkO9({t4hMPys6JoGE%@K5hWa#Q{CO;;7vM z0j#0h-2&MW-UHGj^U)*q<=?2C;3=*^J&Kz`uAv(WU>s!LEzqO?W#k4_0u9Qe*=1Y= z)WAN}Kuf-)w<$q80?v&j3OEiSHtd5A5F)?m00Bh64|-cDpn?$gn%1eLQZ8k@-Qc0@ zq^;P>P99>$Ibsjuq!Iv*poSth4*I_GkVS93lmb(UsyUe|P1 zr*@*{b(U6kZYOvuWp}RCcZR2V_ThNih!LJpd72s>G{ZCq0F2Eieb%Ra-Y0(Mr+zL& zGEl>{y=Q#tr+^M9f#N5B`lq!i12ot|fi|dv>L)Tl0~pBKb>gNMs6b;b%T+2&dy-l+ z2*8ISn6N~_7NEc~6a%$=XozYHiJB;iE*l*rLjcHv4TKo6D1r+JfGsEktX*df)Z`CB ziVB=dD5L-p_T&)aj1D;eTm-0q3}lK9IO()B>64DvXs#L^*a9mQ(7SAb0APZ$W$Bi} ziBWEh2vfx3KqbmUP>kmC;@J6rAuBV7BC_f$Uq9vq@C@< zUq(QnS}C0!ieai6GN_NhM8TIP+oRfOyGW{;8XFi0fVH^G0R+ICuG)2mLJOb*HoWFO zpn?(Dh&M)nAyOr*Ugc!QB_z6P1jqoYI!cH312o)EqzXW&4qLBUs=G*Pu-+OnxB$f* zfB?_|oVH3RsDMja5#CL%tf4n!*qbep2SBce3wscq_-dg?N0s=8Fn z0jz7WVZwP;%mXCqC)6oinZ<&dI4bWgN2eTq}ZjQc)_~u!&Uxel|3m8 zh$CR)YLJY~hFvMDr50S=mJV%1ZMnw*Ohd8pth*BJuoVLeq|5^}gZw>;4%i4z_G`ZG zLy;cJk|wDTra%NtOVl1^&MxX&8fU2$!@NEbOI;Fg5r!4Dhj7e*01%tmrVQK?8zw00 z#SHD!W}Vm`BH5A}HB8VG#gt>5g=Dox64=p7AZ{s1l6AaA01#W?s!Ze#TQYFh#VCR; z?5*kPtf^uDg2Z|RPnlFs>_lnUQEi;AD%sTIx<%#Q8t76kvDpI0R*dFyu7_*X6 z=nz98$5>IsK8ea+ysoY7?!_2ytPF}@9$Q^Y@vnxf=Ui7Nb%Zj=(@#f?UtvEudJ1? zg`MyHg)DY@ZmGF1TS(C@U9V;Y6Eg+VXCV{h>ThwN(j|1qMO;EbUB^ZM#zeGjUjT5d z2{2ofQxXK!sW@)|L$CUdt*R-oprn-dTChe;h-Br~b6iLNQp9QvMR^2mVZ_o9a|8*) znhAIR1W1(9hurXiu&^JxaKpkQ`-++jKS@v6#u2~T6@v$1XvLje6#=}-WPq_yoKX_U z@BPZbYLx_?=#^>^KuF}$Mr^UGCGke6Q$_qlXi$QRNP-<4MPb0yN=yPtghnZmgd`ZQ zTR^dL8nAaF@bvC)z}RuCb@6&sLQXt^WOXkV*#sv~1V)jFgdo0F+%wRV(6Aq5k_rz)`oP1Fq_(V{*>-gvNGHM za7Nffn5={zhX`Zj^F;8oDVKyBO~hcWayQRz?Q+Bzh}QgO$8y*~b9nJWtF!fPL_3$- zJ4aMJUj%Voh6bC82p9CQVRCHc03sgJ`*x~b6$KG{%2HVbPNP~EyHYw? zh$T@15L1L|T-6%+ks6_fCGl}=tr1wy7H(O!LAynqG!s}=Nj>$6mZY(XOi7ghaU2sg zI}>mer|%S(>oNC(`vS@&uo6<}RV?#FSNMccxJWx4#aHvhQ223S*nu-m#A%%WhjOH_ z7SXfCT=l8xG`uKv%rP}QJGB)Y)_ACOjD&|Akit@g6^G2#NR)&~Sdtw`f_AG0i%1ek8HX`7m9zYA)M+C_I$b5{hQAjg!rL{nI|Qc%-nz=&o?f;D4Dc+VCAIFWIix9kqv zdb>+|uOu;_PjSXDRA-3W`jv&$6MmxvEi;ur6!&c>RCXkYZx=Z1p0~TCcc~?KyDWG= zymu$HXEVscMa(y0gh?}5xQC~SB;bi^>;zE229+F@c)y5ChxV|&_<`U5nk`J2a-(nO zMgg27W880H7lYuAw%kTJavS)?*Z^QZa)SrZgQuD@R20S705TBUm#2)F6I&WQK+3oP zG%UBqv9_oo0|-@&EVMbX$@#_9Ihp4Q#vZFXt2Rc%d8nnq*%FM$78{{k%%Kz8#kwoJ zGI{O_dZ-}-<`T>h*m<#0dc|D2v3+?IP>iu4D5NvDr1!(7&UwJd0x~!&yP`V0s5+|` z+lPL-z!;3Z-fNS;u-~>?8VEq8yUPhYz^W%(um5_x1pBZfTQUg1L9^j4E4MFOuge0hZ_D!pK&DDNsZ;x_HN!H1|7ar2JH6Mt zz27^&=exe=y9=C{E%-UI!MnWgJHZ#c!QXqo2f)8qn=&jr3dq92N4&)6yDYFm03^f5 zk{+PLcd3^e7^DFvguKX)Jjs{*$ftk|n7qobyvS2S#$VgVv%Jioe9F(f&0~VgYg;ii z!_CV)%J=-t1H7BlU&kw(uCZNd9({5uJ-V?t7wxLDIa>{kqG?J!)t9ETDZ$lW+{U+f z(IcC^0p%K6rwWMuafbauHhtGW{ns0tKdvk*mgd{Uegeu0txVVeHvSERNr{tS^<3*a5L)xtI=ioPNJQqsPn-2P$ezU|-QxHa6~cTmP* z!R22Y1`q()uBGfRW%4ioAvV8KKL4U9f%IFOE#h0>7Jjzb+c#pv*e|8`FUo9&zj#Kb zqRb}lS6d*Uf36R9-r~})rl{0D9v`Mq&%a}KL_Vk%D zr$(4Ef8M->&1FZWOPOl?C{iTJj4)9aT}cI1M->~acJ-@7r&G|d-?O}t9L)X zeEsw)mN)kgSA|ZZ3uy%-{)4Lpx0s4xpaUIbF2SZ4tmwfC-->X-1})r>!-GOW<&gnF z;sg~6JG5xRx0Jx_#1>K1kf{}2oUx!3o05^n95qwn{}2&JQZPpxo6;dX9ZwXJDI(u9 zaziASQj*Cit0QF-A3=&?gBDCY5w^^{s6omKyNv70FdrNft}@MBvmh)8;Ka(1VmJg9 z#ZC+guEFeNQ!_l@(v#2T{A>!)K$+B`1yV4G6Dn0mfkA}`B%PGfN-e$g((5);K?zJf z{S?$tMg3IM9XlNr)l^j_)iqOBeHGSNQI(+v0y@cr(daPn;gDW^{T0|?g#|W{4G7p1 zE>u<+mf2>VeHL0_i#?V(Wuv_o+iZuO7TLF~)fU`v#f5ehRdCG}-E`yZ1W3({SRn>= z<()TOcAI-QUV8Q2mo9sm!+l|~A_IL?C; zj=15eIG(s-j71($V~!*BIAV}39+~BqT}~H+Mr58@=1y9@D1sGeZp7D7US>Jwool`s zMV)8nwO5~i7CC644`C5!qh&_=5T%#C8tbedA^M;QddwPZ>9{t?>#)sk1Zot&Hk<9X zN8UQ4vfaKKZj9uf`)9P{UK{Ve{Z6-TocaD+GHm#ucQ?!-$98Ct9&+r5LByfSy0woZMl6XnCv#M|K1iaN6EG zITBCr(Q_mAY-i{4$PpQApnUz@$Ug(>$AS=apPh?Affn=1doolbgE{3x4HQv_CKPid z+6XAir%{b?lzbk|2uLxCxn}Z^0LvubNsX9N{jszlL{e!<9mh+I)BuS3v*|@}NYN#sCtPY(~`||59tDRH0(-jRx7K{i0fssk*PK`?%^;9VgIz?D2zM1uF){ z3P`THlaK|8! zC1T~c*u)k#n8gg_AtWnD%FYzBj@!gHrMTHidN#9-%fus4C^HN^0<)o|mk6S80N1`2 zwy~A%Y-w9t+ujzpxm83MR11s}YT+12iLx!YauZea%Vn!ykR@PI^|7rp6K?|RwWUiZEizVVf>EKtCTC_pv_sxTHJ ziXa6k6aWH$xI-I0|50EA7q|gaD8e8JFba7RP7eoI#t^ok2n$~r!x`4_hB@5f4%@&5 z^$l;X^pFh!9KatbR`H5i++r8M7{)P{@r-G_VjG}f2qHLZ3>rZSB}kzigdoHcKJbA8 z6yOU1ZUYGp+~fogf)t!}TNqd|gc;Nr%UQ1R0Z@<#1;j}YLwLXmv|MI0pBc?6mc=r7 zD^yPScphd50UtczjT;EL2R$${k|8i)CO6r@4H(1<2+OuGEMp64Ro@ z0IVQ0t$E#R{~4RNq>aGFJFdV27QCU;6acju_%P}_FTvD&7Vw{)j15VKt-8L}wm(iF z09Xu256e)*w#mKi83;hf`#e}0UeJLKSfSW&K=!98AZibI;Le1|bCIRJOhO8S7W0*&x=QCEs5E43yIjF%22%xyd+iit! z7<=BI4mHS04Q+k{IMttkff5S6v9N74*U^`zDpwYhDZY8TMv6fOrq~E_lG3f9&>-R zof1h%ed!~ii6l(I#fdmTbONyJGMC;TW4J_$pU`&XN1_s%i1{RpPx}?y;R!14yXQP%O#r?4$44{b_j!mSAV2{$U_8MAP3lQ#gvcv&3Gy)se6JW2N&!FN z4jLdFE0U)3U|76k||G?j- z0I&GP9}jUI%kJ#bZtWr=ENL<3{_Yae?koL46Hag*$3X7{?;F+TaTU(+cE(3Ha;|>fkW=+3)-s)IYIoErF>mKi~$;fB~-H1rR_4^k5{L@fl5$2-YDR|KI=)(!npA;1igP z1n!_a1(ON*?F;fC5SB(jUF zX+t~oLql{#M{-K5v;$ax0VrTgyYvqXEKI#~7rX%9ng9;clt=4S(ux!$*i=$4RmJW! zl=9R``7}!ZlpESjPzjYwjqFehEKy~$22`LOng9nF08$|kQ`3x6|G`pcRZ=x|k~now zq0~>QG*kn1Pz$vOycAJsR8jGu0Se#;U{y`&;O(_OcKno2D6Md1y(1q6~;_33D|Sd!qu|IRZpL^PtO%lN0nIFHAdZa zCgb%7-XKb#NaeHU z{?0$~6UHP|^=`I7htv>PtUxa_XIpGOe@+&wcK5n@e*)0 z2Z&Mo zYt9|Taw3uPT9cskpbr%V&lg*d6ogU;?{iKvG+32@XW3Wv$qv;wM4-wPuA}jKRAC~Y=*J8c)cY{}KA2?V+mP?N}Z54HS zE!b^a25z?xamRr0+!6e$*YI@sgsHN7F&BJ^5o-N`V9obEGth>0c6DQr7Z(xy8a4|} zv0H&yboV#K>_B3TSbBNU@Jd(3UeQOt*LUkrW6O1T$<~S`7)c*1<%e7N-u>qp*8IQC}~sh!fz3=PYE}Xd{0x312z#Wc6=#;0BCO! ze^d5C(*r4?hyR#weNTUD?)38W@0zd(|I_#=O^^vY^9$ea>`LjE_BuF+F*&34M?J;4k*lf|ZU6q%4yO?FN0qmp|Vv*F!6c<;2I-H}JT!nXRVH%yYSTMJkotI|l z-V{@B4%5mPsHd8xG03Hhx{4!Mrju8TYr37)CETK5s%tC}vSC2Bb*ve#sw3#CsknHL zdZxQtldt9gh9IqFED8dk&7}IS|1ou~6{xK}HmhTLg4J26FZgA`tmXQe#TxCPU6`@` zTBtYHfd%`mueh*jdakcV1eRg3BU|AT!AC4r_A*k-c5~90w#EJ#J;8OdB^j$P+meyG zf|nX=!VCrAIjv715d;9@M8r}jAqp=v#!y?*j5`rYTA9`IwTarT&l$7RS+i|BYZMLz zT%f`{OuM(6yEUx3%In*#xe=8yT81W)q5SB^P>?*;4E7QEA zj}(fM1T%N{@RjT+f$$2Kh<7gv(VNEpI)DP(oGW>&G5N4<`f6a|0IJKoE*!%%T)QeP z=fs=F?2+((6X-UvC?#}u{f?}G6(*0 zvkB)BcKTA2K+r#Y%F}!m3D0(g@;8z135qy?;m!mnGyF6-3yW_HS1;xW8R!hJ9z*cb zWh~RnXOJ2|iYpt`{|Q^V0}~4dp$)wHaa3JWS$$4r%wYX??G`r0_%3ke;1XD~0=LrK zfi43DoDo|Q7GszQ!@UA8GW=!}?ZVv-w$R-d5);vV+y+C=V)P_U%_FJe4|2I`;>z5&`r-gqZ?3I+iYv=imAeQq8>gzo&$m!9dDehOXwA6RbY z>2wQ3o2Gay2T(x;njz$kdR@O%!LWf8P99ZL9?8!JBb#3B*M85t@({mi;0kW)dkzIg zOsF=20Q`Ue|8gJ>_FxUrA=~AOwB$Ctfp-m;eK(|hoSx-vTg1g zE)j_CtXAOU3110Nfw_oM4$gt}v17Ri00wG62I>LdiWLGDpKaYC2Of}ZAU~}qpR>X( zr!Rlo@_MhI3IniVSqXs;D1ZgtArBJ39H@Z#%^?BuKpi^Z3f`a(%%JrF4EE)<1-`mq zY=5kApDqq<_j#Y!6hQ#yPOdmX_=(^6JAfP1Kmq)e2Gjrn#6bGr0MxGk^~)Xt0HOe% z4Ke;1Jcux%!i5YQCTx_%pTvn2D_XpWF{4H~hA1X!v@p!F2QxI9Jc%-;%9RvPBw7~5 zq0E^y|7+U3iL)UmQh3@?VDW;R8U{i`yH4Os#ngaL~n>JsA%2#F7YY?xbrXpFLNsokvfp18t7HHK5rq%|#3``!H(rAdJ}A>BjT}M% z{{evnB8VVK%z=*#GN_-@cD2GgWVIXr*@x&u3HdzykE`BKyjO)cF(QIJR zqQ#8}+Gr$${(1-IRr%pqz36 zLIUbp$X7H7`4x{uM9PqWX%?adr-F`3YN?A6TIhL)`jeaLrvAEICY(ITNhX4#nkrzcw)$#KS=b1Qs10QS3$P1iVPGM&Sj%lgjjV9U{{}uV z^vEF$nQPD?kAS7_vB?^$9-?Hrx+qQhf#PPjLly!Gt@`RKmO&eAVi1(W{!{KhF>um| zDg|Xiz#{~2;uXWj{*#HYja-a@SQob&D6;SNwd}mj&QxC^(*Db6n!2*wZNUEw{0}Fi zJmNzq2%Ec!DvzjQ?jr;=GHkntG=jkfYy8v51{eTskPnYwutGr~11j>!E0rvxP5%J_ zGgzzG=Wp1iPT0sOxSHyBsnndk0FxyLnw@q*bx^?lq-4@fSlu$L66Iy4U+7}hORK&AlJRRx|ytC z5GOjr&bQsRyUWrTl2;VGdS{UwFRLckE0cW+JZ}>%g@8@}s4|-#gX})|fVa|ZfC{6i z+aWrkit$YdfW`u!?9vvx!TG6h8EKV7f>#McJYje2i&5olVxyJik0JGe(+C5Vv4d>l zVs0}?{|xdZgdOA&#-doL;`pefsyWhmqZUD&nB<{6%|RyuQRG~c~-ng|0F6g1`W=I0EVdJ zB*gTDN^Eg!N_^i<k#4@6ha1;iHUI!ViH4GK}K;fn<&6Q__AhmHZi3`_~2p-iDvk+xy`@S@?;FL zUm$Z5%71JEZwIa03NpsMVj`qn-lGuR4w8upt-zquG7$d!|EV0;QH@|2tLH~&s3n7V z42LmjAxshC(otzMpejSz zbz%d7@G4l!cv8$JW~-Z>=wziDwGE){pz4ajA-o#8|4xXqG=bPaKw0|3izH!jy}Lwg zdAcmO9fA~^V5ma$Q!NOI)>QS;f^-+NRi!farFAoH_+++$kgn}&7$C(z@cFB(MS=i( zEmK4&fw)TiP7)br+$Abe3E6(Q5|WDqox!u zBxg9YDC)L{0n>qGLQpbS(x4PLoc#=MvO}HJ?8;4xtZ$D`umh`v7>PSpLL$GbuS9m2 z1o!#_j4Dk$ldSl$}JXJd8D&lsb# zoUw+HRatnQpmE z!W6E^`bhCRF;()2VY);Pu3V8wR5^<;ss!&?CF+{!C!EsFt*Vcmn8ICxy@qh_t0fVM zOT2~>jI%=|g(wM9_#=;udx9jq{b(z{h!g}E1EzyblmF;8r7_i4n(~Y6c;AGAlyL1O zIzoxKJdSwot+HAC5p6lx0gV2>L?k5PnlXHOB8E6bGEpN3bfXNbi}ByL@(HZw^-JCy z@6uh3hpvf6>?`^q!Y2dUPL@LHcG$cf#ReGzI^T|A630mvItlNN>zpAwZBZTTXgJLR zI!-nsf-Aq$iB1rdX*Y9jVat066rHZC|6~Pp)Dd$EAh79WJ4fwW^>#p(D-(wX1)4yY zUh(~^sOKb0f*i;Vu5eXI4wrbsryFh>8f+b~U~x=zMqw;c6eOaBWoP%+im@a^4J^3S z!nV2|H*`hTSU5}kx-#Lkmny__1>rgIx;IULkg%9|4KUs5(p@NXoUeRr3$~-Al`=&!$S&Kx5W)f-2_#lU z1vi8B5BN8P9<_T2<6^6}aDVXx|JQ*y(FkJ29Du}rIgtrAHCidMg)$^jTM|Q~C4M=v ze~>4F?u2Fs5m`P+F6Kf2Te4L^wpMY75K9OpOL7P~FfV?gfro||(Z?M91xu%PgXwY* z6<82ZvpttrJGZA0K2REt0TMYA12I>G=|Vl0h>1(63V_%ksvsS|#uAhug)mbe!ly>Y zc8Jb|F+KoIUXe@`@`3?{|8b81OjnmwQ<6Y}co4sY5N4M^oPcoz(IgKCTPZOKkS0O; zQbMovEDv>qF<^``5jdA9D0KEG&ryDL_k_J;LWtwASGqk zB&m z6DeJ+lyeE;2@=UN0tpIPNRb~2ORNM0E3*op;*m>&Ek~yi=*TZB36d|lMl1;`KtPj5 z0+4?MDlRD#DdPzz=_&RB1P=+5LrFz6z)Cj)3K=jqg>aF=W*-Du6J@j?MBoW^f+x7d zFHK35Td77_Z~>lBqm^!gb2xF78`m<0;0oDtB%snKT6Lc!n_U+W06QKs3ZDP~ diff --git a/docs/framework/data/wcf/number-of-entities-returned-by-a-query-wcf.md b/docs/framework/data/wcf/number-of-entities-returned-by-a-query-wcf.md deleted file mode 100644 index 2b0901761d4b0..0000000000000 --- a/docs/framework/data/wcf/number-of-entities-returned-by-a-query-wcf.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -description: "Learn more about: How to: Determine the Number of Entities Returned by a Query (WCF Data Services)" -title: "How to: Determine the Number of Entities Returned by a Query (WCF Data Services)" -ms.date: "03/30/2017" -ms.topic: how-to -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, row count" -ms.assetid: 03d41a82-df95-40ac-8439-a6c327d37ba8 ---- -# How to: Determine the Number of Entities Returned by a Query (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -With WCF Data Services, you can determine the number of entities that are in the entity set specified by a query URI. This count can be included either along with the query result or as an integer value. For more information, see [Querying the Data Service](querying-the-data-service-wcf-data-services.md). - - The example in this topic uses the Northwind sample data service and autogenerated client data service classes. This service and the client data classes are created when you complete the [WCF Data Services quickstart](quickstart-wcf-data-services.md). - -## Example - - This example executes a query after calling the method. The property returns the number of entities in the `Customers` entity set. - - [!code-csharp[Astoria Northwind Client#CountAllCustomers](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#countallcustomers)] - [!code-vb[Astoria Northwind Client#CountAllCustomers](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#countallcustomers)] - -## Example - - This example calls the method to return only an integer value that is the number of entities in the `Customers` entity set. - - [!code-csharp[Astoria Northwind Client#CountAllCustomersValueOnly](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#countallcustomersvalueonly)] - [!code-vb[Astoria Northwind Client#CountAllCustomersValueOnly](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#countallcustomersvalueonly)] - -## See also - -- [Querying the Data Service](querying-the-data-service-wcf-data-services.md) diff --git a/docs/framework/data/wcf/object-materialization-wcf-data-services.md b/docs/framework/data/wcf/object-materialization-wcf-data-services.md deleted file mode 100644 index 8ec6133ca8ea4..0000000000000 --- a/docs/framework/data/wcf/object-materialization-wcf-data-services.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -description: "Learn more about: Object Materialization (WCF Data Services)" -title: "Object Materialization (WCF Data Services)" -ms.date: "03/30/2017" -helpviewer_keywords: - - "WCF Data Services, client library" - - "WCF Data Services, querying" -ms.assetid: f0dbf7b0-0292-4e31-9ae4-b98288336dc1 ---- -# Object Materialization (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -When you use the **Add Service Reference** dialog to consume an Open Data Protocol (OData) feed in a .NET Framework-based client application, equivalent data classes are generated for each entity type in the data model exposed by the feed. For more information, see [Generating the Data Service Client Library](generating-the-data-service-client-library-wcf-data-services.md). Entity data that is returned by a query is materialized into an instance of one of these generated client data service classes. For information about merge options and identity resolution for tracked objects, see [Managing the Data Service Context](managing-the-data-service-context-wcf-data-services.md). - -WCF Data Services also enables you to define your own client data service classes rather than using the tool-generated data classes. This enables you to use your own data classes, also known as "plain-old CLR object" (POCO) data classes. When using these types of custom data classes, you should attribute the data class with either or and ensure that type names on the client match type names in the data model of the data service. - -After the library receives the query response message, it materializes the returned data from the OData feed into instances of client data service classes that are of the type of the query. The general process for materializing these objects is as follows: - -1. The client library reads the serialized type from the `entry` element in the response message feed and attempts to create a new instance of the correct type, in one of the following ways: - - - When the type declared in the feed has the same name as the type of the , a new instance of this type is created by using the empty constructor. - - - When the type declared in the feed has the same name as a type that is derived from the type of the , a new instance of this derived type is created by using the empty constructor. - - - When the type declared in the feed cannot be matched to the type of the or any derived types, a new instance of the queried type is created by using the empty constructor. - - - When the property is set, the supplied delegate is called to override the default name-based type mapping and a new instance of the type returned by the is created instead. If this delegate returns a null value, a new instance of the queried type is created instead. It may be required to override the default name-based type name mapping to support inheritance scenarios. - -2. The client library reads the URI value from the `id` element of the `entry`, which is the identity value of the entity. Unless a value of is used, the identity value is used to track the object in the . The identity value is also used to guarantee that only a single entity instance is created, even when an entity is returned multiple times in the query response. - -3. The client library reads properties from the feed entry and set the corresponding properties on the newly created object. When an object that has the same identity value already occurs in the , the properties are set based on the setting of the . The response might contain property values for which a corresponding property does not occur in the client type. When this occurs, the action depends on the value of the property of the . When this property is set to `true`, the missing property is ignored. Otherwise, an error is raised. Properties are set as follows: - - - Scalar properties are set to the corresponding value in the entry in the response message. - - - Complex properties are set to a new complex type instance, which are set with the properties of the complex type from the response. - - - Navigation properties that return a collection of related entities are set to a new or existing instance of , where `T` is the type of the related entity. This collection is empty unless the related objects have been loaded into the . For more information, see [Loading Deferred Content](loading-deferred-content-wcf-data-services.md). - - > [!NOTE] - > When the generated client data classes support data binding, navigation properties return instances of the class instead. For more information, see [Binding Data to Controls](binding-data-to-controls-wcf-data-services.md). - -4. The event is raised. - -5. The client library attaches the object to the . The object is not attached when the is . - -## See also - -- [Querying the Data Service](querying-the-data-service-wcf-data-services.md) -- [Query Projections](query-projections-wcf-data-services.md) diff --git a/docs/framework/data/wcf/query-projections-wcf-data-services.md b/docs/framework/data/wcf/query-projections-wcf-data-services.md deleted file mode 100644 index e0bc4eaddaeef..0000000000000 --- a/docs/framework/data/wcf/query-projections-wcf-data-services.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -description: "Learn more about: Query Projections (WCF Data Services)" -title: "Query Projections (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "projection [WCF Data Services]" - - "WCF Data Services, projection" - - "query projection [WCF Data Services]" - - "WCF Data Services, querying" -ms.assetid: a09f4985-9f0d-48c8-b183-83d67a3dfe5f ---- - -# Query Projections (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -Projection provides a mechanism in the Open Data Protocol (OData) to reduce the amount of data in the feed returned by a query by specifying that only certain properties of an entity are returned in the response. For more information, see section 4.8. Select System Query Option ($select) in [URI Conventions (OData Version 2.0)](https://www.odata.org/documentation/odata-version-2-0/uri-conventions/). - -This topic describes how to define a query projection, what the requirements are for entity and non-entity types, making updates to projected results, creating projected types, and lists some projection considerations. - -## Defining a Query Projection - -You can add a projection clause to a query either by using the `$select` query option in a URI or by using the [select](../../../csharp/language-reference/keywords/select-clause.md) clause ([Select](../../../visual-basic/language-reference/queries/select-clause.md) in Visual Basic) in a LINQ query. Returned entity data can be projected into either entity types or non-entity types on the client. Examples in this topic demonstrate how to use the `select` clause in a LINQ query. - -> [!IMPORTANT] -> Data loss might occur in the data service when you save updates that were made to projected types. For more information, see [Projection Considerations](#considerations). - -## Requirements for Entity and Non-Entity Types - -Entity types must have one or more identity properties that make up the entity key. Entity types are defined on clients in one of the following ways: - -- By applying the or to the type. - -- When the type has a property named `ID`. - -- When the type has a property named *type*`ID`, where *type* is the name of the type. - -By default, when you project query results into a type defined at the client, the properties requested in the projection must exist in the client type. However, when you specify a value of `true` for the property of the , properties specified in the projection are not required to occur in the client type. - -### Making Updates to Projected Results - -When you project query results into entity types on the client, the can track those objects with updates to be sent back to the data service when the method is called. However, updates that are made to data projected into non-entity types on the client cannot be sent back to the data service. This is because without a key to identify the entity instance, the data service cannot update the correct entity in the data source. Non-entity types are not attached to the . - -When one or more properties of an entity type defined in the data service do not occur in the client type into which the entity is projected, inserts of new entities will not contain these missing properties. In this case, updates that are made to existing entities will **also** not include these missing properties. When a value exists for such a property, the update resets it to the default value for the property, as defined in the data source. - -### Creating Projected Types - -The following example uses an anonymous LINQ query that projects the address-related properties of the `Customers` type into a new `CustomerAddress` type, which is defined on the client and is attributed as an entity type: - -[!code-csharp[Astoria Northwind Client#SelectCustomerAddressSpecific](~/samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#selectcustomeraddressspecific)] -[!code-vb[Astoria Northwind Client#SelectCustomerAddressSpecific](~/samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#selectcustomeraddressspecific)] - -In this example, the object initializer pattern is used to create a new instance of the `CustomerAddress` type instead of calling a constructor. Constructors are not supported when projecting into entity types, but they can be used when projecting into non-entity and anonymous types. Because `CustomerAddress` is an entity type, changes can be made and sent back to the data service. - -Also, the data from the `Customer` type is projected into an instance of the `CustomerAddress` entity type instead of an anonymous type. Projection into anonymous types is supported, but the data is read-only because anonymous types are treated as non-entity types. - -The settings of the are used for identity resolution during query projection. This means that if an instance of the `Customer` type already exists in the , an instance of `CustomerAddress` with the same identity will follow the identity resolution rules set by the - -The following describes the behaviors when projecting results into entity and non-entity types: - -**Creating a new projected instance by using initializers** - -- Example: - - [!code-csharp[Astoria Northwind Client#ProjectWithInitializer](~/samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#projectwithinitializer)] - [!code-vb[Astoria Northwind Client#ProjectWithInitializer](~/samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#projectwithinitializer)] - -- Entity type: Supported - -- Non-entity type: Supported - -**Creating a new projected instance by using constructors** - -- Example: - - [!code-csharp[Astoria Northwind Client#ProjectWithConstructor](~/samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#projectwithconstructor)] - [!code-vb[Astoria Northwind Client#ProjectWithConstructor](~/samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#projectwithconstructor)] - -- Entity type: A is raised. - -- Non-entity type: Supported - -**Using projection to transform a property value** - -- Example: - - [!code-csharp[Astoria Northwind Client#ProjectWithTransform](~/samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#projectwithtransform)] - [!code-vb[Astoria Northwind Client#ProjectWithTransform](~/samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#projectwithtransform)] - -- Entity type: This transformation is not supported for entity types because it can lead to confusion and potentially overwriting the data in the data source that belongs to another entity. A is raised. - -- Non-entity type: Supported - - - -## Projection Considerations - -The following additional considerations apply when defining a query projection. - -- When you define custom feeds for the Atom format, you must make sure that all entity properties that have custom mappings defined are included in the projection. When a mapped entity property is not included in the projection, data loss might occur. For more information, see [Feed Customization](feed-customization-wcf-data-services.md). - -- When inserts are made to a projected type that does not contain all of the properties of the entity in the data model of the data service, the properties not included in the projection at the client are set to their default values. - -- When updates are made to a projected type that does not contain all of the properties of the entity in the data model of the data service, existing values not included in the projection on the client will be overwritten with uninitialized default values. - -- When a projection includes a complex property, the entire complex object must be returned. - -- When a projection includes a navigation property, the related objects are loaded implicitly without having to call the method. The method is not supported for use in a projected query. - -- Query projections queries on the client are translated to use the `$select` query option in the request URI. When a query with projection is executed against a previous version of WCF Data Services that does not support the `$select` query option, an error is returned. This can also happen when the of the for the data service is set to a value of . For more information, see [Data Service Versioning](data-service-versioning-wcf-data-services.md). - -For more information, see [How to: Project Query Results](how-to-project-query-results-wcf-data-services.md). - -## See also - -- [Querying the Data Service](querying-the-data-service-wcf-data-services.md) diff --git a/docs/framework/data/wcf/querying-the-data-service-wcf-data-services.md b/docs/framework/data/wcf/querying-the-data-service-wcf-data-services.md deleted file mode 100644 index cf0a0637e4f17..0000000000000 --- a/docs/framework/data/wcf/querying-the-data-service-wcf-data-services.md +++ /dev/null @@ -1,153 +0,0 @@ ---- -description: "Learn more about: Querying the Data Service (WCF Data Services)" -title: "Querying the Data Service (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, client library" - - "WCF Data Services, querying" - - "WCF Data Services, accessing data" -ms.assetid: 823e9444-27aa-4f1f-be8e-0486d67f54c0 ---- -# Querying the Data Service (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -The WCF Data Services client library enables you to execute queries against a data service by using familiar .NET Framework programming patterns, including using language integrated query (LINQ). The client library translates a query, which is defined on the client as an instance of the class, into an HTTP GET request message. The library receives the response message and translates it into instances of client data service classes. These classes are tracked by the to which the belongs. - -## Data Service Queries - -The generic class represents a query that returns a collection of zero or more entity type instances. A data service query always belongs to an existing data service context. This context maintains the service URI and metadata information that is required to compose and execute the query. - -When you use the **Add Service Reference** dialog to add a data service to a .NET Framework-based client application, an entity container class is created that inherits from the class. This class includes properties that return typed instances. There is one property for each entity set that the data service exposes. These properties make it easier to create an instance of a typed . - -A query is executed in the following scenarios: - -- When results are enumerated implicitly, such as: - - - When a property on the that represents and entity set is enumerated, such as during a `foreach` (C#) or `For Each` (Visual Basic) loop. - - - When the query is assigned to a `List` collection. - -- When the or method is explicitly called. - -- When a LINQ query execution operator, such as or is called. - -The following query, when it is executed, returns all `Customers` entities in the Northwind data service: - -[!code-csharp[Astoria Northwind Client#GetAllCustomersSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#getallcustomersspecific)] -[!code-vb[Astoria Northwind Client#GetAllCustomersSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#getallcustomersspecific)] - -For more information, see [How to: Execute Data Service Queries](how-to-execute-data-service-queries-wcf-data-services.md). - -The WCF Data Services client supports queries for late-bound objects, such as when you use the *dynamic* type in C#. However, for performance reasons you should always compose strongly typed queries against the data service. The type and dynamic objects are not supported by the client. - -## LINQ Queries - -Because the class implements the interface defined by LINQ, the WCF Data Services client library is able to transform LINQ queries against entity set data into a URI that represents a query expression evaluated against a data service resource. The following example is a LINQ query that is equivalent to the previous that returns `Orders` that have a freight cost of more than $30 and orders the results by the freight cost: - -[!code-csharp[Astoria Northwind Client#AddQueryOptionsLinqSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#addqueryoptionslinqspecific)] -[!code-vb[Astoria Northwind Client#AddQueryOptionsLinqSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#addqueryoptionslinqspecific)] - -This LINQ query is translated into the following query URI that is executed against the Northwind-based [quickstart](quickstart-wcf-data-services.md) data service: - -```http -http://localhost:12345/Northwind.svc/Orders?Orderby=ShippedDate&?filter=Freight gt 30 -``` - -> [!NOTE] -> The set of queries expressible in the LINQ syntax is broader than those enabled in the representational state transfer (REST)-based URI syntax that is used by data services. A is raised when the query cannot be mapped to a URI in the target data service. - -For more information, see [LINQ Considerations](linq-considerations-wcf-data-services.md). - -## Adding Query Options - -Data service queries support all the query options that WCF Data Services provides. You call the method to append query options to a instance. returns a new instance that is equivalent to the original query but with the new query option set. The following query, when executed, returns `Orders` that are filtered by the `Freight` value and ordered by the `OrderID`, descending: - -[!code-csharp[Astoria Northwind Client#AddQueryOptionsSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#addqueryoptionsspecific)] -[!code-vb[Astoria Northwind Client#AddQueryOptionsSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#addqueryoptionsspecific)] - -You can use the `$orderby` query option to both order and filter a query based on a single property, as in the following example that filters and orders the returned `Orders` objects based on the value of the `Freight` property: - -[!code-csharp[Astoria Northwind Client#OrderWithFilter](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#orderwithfilter)] -[!code-vb[Astoria Northwind Client#OrderWithFilter](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#orderwithfilter)] - -You can call the method consecutively to construct complex query expressions. For more information, see [How to: Add Query Options to a Data Service Query](how-to-add-query-options-to-a-data-service-query-wcf-data-services.md). - -Query options give you another way to express the syntactic components of a LINQ query. For more information, see [LINQ Considerations](linq-considerations-wcf-data-services.md). - -> [!NOTE] -> The `$select` query option cannot be added to a query URI by using the method. We recommend that you use the LINQ method to have the client generate the `$select` query option in the request URI. - - - -## Client versus Server Execution - -The client executes a query in two parts. Whenever possible, expressions in a query are first evaluated on the client, and then a URI-based query is generated and sent to the data service for evaluation against data in the service. Consider the following LINQ query: - -[!code-csharp[Astoria Northwind Client#LinqQueryClientEvalSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#linqqueryclientevalspecific)] -[!code-vb[Astoria Northwind Client#LinqQueryClientEvalSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#linqqueryclientevalspecific)] - -In this example, the expression `(basePrice – (basePrice * discount))` is evaluated on the client. Because of this, the actual query URI `http://localhost:12345/northwind.svc/Products()?$filter=(UnitPrice gt 90.00M) and substringof('bike',ProductName)` that is sent to the data service contains the already calculated decimal value of `90` in the filter clause. The other parts of the filtering expression, including the substring expression, are evaluated by the data service. Expressions that are evaluated on the client follow common language runtime (CLR) semantics, while expressions sent to the data service rely on the data service implementation of the OData Protocol. You should also be aware of scenarios where this separate evaluation may cause unexpected results, such as when both the client and service perform time-based evaluations in different time zones. - -## Query Responses - -When executed, the returns an of the requested entity type. This query result can be cast to a object, as in the following example: - -[!code-csharp[Astoria Northwind Client#GetResponseSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#getresponsespecific)] -[!code-vb[Astoria Northwind Client#GetResponseSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#getresponsespecific)] - -The entity type instances that represent entities in the data service are created on the client by a process called object materialization. For more information, see [Object Materialization](object-materialization-wcf-data-services.md). The object implements to provide access to the results of the query. - -The also has the following members that enable you to access additional information about a query result: - -- - gets an error thrown by the operation, if any has occurred. - -- - contains the collection of HTTP response headers associated with the query response. - -- - gets the original that generated the . - -- - gets the HTTP response code for the query response. - -- - gets the total number of entities in the entity set when the method was called on the . - -- - returns a object that contains the URI of the next page of results. - -By default, WCF Data Services only returns data that is explicitly selected by the query URI. This gives you the option to explicitly load additional data from the data service when it is needed. A request is sent to the data service each time you explicitly load data from the data service. Data that can be explicitly loaded includes related entities, paged response data, and binary data streams. - -> [!NOTE] -> Because a data service may return a paged response, we recommend that your application use the programming pattern to handle a paged data service response. For more information, see [Loading Deferred Content](loading-deferred-content-wcf-data-services.md). - -The amount of data returned by a query can also be reduced by specifying that only certain properties of an entity are returned in the response. For more information, see [Query Projections](query-projections-wcf-data-services.md). - -## Getting a Count of the Total Number of Entities in the Set - -In some scenarios, it is helpful to know the total number of entities in an entity set and not merely the number returned by the query. Call the method on the to request that this total count of entities in the set be included with the query result. In this case, the property of the returned returns the total number of entities in the set. - -You can also get only the total count of entities in the set either as an or as a value by calling the or methods respectively. When these methods are called, a is not returned; only the count value is returned. For more information, see [How to: Determine the Number of Entities Returned by a Query](number-of-entities-returned-by-a-query-wcf.md). - -## In This Section - -- [Query Projections](query-projections-wcf-data-services.md) - -- [Object Materialization](object-materialization-wcf-data-services.md) - -- [LINQ Considerations](linq-considerations-wcf-data-services.md) - -- [How to: Execute Data Service Queries](how-to-execute-data-service-queries-wcf-data-services.md) - -- [How to: Add Query Options to a Data Service Query](how-to-add-query-options-to-a-data-service-query-wcf-data-services.md) - -- [How to: Determine the Number of Entities Returned by a Query](number-of-entities-returned-by-a-query-wcf.md) - -- [How to: Specify Client Credentials for a Data Service Request](specify-client-creds-for-a-data-service-request-wcf.md) - -- [How to: Set Headers in the Client Request](how-to-set-headers-in-the-client-request-wcf-data-services.md) - -- [How to: Project Query Results](how-to-project-query-results-wcf-data-services.md) - -## See also - -- [WCF Data Services Client Library](wcf-data-services-client-library.md) diff --git a/docs/framework/data/wcf/quickstart-wcf-data-services.md b/docs/framework/data/wcf/quickstart-wcf-data-services.md deleted file mode 100644 index 6dabb8e71c863..0000000000000 --- a/docs/framework/data/wcf/quickstart-wcf-data-services.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -description: "Learn more about: Quickstart (WCF Data Services)" -title: "Quickstart (WCF Data Services)" -ms.date: 08/24/2018 -helpviewer_keywords: - - "WCF Data Services, quick-start example" - - "WCF Data Services, Entity Data Model (EDM) service" -ms.assetid: 7b18ca1e-d4d6-4c7a-afb9-ce3cebb98a8d -recommendations: false ---- -# Quickstart (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -This quickstart helps you become familiar with WCF Data Services and the Open Data Protocol (OData) through a series of tasks that support the topics in [Getting Started](getting-started-with-wcf-data-services.md). - -## What you'll learn - -The first task in this quickstart shows how to create a data service to expose an OData feed from the Northwind sample database. In later topics, you will access the OData feed by using a Web browser, and also create a Windows Presentation Foundation (WPF) client application that consumes the OData feed by using client libraries. - -## Prerequisites - -To complete this quickstart, install the following components: - -- Visual Studio - -- An instance of SQL Server. This includes SQL Server Express, which is included in a default installation of Visual Studio 2015, or as part of the **Data storage and processing** workload in Visual Studio 2017 or later. - -- The Northwind sample database. To install the database, run the Transact-SQL script from [Northwind and pubs sample databases for Microsoft SQL Server](https://github.com/Microsoft/sql-server-samples/tree/master/samples/databases/northwind-pubs). - -## WCF data services quickstart tasks - - [Create the Data Service](creating-the-data-service.md) - - Define the ASP.NET application, define the data model, create the data service, and enable access to resources. - - [Access the Service from a Web Browser](accessing-the-service-from-a-web-browser-wcf-data-services-quickstart.md) - - Start the service from Visual Studio and access the service by submitting HTTP GET requests through a Web browser to the exposed feed. - - [Create the .NET Framework Client Application](creating-the-dotnet-client-application-wcf-data-services-quickstart.md) - - Create a WPF app to consume the OData feed, bind data to Windows controls, change data in the bound controls, and then send the changes back to the data service. - -> [!NOTE] -> Project files from a completed version of the quickstart can be downloaded from [GitHub](https://github.com/microsoftarchive/msdn-code-gallery-community-s-z/tree/master/WCF%20Data%20Services%20Quickstart%20(OData%20Service%20and%20WPF%20Client)). - -## Next steps - -> [!div class="nextstepaction"] -> [Start the quickstart](creating-the-data-service.md) - -## See also - -- [ADO.NET Entity Framework](../adonet/ef/index.md) diff --git a/docs/framework/data/wcf/reflection-provider-wcf-data-services.md b/docs/framework/data/wcf/reflection-provider-wcf-data-services.md deleted file mode 100644 index 45eee5dae442c..0000000000000 --- a/docs/framework/data/wcf/reflection-provider-wcf-data-services.md +++ /dev/null @@ -1,102 +0,0 @@ ---- -description: "Learn more about: Reflection Provider (WCF Data Services)" -title: "Reflection Provider (WCF Data Services)" -ms.date: "03/30/2017" -helpviewer_keywords: - - "WCF Data Services, providers" -ms.assetid: ef5ba300-6d7c-455e-a7bd-d0cc6d211ad4 ---- -# Reflection Provider (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -In addition to exposing data from a data model through the Entity Framework, WCF Data Services can expose data that is not strictly defined in an entity-based model. The reflection provider exposes data in classes that return types that implement the interface. WCF Data Services uses reflection to infer a data model for these classes and can translate address-based queries against resources into language integrated query (LINQ)-based queries against the exposed types. - -> [!NOTE] -> You can use the method to return an interface from any class that implements the interface. This enables most generic collection types to be used as a data source for your data service. - -The reflection provider supports type hierarchies. For more information, see [How to: Create a Data Service Using the Reflection Provider](create-a-data-service-using-rp-wcf-data-services.md). - -## Inferring the Data Model - -When you create the data service, the provider infers the data model by using reflection. The following list shows how the reflection provider infers the data model: - -- Entity container - the class that exposes the data as properties that return an instance. When you address a reflection-based data model, the entity container represents the root of the service. Only one entity container class is supported for a given namespace. - -- Entity sets - properties that return instances are treated as entity sets. Entity sets are addressed directly as resources in the query. Only one property on the entity container can return an instance of a given type. - -- Entity types - the type `T` of the that the entity set returns. Classes that are part of an inheritance hierarchy are translated by the reflection provider into an equivalent entity type hierarchy. - -- Entity keys - each data class that is an entity type must have a key property. This property is attributed with the attribute (`[DataServiceKeyAttribute]`). - - > [!NOTE] - > You should only apply the attribute to a property that can be used to uniquely identify an instance of the entity type. This attribute is ignored when applied to a navigation property. - -- Entity type properties - other than the entity key, the reflection provider treats the accessible, non-indexer properties of a class that is an entity type as follows: - - - If the property returns a primitive type, then the property is assumed to be a property of an entity type. - - - If the property returns a type that is also an entity type, then the property is assumed to be a navigation property that represents the "one" end of a many-to-one or one-to-one relationship. - - - If the property returns an of an entity type, then the property is assumed to be a navigation property that represents the "many" end of a one-to-many or many-to-many relationship. - - - If the return type of the property is a value type, then the property represents a complex type. - -> [!NOTE] -> Unlike a data model that is based on the entity-relational model, models that are based on the reflection provider do not understand relational data. You should use the Entity Framework to expose relational data through WCF Data Services. - -## Data Type Mapping - -When a data model is inferred from .NET Framework classes, the primitive types in the data model are mapped to .NET Framework data types as follows: - -|.NET Framework data type|Data model type| -|------------------------------|---------------------| -| `[]`|`Edm.Binary`| -||`Edm.Boolean`| -||`Edm.Byte`| -||`Edm.DateTime`| -||`Edm.Decimal`| -||`Edm.Double`| -||`Edm.Guid`| -||`Edm.Int16`| -||`Edm.Int32`| -||`Edm.Int64`| -||`Edm.SByte`| -||`Edm.Single`| -||`Edm.String`| - -> [!NOTE] -> .NET Framework nullable value types are mapped to the same data model types as the corresponding value types that cannot be assigned a null. - -## Enabling Updates in the Data Model - -To allow updates to data that is exposed through this kind of data model, the reflection provider defines an interface. This interface instructs the data service on how to persist updates to the exposed types. To enable updates to resources that are defined by the data model, the entity container class must implement the interface. For an example of an implementation of the interface, see [How to: Create a Data Service Using a LINQ to SQL Data Source](create-a-data-service-using-linq-to-sql-wcf.md). - -The interface requires that the following members be implemented so that updates can be propagated to the data source by using the reflection provider: - -|Member|Description| -|------------|-----------------| -||Provides the functionality to add an object to a collection of related objects that are accessed from a navigation property.| -||Provides the functionality that cancels pending changes to the data.| -||Provides the functionality to create a new resource in the specified container.| -||Provides the functionality to delete a resource.| -||Provides the functionality to retrieve a resource that is identified by a specific query and type name.| -||Provides the functionality to return the value of a property of a resource.| -||Provides the functionality to remove an object to a collection of related objects accessed from a navigation property.| -||Provides the functionality to update a specified resource.| -||Provides the functionality to return the resource that is represented by a specific object instance.| -||Provides the functionality to save all pending changes.| -||Provides the functionality to set a related object reference by using a navigation property.| -||Provides the functionality to set the value of the property of a resource.| - -## Handling Concurrency - -WCF Data Services supports an optimistic concurrency model by enabling you to define a concurrency token for an entity. This concurrency token, which includes one or more properties of the entity, is used by the data service to determine whether a change has occurred in the data that is being requested, updated, or deleted. When token values obtained from the eTag in the request differ from the current values of the entity, an exception is raised by the data service. The is applied to an entity type to define a concurrency token in the reflection provider. The concurrency token cannot include a key property or a navigation property. For more information, see [Updating the Data Service](updating-the-data-service-wcf-data-services.md). - -## Using LINQ to SQL with the Reflection Provider - -Because the Entity Framework is natively supported by default, it is the recommended data provider for using relational data with WCF Data Services. However, you can use the reflection provider to use LINQ to SQL classes with a data service. The result sets that are returned by methods on the generated by the LINQ to SQL Object Relational Designer (O/R Designer) implement the interface. This enables the reflection provider to access these methods and return entity data from SQL Server by using the generated LINQ to SQL classes. However, because LINQ to SQL does not implement the interface, you need to add a partial class that extends the existing partial class to add the implementation. For more information, see [How to: Create a Data Service Using a LINQ to SQL Data Source](create-a-data-service-using-linq-to-sql-wcf.md). - -## See also - -- [Data Services Providers](data-services-providers-wcf-data-services.md) diff --git a/docs/framework/data/wcf/securing-wcf-data-services.md b/docs/framework/data/wcf/securing-wcf-data-services.md deleted file mode 100644 index 312c557defc66..0000000000000 --- a/docs/framework/data/wcf/securing-wcf-data-services.md +++ /dev/null @@ -1,129 +0,0 @@ ---- -description: "Learn more about: Securing WCF Data Services" -title: "Securing WCF Data Services" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "securing application [WCF Data Services]" - - "WCF Data Services, security" -ms.assetid: 99fc2baa-a040-4549-bc4d-f683d60298af ---- -# Securing WCF Data Services - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -This article describes security considerations that are specific to developing, deploying, and running WCF Data Services and applications that access services that support the Open Data Protocol (OData). You should also follow recommendations for creating secure .NET Framework applications. - -When planning how to secure a WCF Data Services-based OData service, you must address both authentication, the process of discovering and verifying the identity of a principal, and authorization, the process of determining whether an authenticated principal is allowed to access the requested resources. Also consider whether to encrypt the message by using SSL. - -## Authenticating Client Requests - -WCF Data Services does not implement any kind of authentication of its own, but rather relies on the authentication provisions of the data service host. This means that the service assumes that any request that it receives has already been authenticated by the network host and that the host has correctly identified the principle for the request appropriately via the interfaces provided by WCF Data Services. These authentication options and approaches are detailed in the multipart [OData and Authentication series](https://devblogs.microsoft.com/odata/?s=%22OData+and+authentication%22). - -### Authentication Options for a WCF Data Service - - The following table lists some of the authentication mechanisms that are available to help you authenticate requests to a WCF Data Service. - -|Authentication Options|Description| -|----------------------------|-----------------| -|Anonymous authentication|When HTTP anonymous authentication is enabled, any principle is able to connect to the data service. Credentials are not required for anonymous access. Use this option only when you want to allow anyone to access the data service.| -|Basic and digest authentication|Credentials consisting of a user name and password are required for authentication. Supports authentication of non-Windows clients. **Security Note:** Basic authentication credentials (user name and password) are sent in the clear and can be intercepted. Digest authentication sends a hash based-on the supplied credentials, which makes it more secure than basic authentication. Both are susceptible to man-in-the-middle attacks. When using these authentication methods, you should consider encrypting communication between client and the data service by using the Secure Sockets Layer (SSL).

Microsoft Internet Information Services (IIS) provides an implementation of both basic and digest authentication for HTTP requests in an ASP.NET application. This Windows Authentication Provider implementation enables a .NET Framework client application to supply credentials in the HTTP header of the request to the data service to seamlessly negotiate authentication of a Windows user. For more information, see [Digest Authentication Technical Reference](/previous-versions/windows/it-pro/windows-server-2003/cc782794(v=ws.10)).

When you want to have your data service use basic authentication based on some custom authentication service and not Windows credentials, you must implement a custom ADP.NET HTTP Module for authentication.

For an example of how to use a custom basic authentication scheme with WCF Data Services, see the blog post [OData and Authentication – Part 6 – Custom Basic Authentication](https://devblogs.microsoft.com/odata/odata-and-authentication-part-6-custom-basic-authentication/).| -|Windows authentication|Windows-based credentials are exchanged by using NTLM or Kerberos. This mechanism is more secure than basic or digest authentication, but it requires that the client be a Windows-based application. IIS also provides an implementation of Windows authentication for HTTP requests in an ASP.NET application. For more information, see [ASP.NET Forms Authentication Overview](/previous-versions/aspnet/7t6b43z4(v=vs.100)).

For an example of how to use Windows authentication with WCF Data Services, see the blog post [OData and Authentication – Part 2 – Windows Authentication](https://devblogs.microsoft.com/odata/odata-and-authentication-part-2-windows-authentication/).| -|ASP.NET forms authentication|Forms authentication lets you authenticate users by using your own code and then maintain an authentication token in a cookie or in the page URL. You authenticate the user name and password of your users using a login form that you create. Unauthenticated requests are redirected to a login page, where the user provides credentials and submits the form. If the application authenticates the request, the system issues a ticket that contains a key for reestablishing the identity for subsequent requests. For more information, see [Forms Authentication Provider](/previous-versions/aspnet/9wff0kyh(v=vs.100)). **Security Note:** By default, the cookie that contains the forms authentication ticket is not secured when you use forms authentication in a ASP.NET Web application. You should consider requiring SSL to protect both the authentication ticket and the initial login credentials.

For an example of how to use forms authentication with WCF Data Services, see the blog post [OData and Authentication – Part 7 – Forms Authentication](https://devblogs.microsoft.com/odata/odata-and-authentication-part-7-forms-authentication/).| -|Claims-based authentication|In claims-based authentication, the data service relies on a trusted "third-party" identity provider service to authenticate the user. The identity provider positively authenticates the user that is requesting access to data service resources and issues a token that grants access to the requested resources. This token is then presented to the data service, which then grants access to the user based on the trust relationship with the identity service that issued the access token.

The benefit of using a claims-based authentication provider is that they can be used to authenticate various types of clients across trust domains. By employing such a third-party provider, a data service can offload the requirements of maintaining and authenticating users. OAuth 2.0 is a claims-based authentication protocol that is supported by Azure AppFabric Access Control for federated authorization as a service. This protocol supports REST-based services. For an example of how to use OAuth 2.0 with WCF Data Services, see the blog post [OData and Authentication – Part 8 – OAuth WRAP](https://devblogs.microsoft.com/odata/odata-and-authentication-part-8-oauth-wrap/).| - - - -### Authentication in the Client Library - - By default, the WCF Data Services client library does not supply credentials when making a request to an OData service. When login credentials are required by the data service to authenticate a user, these credentials can be supplied in a accessed from the property of the , as in the following example: - -```csharp -// Set the client authentication credentials. -context.Credentials = - new NetworkCredential(userName, password, domain); -``` - -```vb -' Set the client authentication credentials. -context.Credentials = _ - New NetworkCredential(userName, password, domain) -``` - - For more information, see [How to: Specify Client Credentials for a Data Service Request](specify-client-creds-for-a-data-service-request-wcf.md). - - When the data service requires login credentials that cannot be specified by using a object, such as a claims-based token or cookie, you must manually set headers in the HTTP request, usually the `Authorization` and `Cookie` headers. For more information about this kind of authentication scenario, see the blog post [ -OData and Authentication – Part 3 – ClientSide Hooks](https://devblogs.microsoft.com/odata/odata-and-authentication-part-3-clientside-hooks/). For an example of how to set HTTP headers in a request message, see [How to: Set Headers in the Client Request](how-to-set-headers-in-the-client-request-wcf-data-services.md). - -## Impersonation - - Generally, the data service accesses required resources, such as files on the server or a database, by using the credentials of the worker process that is hosting the data service. When using impersonation, ASP.NET applications can execute with the Windows identity (user account) of the user making the request. Impersonation is commonly used in applications that rely on IIS to authenticate the user, and the credentials of this principle are used to access the required resources. For more information, see [ASP.NET Impersonation](/previous-versions/aspnet/xh507fc5(v=vs.100)). - -## Configuring Data Service Authorization - - Authorization is the granting of access to application resources to a principle or process that is identified based on a previously successful authentication. As a general practice, you should only grant sufficient rights to users of the data service to perform the operations required by client applications. - -### Restrict Access to Data Service Resources - - By default, WCF Data Services enables you to grant common read and write access against data service resources (entity set and service operations) to any user that is able to access the data service. Rules that define read and write access can be defined separately for each entity set exposed by the data service, as well as to any service operations. We recommend limiting both read and write access to only the resources required by the client application. For more information, see [Minimum Resource Access Requirements](configuring-the-data-service-wcf-data-services.md#accessRequirements). - -### Implement Role-Based Interceptors - - Interceptors enable you to intercept requests against data service resources before they are acted on by the data service. For more information, see [Interceptors](interceptors-wcf-data-services.md). Interceptors enable you to make authorization decisions based the authenticated user that is making the request. For an example of how to restrict access to data service resources based on an authenticated user identity, see [How to: Intercept Data Service Messages](how-to-intercept-data-service-messages-wcf-data-services.md). - -### Restrict Access to the Persisted Data Store and Local Resources - - The accounts that are used to access the persisted store should be granted only enough rights in a database or the file system to support the requirements of the data service. When anonymous authentication is used, this is the account used to run the hosting application. For more information, see [How to: Develop a WCF Data Service Running on IIS](how-to-develop-a-wcf-data-service-running-on-iis.md). When impersonation is used, authenticated users must be granted access to these resources, usually as part of a Windows group. - -## Other Security Considerations - -### Secure the Data in the Payload - -OData is based on the HTTP protocol. In an HTTP message, the header may contain valuable user credentials, depending on the authentication implemented by the data service. The message body may also contain valuable customer data that must be protected. In both of these cases, we recommend that you use SSL to protect this information over the wire. - -### Ignored Message Headers and Cookies - - HTTP request headers, other than those that declare content types and resource locations, are ignored and are never set by the data service. - - Cookies can be used as part of an authentication scheme, such as with ASP.NET Forms Authentication. However, any HTTP cookies set on an incoming request are ignored by WCF DataServices. The host of a data service may process the cookie, but the WCF Data Services runtime never analyzes or returns cookies. The WCF Data Services client library also does not process cookies sent in the response. - -### Custom Hosting Requirements - - By default, WCF Data Services is created as an ASP.NET application hosted in IIS. This enables the data service to leverage the secure behaviors of this platform. You can define WCF Data Services that are hosted by a custom host. For more information, see [Hosting the Data Service](hosting-the-data-service-wcf-data-services.md). The components and platform hosting a data service must ensure the following security behaviors to prevent attacks on the data service: - -- Limit the length of the URI accepted in a data service request for all possible operations. - -- Limit the size of both incoming and outgoing HTTP messages. - -- Limit the total number of outstanding requests at any given time. - -- Limit the size of HTTP headers and their values, and provide WCF Data Services access to header data. - -- Detect and counter known attacks, such as TCP SYN and message replay attacks. - -### Values Are Not Further Encoded - - Property values sent to the data service are not further encoded by the WCF Data Services runtime. For example, when a string property of an entity contains formatted HTML content, the tags are not HTML encoded by the data service. The data service also does not further encode property values in the response. The client library also does not perform any additional encoding. - -### Considerations for Client Applications - - The following security considerations apply to applications that use the WCF Data Services client to access OData services: - -- The client library assumes that the protocols used to access the data service provide an appropriate level of security. - -- The client library uses all the default values for timeouts and parsing options of the underlying platform-provided transport stacks. - -- The client library does not read any settings from application configuration files. - -- The client library does not implement any cross domain access mechanisms. Instead, it relies on the mechanisms provided by the underlying HTTP stack. - -- The client library has no user interface elements, and it never tries to display or render the data that it receives or sends. - -- We recommend that client applications always validate user input as well as data accepted from untrusted services. - -## See also - -- [Defining WCF Data Services](defining-wcf-data-services.md) -- [WCF Data Services Client Library](wcf-data-services-client-library.md) diff --git a/docs/framework/data/wcf/service-operations-wcf-data-services.md b/docs/framework/data/wcf/service-operations-wcf-data-services.md deleted file mode 100644 index 84510e7a8cde6..0000000000000 --- a/docs/framework/data/wcf/service-operations-wcf-data-services.md +++ /dev/null @@ -1,111 +0,0 @@ ---- -description: "Learn more about: Service Operations (WCF Data Services)" -title: "Service Operations (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "service operations [WCF Data Services]" - - "WCF Data Services, service operations" -ms.assetid: 583a690a-e60f-4990-8991-d6efce069d76 ---- -# Service Operations (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -WCF Data Services enables you to define service operations on a data service to expose methods on the server. Like other data service resources, service operations are addressed by URIs. Service operations enable you to expose business logic in a data service, such as to implement validation logic, to apply role-based security, or to expose specialized querying capabilities. Service operations are methods added to the data service class that derives from . Like all other data service resources, you can supply parameters to the service operation method. For example, the following service operation URI (based on the [quickstart](quickstart-wcf-data-services.md) data service) passes the value `London` to the `city` parameter: - -```http -http://localhost:12345/Northwind.svc/GetOrdersByCity?city='London' -``` - -The definition for this service operation is as follows: - -[!code-csharp[Astoria Northwind Service#ServiceOperationDef](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_service/cs/northwind2.svc.cs#serviceoperationdef)] -[!code-vb[Astoria Northwind Service#ServiceOperationDef](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_service/vb/northwind2.svc.vb#serviceoperationdef)] - -You can use the of the to directly access the data source that the data service is using. For more information, see [How to: Define a Service Operation](how-to-define-a-service-operation-wcf-data-services.md). - -For information on how to call a service operation from a .NET Framework client application, see [Calling Service Operations](calling-service-operations-wcf-data-services.md). - -## Service Operation Requirements - -The following requirements apply when defining service operations on the data service. If a method does not meet these requirements, it will not be exposed as a service operation for the data service. - -- The operation must be a public instance method that is a member of the data service class. - -- The operation method may only accept input parameters. Data sent in the message body cannot be accessed by the data service. - -- If parameters are defined, the type of each parameter must be a primitive type. Any data of a non-primitive type must be serialized and passed into a string parameter. - -- The method must return one of the following: - - - `void` (`Nothing` in Visual Basic) - - - - - - - - - An entity type in the data model that the data service exposes. - - - A primitive class such as integer or string. - -- In order to support query options such as sorting, paging, and filtering, service operation methods should return . Requests to service operations that include query options are rejected for operations that only return . - -- In order to support accessing related entities by using navigation properties, the service operation must return . - -- The method must be annotated with the `[WebGet]` or `[WebInvoke]` attribute. - - - `[WebGet]` enables the method to be invoked by using a GET request. - - - `[WebInvoke(Method = "POST")]` enables the method to be invoked by using a POST request. Other methods are not supported. - -- A service operation may be annotated with the that specifies that the return value from the method is a single entity rather than a collection of entities. This distinction dictates the resulting serialization of the response and the manner in which additional navigation property traversals are represented in the URI. For example, when using AtomPub serialization, a single resource type instance is represented as an entry element and a set of instances as a feed element. - -## Addressing Service Operations - -You can address service operations by placing the name of the method in the first path segment of a URI. As an example, the following URI accesses a `GetOrdersByState` operation that returns an collection of `Orders` objects. - -```http -http://localhost:12345/Northwind.svc/GetOrdersByState?state='CA'&includeItems=true -``` - -When calling a service operation, parameters are supplied as query options. The previous service operation accepts both a string parameter `state` and a Boolean parameter `includeItems` that indicates whether to include related `Order_Detail` objects in the response. - -The following are valid return types for a service operation: - -|Valid Return Types|URI Rules| -|------------------------|---------------| -|`void` (`Nothing` in Visual Basic)

-or-

Entity types

-or-

Primitive types|The URI must be a single path segment that is the name of the service operation. Query options are not allowed.| -||The URI must be a single path segment that is the name of the service operation. Because the result type is not an type, query options are not allowed.| -||Query path segments in addition to the path that is the name of the service operation are allowed. Query options are also allowed.| - -Additional path segments or query options may be added to the URI depending on the return type of the service operation. For example, the following URI accesses a `GetOrdersByCity` operation that returns an collection of `Orders` objects, ordered by `RequiredDate` in descending order, along with the related `Order_Details` objects: - -```http -http://localhost:12345/Northwind.svc/GetOrdersByCity?city='London'&$expand=Order_Details&$orderby=RequiredDate desc -``` - -## Service Operations Access Control - -Service-wide visibility of service operations is controlled by the method on the class in much the same way that entity set visibility is controlled by using the method. For example, the following line of code in the data service definition enables access to the `CustomersByCity` service operation. - -[!code-csharp[Astoria Northwind Service#ServiceOperationConfig](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_service/cs/northwind2.svc.cs#serviceoperationconfig)] -[!code-vb[Astoria Northwind Service#ServiceOperationConfig](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_service/vb/northwind2.svc.vb#serviceoperationconfig)] - -> [!NOTE] -> If a service operation has a return type that has been hidden by restricting access on the underlying entity sets, then the service operation will not be available to client applications. - -For more information, see [How to: Define a Service Operation](how-to-define-a-service-operation-wcf-data-services.md). - -## Raising Exceptions - -We recommend that you use the class whenever you raise an exception in the data service execution. This is because the data service runtime knows how to map properties of this exception object correctly to the HTTP response message. When you raise a in a service operation, the returned exception is wrapped in a . To return the base without the enclosing , you must override the method in the , extract the from the , and return it as the top-level error, as in the following example: - -[!code-csharp[Astoria Northwind Service#HandleExceptions](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_service/cs/northwind2.svc.cs#handleexceptions)] -[!code-vb[Astoria Northwind Service#HandleExceptions](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_service/vb/northwind2.svc.vb#handleexceptions)] - -## See also - -- [Interceptors](interceptors-wcf-data-services.md) diff --git a/docs/framework/data/wcf/specify-client-creds-for-a-data-service-request-wcf.md b/docs/framework/data/wcf/specify-client-creds-for-a-data-service-request-wcf.md deleted file mode 100644 index f8379e1292c5e..0000000000000 --- a/docs/framework/data/wcf/specify-client-creds-for-a-data-service-request-wcf.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -description: "Learn more about: How to: Specify Client Credentials for a Data Service Request (WCF Data Services)" -title: "How to: Specify Client Credentials for a Data Service Request (WCF Data Services)" -ms.date: "03/30/2017" -ms.topic: how-to -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, customizing requests" -ms.assetid: 1632f9af-e45f-4363-9222-03823daa8e28 ---- -# How to: Specify Client Credentials for a Data Service Request (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -By default, the client library does not supply credentials when sending a request to an OData service. However, you can specify that credentials be sent to authenticate requests to the data service by supplying a for the property of the . For more information, see [Securing WCF Data Services](securing-wcf-data-services.md). The example in this topic shows how to explicitly provide credentials that are used by the WCF Data Services client when requesting data from the data service. - - The example in this topic uses the Northwind sample data service and autogenerated client data service classes. This service and the client data classes are created when you complete the [WCF Data Services quickstart](quickstart-wcf-data-services.md). You can also use the [Northwind sample data service](https://services.odata.org/Northwind/Northwind.svc/) that is published on the OData Web site; this sample data service is read-only and attempting to save changes returns an error. The sample data services on the OData Web site allow anonymous authentication. - -## Example - - The following example is from the code-behind page for an Extensible Application Markup Language (XAML) file that is the main page of the Windows Presentation Framework application. This example displays a `LoginWindow` instance to collect authentication credentials from the user, and then uses these credentials when making a request to the data service. - - [!code-csharp[Astoria Northwind Client#ClientCredentials](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/clientcredentials.xaml.cs#clientcredentials)] - [!code-vb[Astoria Northwind Client#ClientCredentials](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/clientcredentials.xaml.vb#clientcredentials)] - -## Example - - The following XAML defines the main page of the WPF application. - - [!code-xaml[Astoria Northwind Client#ClientCredentialsXaml](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/clientcredentials.xaml#clientcredentialsxaml)] - -## Example - - The following example is from the code-behind page for the window that is used to collect the authentication credentials from the user before making a request to the data service. - - [!code-csharp[Astoria Northwind Client#ClientCredentialsLogin](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/clientcredentialslogin.xaml.cs#clientcredentialslogin)] - [!code-vb[Astoria Northwind Client#ClientCredentialsLogin](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/clientcredentialslogin.xaml.vb#clientcredentialslogin)] - -## Example - - The following XAML defines the login of the WPF application. - - [!code-xaml[Astoria Northwind Client#ClientCredentialsLoginXaml](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/clientcredentialslogin.xaml#clientcredentialsloginxaml)] - -## .NET Framework Security - - The following security considerations apply to the example in this topic: - -- To verify that the credentials supplied in this sample work, the Northwind data service must use an authentication scheme other than anonymous access. Otherwise, the Web site hosting the data service will not request credentials. - -- User credentials should only be requested during execution and should not be cached. Credentials must always be stored securely. - -- Data sent with Basic and Digest Authentication is not encrypted, so the data can be seen by an adversary. Additionally, basic authentication credentials (user name and password) are sent in cleartext and can be intercepted. - - For more information, see [Securing WCF Data Services](securing-wcf-data-services.md). - -## See also - -- [Securing WCF Data Services](securing-wcf-data-services.md) -- [WCF Data Services Client Library](wcf-data-services-client-library.md) diff --git a/docs/framework/data/wcf/streaming-provider-wcf-data-services.md b/docs/framework/data/wcf/streaming-provider-wcf-data-services.md deleted file mode 100644 index 07f5c1f8180dc..0000000000000 --- a/docs/framework/data/wcf/streaming-provider-wcf-data-services.md +++ /dev/null @@ -1,141 +0,0 @@ ---- -description: "Learn more about: Streaming Provider (WCF Data Services)" -title: "Streaming Provider (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, providers" - - "WCF Data Services, binary data" - - "streaming data provider [WCF Data Services]" - - "WCF Data Services, streams" -ms.assetid: f0978fe4-5f9f-42aa-a5c2-df395d7c9495 ---- -# Streaming Provider (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -A data service can expose large object binary data. This binary data might represent video and audio streams, images, document files, or other types of binary media. When an entity in the data model includes one or more binary properties, the data service returns this binary data encoded as base-64 inside the entry in the response feed. Because loading and serializing large binary data in this manner can affect performance, the Open Data Protocol (OData) defines a mechanism for retrieving binary data independent of the entity to which it belongs. This is accomplished by separating the binary data from the entity into one or more data streams. - -- Media resource - binary data that belongs to an entity, such as a video, audio, image, or other type of media resource stream. - -- Media link entry - an entity that has a reference to a related media resource stream. - -With WCF Data Services, you define a binary resource stream by implementing a streaming data provider. The streaming provider implementation supplies the data service with the media resource stream associated with a specific entity as an object. This implementation enables the data service to accept and return media resources over HTTP as binary data streams of a specified MIME type. - -Configuring a data service to support the streaming of binary data requires the following steps: - -1. Attribute one or more entities in the data model as a media link entry. These entities should not include the binary data to be streamed. Any binary properties of an entity are always returned in the entry as base-64 encoded binary. - -2. Implement the T:System.Data.Services.Providers.IDataServiceStreamProvider interface. - -3. Define a data service that implements the interface. The data service uses the implementation to access the streaming data provider implementation. This method returns the appropriate streaming provider implementation. - -4. Enable large message streams in the Web application configuration. - -5. Enable access to binary resources on the server or in a data source. - -The examples in this topic are based on a sample streaming photo service, which is discussed in depth in the post [Data Services Streaming Provider Series: Implementing a Streaming Provider (Part 1)](/archive/blogs/astoriateam/data-services-streaming-provider-series-implementing-a-streaming-provider-part-1). The source code for the Streaming Photo Data Service sample is available on [GitHub](https://github.com/microsoftarchive/msdn-code-gallery-community-s-z/tree/master/Streaming%20Photo%20OData%20Service%20Sample). - -## Defining a Media Link Entry in the Data Model - -The data source provider determines the way that an entity is defined as a media link entry in the data model. - -**Entity Framework Provider** - -To indicate that an entity is a media link entry, add the `HasStream` attribute to the entity type definition in the conceptual model, as in the following example: - -[!code-xml[Astoria Photo Streaming Service#HasStream](../../../../samples/snippets/xml/VS_Snippets_Misc/astoria_photo_streaming_service/xml/photodata.edmx#hasstream)] - -You must also add the namespace `xmlns:m=http://schemas.microsoft.com/ado/2007/08/dataservices/metadata` either to the entity or to the root of the .edmx or .csdl file that defines the data model. - -For an example of a data service that uses the Entity Framework provider and exposes a media resource, see the post [Data Services Streaming Provider Series: Implementing a Streaming Provider (Part 1)](/archive/blogs/astoriateam/data-services-streaming-provider-series-implementing-a-streaming-provider-part-1). - -**Reflection Provider** - -To indicate that an entity is a media link entry, add the to the class that defines the entity type in the reflection provider. - -**Custom Data Service Provider** - -When using custom service providers, you implement the interface to define the metadata for your data service. For more information, see [Custom Data Service Providers](custom-data-service-providers-wcf-data-services.md). You indicate that a binary resource stream belongs to a by setting the property to `true` on the that represents the entity type, which is a media link entry. - -## Implementing the IDataServiceStreamProvider Interface - -To create a data service that supports binary data streams, you must implement the interface. This implementation enables the data service to return binary data as a stream to the client and consume binary data as a stream sent from the client. The data service creates an instance of this interface whenever it needs to access binary data as a stream. The interface specifies the following members: - -|Member name|Description| -|-----------------|-----------------| -||This method is invoked by the data service to delete the corresponding media resource when its media link entry is deleted. When you implement , this method contains the code that deletes the media resource associated with the supplied media link entry.| -||This method is invoked by the data service to return a media resource as a stream. When you implement , this method contains the code that provides a stream that is used by the data service to the return media resource that is associated with the provided media link entry.| -||This method is invoked by the data service to return the URI that is used to request the media resource for the media link entry. This value is used to create the `src` attribute in the content element of the media link entry and that is used to request the data stream. When this method returns `null`, the data service automatically determines the URI. Use this method when you need to provide clients with direct access to binary data without using the steam provider.| -||This method is invoked by the data service to return the Content-Type value of the media resource that is associated with the specified media link entry.| -||This method is invoked by the data service to return the eTag of the data stream that is associated with the specified entity. This method is used when you manage concurrency for the binary data. When this method returns null, the data service does not track concurrency.| -||This method is invoked by the data service to obtain the stream that is used when receiving the stream sent from the client. When you implement , you must return a writable stream to which the data service writes received stream data.| -||Returns a namespace-qualified type name that represents the type that the data service runtime must create for the media link entry that is associated with the data stream for the media resource that is being inserted.| - -## Creating the Streaming Data Service - -To provide the WCF Data Services runtime with access to the implementation, the data service that you create must also implement the interface. The following example shows how to implement the method to return an instance of the `PhotoServiceStreamProvider` class that implements . - -[!code-csharp[Astoria Photo Streaming Service#PhotoServiceStreamingProvider](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_photo_streaming_service/cs/photodata.svc.cs#photoservicestreamingprovider)] -[!code-vb[Astoria Photo Streaming Service#PhotoServiceStreamingProvider](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_photo_streaming_service/vb/photodata.svc.vb#photoservicestreamingprovider)] - -For general information about how to create a data service, see [Configuring the Data Service](configuring-the-data-service-wcf-data-services.md). - -## Enabling Large Binary Streams in the Hosting Environment - -When you create a data service in an ASP.NET Web application, Windows Communication Foundation (WCF) is used to provide the HTTP protocol implementation. By default, WCF limits the size of HTTP messages to only 65 KB. To be able to stream large binary data to and from the data service, you must also configure the Web application to enable large binary files and to use streams for transfer. To do this, add the following in the `` element of the application's Web.config file: - -> [!NOTE] -> You must use a transfer mode to ensure that the binary data in both the request and response messages are streamed and not buffered by WCF. - -For more information, see [Streaming Message Transfer](../../wcf/feature-details/streaming-message-transfer.md) and [Transport Quotas](../../wcf/feature-details/transport-quotas.md). - -By default, Internet Information Services (IIS) also limits the size of requests to 4 MB. To enable your data service to receive streams larger than 4 MB when running on IIS, you must also set the `maxRequestLength` attribute of the [httpRuntime Element (ASP.NET Settings Schema)](/previous-versions/dotnet/netframework-4.0/e1f13641(v=vs.100)) in the `` configuration section, as shown in the following example: - -## Using Data Streams in a Client Application - -The WCF Data Services client library enables you to both retrieve and update these exposed resources as binary streams on the client. For more information, see [Working with Binary Data](working-with-binary-data-wcf-data-services.md). - -## Considerations for Working with a Streaming Provider - -The following are things to consider when you implement a streaming provider and when you access media resources from a data service. - -- MERGE requests are not supported for media resources. Use a PUT request to change the media resource of an existing entity. - -- A POST request cannot be used to create a new media link entry. Instead, you must issue a POST request to create a new media resource, and the data service creates a new media link entry with default values. This new entity can be updated by a subsequent MERGE or PUT request. You may also consider caching the entity and make updates in the disposer, such as setting the property value to the value of the Slug header in the POST request. - -- When a POST request is received, the data service calls to create the media resource before it calls to create the media link entry. - -- An implementation of should not return a object. When you use this kind of stream, memory resource issues will occur when the service receives very large data streams. - -- The following are things to consider when storing media resources in a database: - - - A binary property that is a media resource should not be included in the data model. All properties exposed in a data model are returned in the entry in a response feed. - - - To improve performance with a large binary stream, we recommend that you create a custom stream class to store binary data in the database. This class is returned by your implementation and sends the binary data to the database in chunks. For a SQL Server database, we recommend that you use a FILESTREAM to stream data into the database when the binary data is larger than 1 MB. - - - Ensure that your database is designed to store the binary large streams that are to be received by your data service. - - - When a client sends a POST request to insert a media link entry with a media resource in a single request, is called to obtain the stream before the data service inserts the new entity into the database. A streaming provider implementation must be able to handle this data service behavior. Consider using a separate data table to store the binary data or store the data stream in a file until after the entity has been inserted into the database. - -- When you implement the , , or methods, you must use the eTag and Content-Type values that are supplied as method parameters. Do not set eTag or Content-Type headers in your provider implementation. - -- By default, the client sends large binary streams by using a chunked HTTP Transfer-Encoding. Because the ASP.NET Development Server does not support this kind of encoding, you cannot use this Web server to host a streaming data service that must accept large binary streams. For more information on ASP.NET Development Server, see [Web Servers in Visual Studio for ASP.NET Web Projects](/previous-versions/aspnet/58wxa9w5(v=vs.120)). - - - -## Versioning Requirements - -The streaming provider has the following OData protocol versioning requirements: - -- The streaming provider requires that the data service support version 2.0 of the OData protocol and later versions. - -For more information, see [Data Service Versioning](data-service-versioning-wcf-data-services.md). - -## See also - -- [Data Services Providers](data-services-providers-wcf-data-services.md) -- [Custom Data Service Providers](custom-data-service-providers-wcf-data-services.md) -- [Working with Binary Data](working-with-binary-data-wcf-data-services.md) diff --git a/docs/framework/data/wcf/toc.yml b/docs/framework/data/wcf/toc.yml index df31a7fbb52a8..fe51488c7066f 100644 --- a/docs/framework/data/wcf/toc.yml +++ b/docs/framework/data/wcf/toc.yml @@ -1,164 +1 @@ -- name: WCF Data Services 4.5 - href: index.md - items: - - name: Overview - href: wcf-data-services-overview.md - - name: Getting Started - href: getting-started-with-wcf-data-services.md - items: - - name: Exposing Your Data as a Service - href: exposing-your-data-as-a-service-wcf-data-services.md - - name: Accessing Data Service Resources - href: accessing-data-service-resources-wcf-data-services.md - - name: Using a Data Service in a Client Application - href: using-a-data-service-in-a-client-application-wcf-data-services.md - - name: Quickstart - href: quickstart-wcf-data-services.md - items: - - name: Creating the Data Service - href: creating-the-data-service.md - - name: Accessing the Service from a Web Browser - href: accessing-the-service-from-a-web-browser-wcf-data-services-quickstart.md - - name: Creating the .NET Framework Client Application - href: creating-the-dotnet-client-application-wcf-data-services-quickstart.md - - name: Application Scenarios - href: application-scenarios-wcf-data-services.md - - name: Resources - href: wcf-data-services-resources.md - - name: Defining WCF Data Services - href: defining-wcf-data-services.md - items: - - name: Configuring the Data Service - href: configuring-the-data-service-wcf-data-services.md - items: - - name: "How to: Develop a WCF Data Service Running on IIS" - href: how-to-develop-a-wcf-data-service-running-on-iis.md - - name: "How to: Enable Access to the Data Service" - href: how-to-enable-access-to-the-data-service-wcf-data-services.md - - name: "How to: Enable Paging of Data Service Results" - href: how-to-enable-paging-of-data-service-results-wcf-data-services.md - - name: Data Services Providers - href: data-services-providers-wcf-data-services.md - items: - - name: Entity Framework Provider - href: entity-framework-provider-wcf-data-services.md - items: - - name: "How to: Create a Data Service Using an ADO.NET Entity Framework Data Source" - href: create-a-data-service-using-an-adonet-ef-data-wcf.md - - name: Reflection Provider - href: reflection-provider-wcf-data-services.md - items: - - name: "How to: Create a Data Service Using the Reflection Provider" - href: create-a-data-service-using-rp-wcf-data-services.md - - name: "How to: Create a Data Service Using a LINQ to SQL Data Source" - href: create-a-data-service-using-linq-to-sql-wcf.md - - name: Custom Data Service Providers - href: custom-data-service-providers-wcf-data-services.md - - name: Streaming Provider - href: streaming-provider-wcf-data-services.md - - name: Service Operations - href: service-operations-wcf-data-services.md - items: - - name: "How to: Define a Service Operation" - href: how-to-define-a-service-operation-wcf-data-services.md - - name: Feed Customization - href: feed-customization-wcf-data-services.md - items: - - name: "How to: Customize Feeds with the Entity Framework Provider" - href: how-to-customize-feeds-with-ef-provider-wcf-data-services.md - - name: "How to: Customize Feeds with the Reflection Provider" - href: how-to-customize-feeds-with-the-reflection-provider-wcf-data-services.md - - name: Interceptors - href: interceptors-wcf-data-services.md - items: - - name: "How to: Intercept Data Service Messages" - href: how-to-intercept-data-service-messages-wcf-data-services.md - - name: Developing and Deploying WCF Data Services - href: developing-and-deploying-wcf-data-services.md - - name: Securing WCF Data Services - href: securing-wcf-data-services.md - - name: Hosting the Data Service - href: hosting-the-data-service-wcf-data-services.md - - name: Data Service Versioning - href: data-service-versioning-wcf-data-services.md - - name: WCF Data Services Protocol Implementation Details - href: wcf-data-services-protocol-implementation-details.md - - name: Using actions to implement server-side behavior - href: using-actions-to-implement-server-side-behavior.md - - name: WCF Data Services Client Library - href: wcf-data-services-client-library.md - items: - - name: Generating the Data Service Client Library - href: generating-the-data-service-client-library-wcf-data-services.md - items: - - name: WCF Data Service Client Utility (DataSvcUtil.exe) - href: wcf-data-service-client-utility-datasvcutil-exe.md - - name: "How to: Add a Data Service Reference" - href: how-to-add-a-data-service-reference-wcf-data-services.md - - name: "How to: Manually Generate Client Data Service Classes" - href: how-to-manually-generate-client-data-service-classes-wcf-data-services.md - - name: Querying the Data Service - href: querying-the-data-service-wcf-data-services.md - items: - - name: Query Projections - href: query-projections-wcf-data-services.md - items: - - name: "How to: Project Query Results" - href: how-to-project-query-results-wcf-data-services.md - - name: LINQ Considerations - href: linq-considerations-wcf-data-services.md - - name: Object Materialization - href: object-materialization-wcf-data-services.md - - name: "How to: Execute Data Service Queries" - href: how-to-execute-data-service-queries-wcf-data-services.md - - name: "How to: Add Query Options to a Data Service Query" - href: how-to-add-query-options-to-a-data-service-query-wcf-data-services.md - - name: "How to: Determine the Number of Entities Returned by a Query" - href: number-of-entities-returned-by-a-query-wcf.md - - name: "How to: Specify Client Credentials for a Data Service Request" - href: specify-client-creds-for-a-data-service-request-wcf.md - - name: "How to: Set Headers in the Client Request" - href: how-to-set-headers-in-the-client-request-wcf-data-services.md - - name: Loading Deferred Content - href: loading-deferred-content-wcf-data-services.md - items: - - name: "How to: Load Related Entities" - href: how-to-load-related-entities-wcf-data-services.md - - name: "How to: Load Paged Results" - href: how-to-load-paged-results-wcf-data-services.md - - name: Updating the Data Service - href: updating-the-data-service-wcf-data-services.md - items: - - name: "How to: Add, Modify, and Delete Entities" - href: how-to-add-modify-and-delete-entities-wcf-data-services.md - - name: "How to: Define Entity Relationships" - href: how-to-define-entity-relationships-wcf-data-services.md - - name: "How to: Attach an Existing Entity to the DataServiceContext" - href: attach-an-existing-entity-to-dc-wcf-data.md - - name: Asynchronous Operations - href: asynchronous-operations-wcf-data-services.md - items: - - name: "How to: Execute Asynchronous Data Service Queries" - href: how-to-execute-asynchronous-data-service-queries-wcf-data-services.md - - name: "How to: Create an Asynchronous Windows Presentation Framework Application" - href: create-an-asynchronous-wpf-application-wcf-data-services.md - - name: Batching Operations - href: batching-operations-wcf-data-services.md - items: - - name: "How to: Execute Queries in a Batch" - href: how-to-execute-queries-in-a-batch-wcf-data-services.md - - name: Binding Data to Controls - href: binding-data-to-controls-wcf-data-services.md - items: - - name: "How to: Bind Data to Windows Presentation Foundation Elements" - href: bind-data-to-wpf-elements-wcf-data-services.md - - name: "How to: Bind Data Using a Project Data Source" - href: how-to-bind-data-using-a-project-data-source-wcf-data-services.md - - name: "How to: Customize Data Binding Behaviors" - href: how-to-customize-data-binding-behaviors-wcf-data-services.md - - name: Calling Service Operations - href: calling-service-operations-wcf-data-services.md - - name: Managing the Data Service Context - href: managing-the-data-service-context-wcf-data-services.md - - name: Working with Binary Data - href: working-with-binary-data-wcf-data-services.md +[] diff --git a/docs/framework/data/wcf/updating-the-data-service-wcf-data-services.md b/docs/framework/data/wcf/updating-the-data-service-wcf-data-services.md deleted file mode 100644 index 55b0ee926a5fb..0000000000000 --- a/docs/framework/data/wcf/updating-the-data-service-wcf-data-services.md +++ /dev/null @@ -1,105 +0,0 @@ ---- -description: "Learn more about: Updating the Data Service (WCF Data Services)" -title: "Updating the Data Service (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, changing data" - - "WCF Data Services, client library" -ms.assetid: 00d993be-ffed-4dea-baf7-6eea982cdb54 ---- -# Updating the Data Service (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -When you use the WCF Data Services client library to consume an Open Data Protocol (OData) feed, the library translates the entries in the feed into instances of client data service classes. These data service classes are tracked by using the to which the belongs. The client tracks changes to entities that you report by using methods on . These methods enable the client to track added and deleted entities and also changes that you make to property values or to relationships between entity instances. Those tracked changes are sent back to the data service as REST-based operations when you call the method. - -> [!NOTE] -> When you use an instance of to bind data to controls, changes made to data in the bound control are automatically reported to the . For more information, see [Binding Data to Controls](binding-data-to-controls-wcf-data-services.md). - -## Adding, Modifying, and Changing Entities - - When you use the **Add Service Reference** dialog in Visual Studio to add a reference to an OData feed, the resulting client data service classes each have a static *Create* method that takes one parameter for each non-nullable entity property. You can use this method to create instances of entity type classes, as in the following example: - - [!code-csharp[Astoria Northwind Client#CreateNewProduct](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#createnewproduct)] - [!code-vb[Astoria Northwind Client#CreateNewProduct](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#createnewproduct)] - - To add an entity instance, call the appropriate *AddTo* method on the class generated by the **Add Service Reference** dialog box, as in the following example: - - [!code-csharp[Astoria Northwind Client#AddProductSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#addproductspecific)] - [!code-vb[Astoria Northwind Client#AddProductSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#addproductspecific)] - - This adds the object to the context and into the correct entity set. You can also call , but you must instead supply the entity set name. If the added entity has one or more relationships to other entities, you can either use the method or use one of the previous methods and also explicitly define those links. These operations are discussed later in this topic. - - To modify an existing entity instance, first query for that entity, make the desired changes to its properties, and then call the method on the to indicate to the client library that it needs to send an update for that object, as shown in the following example: - - [!code-csharp[Astoria Northwind Client#ModifyCustomerSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#modifycustomerspecific)] - [!code-vb[Astoria Northwind Client#ModifyCustomerSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#modifycustomerspecific)] - - To delete an entity instance, call the method on the , as shown in the following example: - - [!code-csharp[Astoria Northwind Client#DeleteProductSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#deleteproductspecific)] - [!code-vb[Astoria Northwind Client#DeleteProductSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#deleteproductspecific)] - - For more information, see [How to: Add, Modify, and Delete Entities](how-to-add-modify-and-delete-entities-wcf-data-services.md). - -## Attaching Entities - - The client library enables you to save updates that you made to an entity without first executing a query to load the entity into the . Use the method to attach an existing object to a specific entity set in the . You can then modify the object and save the changes to the data service. In the following example, a customer object that has been changed is attached to the context and then is called to mark the attached object as before is called: - - [!code-csharp[Astoria Northwind Client#AttachObjectSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#attachobjectspecific)] - [!code-vb[Astoria Northwind Client#AttachObjectSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#attachobjectspecific)] - - The following considerations apply when attaching objects: - -- An object is attached in the state. - -- When an object is attached, objects that are related to the attached object are not also attached. - -- An object cannot be attached if the entity is already being tracked by the context. - -- The method overload that takes an `etag` parameter is used when you attach an entity object that was received along with an eTag value. This eTag value is then used to check for concurrency when changes to the attached object are saved. - - For more information, see [How to: Attach an Existing Entity to the DataServiceContext](attach-an-existing-entity-to-dc-wcf-data.md). - -## Creating and Modifying Relationship Links - - When you add a new entity by using either the method or the appropriate *AddTo* method of the class that the **Add Service Reference** dialog generates, any relationships between the new entity and related entities are not automatically defined. - - You can create and change relationships between entity instances and have the client library reflect those changes in the data service. Relationships between entities are defined as associations in the model, and the tracks each relationship as a link object in the context. WCF Data Services provides the following methods on the class to create, modify, and delete these links: - -|Method|Description| -|------------|-----------------| -||Creates a new link between two related entity objects. Calling this method is equivalent to calling and to both create the new object and define the relationship to an existing object.| -||Creates a new link between two related entity objects.| -||Updates an existing link between two related entity objects. is also used to delete links with a cardinality of zero-or-one-to-one (`0..1:1`) and one-to-one (`1:1`). You can do this by setting the related object to `null`.| -||Marks a link that the context is tracking for deletion when the method is called. Use this method when you delete a related object or change a relationship by first deleting the link to an existing object and then adding a link to the new related object.| -||Notifies the context of an existing link between two entity objects. The context assumes that this relationship already exists in the data service and does not try to create the link when you call the method. Use this method when you attach objects to a context and need to also attach the link between the two. If you are defining a new relationship, you should instead use .| -||Stops tracking the specified link in the context. This method is used to delete one-to-many (`*:*`) relationships. For relationship links with a cardinality of one, you must instead use .| - - The following example shows how to use the method to add a new `Order_Detail` that is related to an existing `Orders` entity. Because the new `Order_Details` object is now tracked by the , the relationship of the added `Order_Details` object to the existing `Products` entity is defined by calling the method: - - [!code-csharp[Astoria Northwind Client#AddOrderDetailToOrderSpecific](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#addorderdetailtoorderspecific)] - [!code-vb[Astoria Northwind Client#AddOrderDetailToOrderSpecific](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#addorderdetailtoorderspecific)] - - While the method defines links that must be created in the data service, to have these links reflected in the objects that are in the context, you must also set the navigation properties on the objects themselves. In the previous example, you should set the navigation properties as follows: - - [!code-csharp[Astoria Northwind Client#SetNavProps](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_northwind_client/cs/source.cs#setnavprops)] - [!code-vb[Astoria Northwind Client#SetNavProps](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_northwind_client/vb/source.vb#setnavprops)] - - For more information, see [How to: Define Entity Relationships](how-to-define-entity-relationships-wcf-data-services.md). - -## Saving Changes - - Changes are tracked in the instance but not sent to the server immediately. After you are finished with the required changes for a specified activity, call to submit all the changes to the data service. For more information, see [Managing the Data Service Context](managing-the-data-service-context-wcf-data-services.md). You can also save changes asynchronously by using the and methods. For more information, see [Asynchronous Operations](asynchronous-operations-wcf-data-services.md). - -## See also - -- [WCF Data Services Client Library](wcf-data-services-client-library.md) -- [Querying the Data Service](querying-the-data-service-wcf-data-services.md) -- [Asynchronous Operations](asynchronous-operations-wcf-data-services.md) -- [Batching Operations](batching-operations-wcf-data-services.md) -- [Object Materialization](object-materialization-wcf-data-services.md) -- [Managing the Data Service Context](managing-the-data-service-context-wcf-data-services.md) diff --git a/docs/framework/data/wcf/using-a-data-service-in-a-client-application-wcf-data-services.md b/docs/framework/data/wcf/using-a-data-service-in-a-client-application-wcf-data-services.md deleted file mode 100644 index 99c244ee3f3ef..0000000000000 --- a/docs/framework/data/wcf/using-a-data-service-in-a-client-application-wcf-data-services.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -description: "Learn more about: Using a Data Service in a Client Application (WCF Data Services)" -title: "Using a Data Service in a Client Application (WCF Data Services)" -ms.date: "03/30/2017" -helpviewer_keywords: - - "WCF Data Services, client library" - - "WCF Data Services, getting started" -ms.assetid: 90872d0c-e989-4490-b3e9-54afb10d33d4 ---- -# Using a Data Service in a Client Application (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -You can access a service that exposes an Open Data Protocol (OData) feed by supplying a URI to a Web browser. The URI provides the address of a resource, and request messages are sent to these addresses to access or change the underlying data that the resource represents. The browser issues an HTTP GET command and returns the requested resource as an OData feed. For more information, see [Accessing the Service from a Web Browser](accessing-the-service-from-a-web-browser-wcf-data-services-quickstart.md). - - Although a Web browser may be useful for testing that an OData service returns the expected data, production OData services that enable you to also create, update, and delete data are generally accessed by application code or scripting languages in a Web page. This topic provides an overview of how to access OData feeds from a client application. - -## Accessing and Changing Data Using REST Semantics - - OData helps guarantee interoperability between services that expose OData feeds and applications that consume OData feeds. Applications access and change data in an OData-based service by sending request messages of a specific HTTP action and with a URI that addresses an entity resource against which the action should be performed. When entity data must be supplied, it is supplied as a specifically encoded payload in the body of the message. - -### HTTP Actions - - OData supports the following HTTP actions to perform create, read, update, and delete operations on the entity data that the addressed resource represents: - -- **HTTP GET** - This is the default action when a resource is accessed from a browser. No payload is supplied in the request message, and a response method with a payload that contains the requested data is returned. - -- **HTTP POST** - Inserts new entity data into the supplied resource. Data to be inserted is supplied in the payload of the request message. The payload of the response message contains the data for the newly created entity. This includes any autogenerated key values. The header also contains the URI that addresses the new entity resource. - -- **HTTP DELETE** - Deletes the entity data that the specified resource represents. A payload is not present in the request or response messages. - -- **HTTP PUT** - Replaces existing entity data at the requested resource with new data that is supplied in the payload of the request message. - -- **HTTP MERGE** - Because of inefficiencies in executing a delete followed by an insert in the data source just to change entity data, OData introduces a new HTTP MERGE action. The payload of the request message contains the properties that must be changed on the addressed entity resource. Because HTTP MERGE is not defined in the HTTP specification, it may require additional processing to route a HTTP MERGE request through non-OData aware servers. - - For more information, see [OData: Operations](https://www.odata.org/documentation/odata-version-2-0/operations/). - -### Payload Formats - - For an HTTP PUT, HTTP POST, or HTTP MERGE request, the payload of a request message contains the entity data that you send to the data service. The contents of the payload depend on the data format of the message. The HTTP responses to all actions except DELETE also contain such a payload. OData supports the following payload formats for accessing and changing data with the service: - -- **Atom** - An XML-based message encoding that is defined by OData as an extension to the Atom Publishing Protocol (AtomPub) to enable data exchange over HTTP for Web feeds, podcasts, wikis, and XML-based Internet functionality. For more information, see [OData: Atom Format](https://www.odata.org/documentation/odata-version-2-0/atom-format/). - -- **JSON** - JavaScript Object Notation (JSON) is a lightweight data interchange format that is based on a subset of the JavaScript Programming Language. For more information, see [OData: JSON Format](https://www.odata.org/documentation/odata-version-2-0/json-format/). - - The message format of the payload is requested in the header of the HTTP request message. For more information, see [OData: Operations](https://www.odata.org/documentation/odata-version-2-0/operations/). - -## Accessing and Changing Data Using Client Libraries - - WCF Data Services includes client libraries that enable you to more easily consume an OData feed from .NET Framework and Silverlight-based client applications. These libraries simplify sending and receiving HTTP messages. They also translate the message payload into CLR objects that represent entity data. The client libraries feature the two core classes and . These classes enable you to query a data service and then work with the returned entity data as CLR objects. For more information, see [WCF Data Services Client Library](wcf-data-services-client-library.md) and [WCF Data Services (Silverlight)](/previous-versions/windows/silverlight/dotnet-windows-silverlight/cc838234(v=vs.95)). - - You can use the **Add Service Reference** dialog in Visual Studio to add a reference to a data service. This tool requests the service metadata from a referenced data service and generates the that represents a data service, as well as generates the client data service classes that represent entities. For more information, see [Generating the Data Service Client Library](generating-the-data-service-client-library-wcf-data-services.md). - - There are programming libraries available that you can use to consume an OData feed in other kinds of client applications. For more information on OData SDK, see [OData SDK - Sample Code](https://www.odata.org/ecosystem/#sdk). - -## See also - -- [Accessing Data Service Resources](accessing-data-service-resources-wcf-data-services.md) -- [Quickstart](quickstart-wcf-data-services.md) diff --git a/docs/framework/data/wcf/using-actions-to-implement-server-side-behavior.md b/docs/framework/data/wcf/using-actions-to-implement-server-side-behavior.md deleted file mode 100644 index e0e324e6f95da..0000000000000 --- a/docs/framework/data/wcf/using-actions-to-implement-server-side-behavior.md +++ /dev/null @@ -1,95 +0,0 @@ ---- -description: "Learn more about: Using actions to implement server-side behavior" -title: "Using actions to implement server-side behavior" -ms.date: "03/30/2017" -ms.assetid: 11a372db-7168-498b-80d2-9419ff557ba5 ---- -# Using actions to implement server-side behavior - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -OData Actions provide a way to implement a behavior that acts upon a resource retrieved from an OData service. For example consider a digital movie as a resource, there are many things you may do with a digital movie: check-out, rate/comment, or check-in. These are all examples of Actions that may be implemented by a WCF Data Service that manages digital movies. Actions are described in an OData response that contains a resource on which the Action can be invoked. When a user requests a resource that represents a digital movie the response returned from the WCF Data Service contains information about the Actions that are available for that resource. The availability of an Action can depend on the state of the data service or resource. For example once a digital movie is checked out it cannot be checked out by another user. Clients can invoke an action simply by specifying a URL. For example, `http://MyServer/MovieService.svc/Movies(6)` would identify a specific digital movie and `http://MyServer/MovieService.svc/Movies(6)/Checkout` would invoke the action on the specific movie. Actions allow you to expose you service model without exposing your data model. Continuing with the movie service example, you may wish to allow a user to rate a movie, but not directly expose the rating data as a resource. You could implement a Rate Action to allow the user to rate a movie but not directly access the rating data as a resource. - -## Implementing an action - - To implement a service action you must implement the , [IDataServiceActionProvider](/previous-versions/dotnet/wcf-data-services/hh859915(v=vs.103)), and [IDataServiceInvokable](/previous-versions/dotnet/wcf-data-services/hh859893(v=vs.103)) interfaces. allows WCF Data Services to get your implementation of [IDataServiceActionProvider](/previous-versions/dotnet/wcf-data-services/hh859915(v=vs.103)). [IDataServiceActionProvider](/previous-versions/dotnet/wcf-data-services/hh859915(v=vs.103)) allows WCF Data Services to create, find, describe and invoke service actions. [IDataServiceInvokable](/previous-versions/dotnet/wcf-data-services/hh859893(v=vs.103)) allows you to invoke the code that implements the service actions’ behavior and get the results, if any. Keep in mind that WCF Data Services are Per-Call WCF Services, a new instance of the service will be created each time the service is called. Make sure no unnecessary work is done when the service is created. - -### IServiceProvider - - contains a method called . This method is called by WCF Data Services to retrieve a number of service providers, including metadata service providers and data service action providers. When asked for a data service action provider, return your [IDataServiceActionProvider](/previous-versions/dotnet/wcf-data-services/hh859915(v=vs.103)) implementation. - -### IDataServiceActionProvider - - [IDataServiceActionProvider](/previous-versions/dotnet/wcf-data-services/hh859915(v=vs.103)) contains methods that allow you to retrieve information about the available actions. When you implement [IDataServiceActionProvider](/previous-versions/dotnet/wcf-data-services/hh859915(v=vs.103)) you are augmenting the metadata for your service which is defined by your service’s implementation of [IDataServiceActionProvider](/previous-versions/dotnet/wcf-data-services/hh859915(v=vs.103)) with Actions and handling dispatch to those actions as appropriate. - -#### AdvertiseServiceAction - - The [AdvertiseServiceAction method](/previous-versions/dotnet/wcf-data-services/hh859971(v=vs.103)) is called to determine what actions are available for the specified resource. This method is only called for actions that are not always available. It is used to check if the action should be included in the OData response based upon the state of the resource being requested or the state of the service. How this check is accomplished is completely up to you. If it is an expensive to calculate availability and the current resource is in a feed, it is acceptable to skip the check and advertise the action. The `inFeed` parameter is set to `true` if the current resource being returned is part of a feed. - -#### CreateInvokable - - [CreateInvokable](/previous-versions/dotnet/wcf-data-services/hh859940(v=vs.103)) is called to create a [IDataServiceInvokable](/previous-versions/dotnet/wcf-data-services/hh859893(v=vs.103)) that contains a delegate that encapsulates the code that implements the action’s behavior. This creates the [IDataServiceInvokable](/previous-versions/dotnet/wcf-data-services/hh859893(v=vs.103)) instance but does not invoke the action. WCF Data Service Actions have side effects and need to work in conjunction with the Update Provider to save those changes to disk. The [IDataServiceInvokable.Invoke](/previous-versions/dotnet/wcf-data-services/hh859924(v=vs.103)) method is called from the Update Provider’s SaveChanges() method is called. - -#### GetServiceActions - - This method returns a collection of [ServiceAction](/previous-versions/dotnet/wcf-data-services/hh544089(v=vs.103)) instances that represent all of the actions a WCF Data Service exposes. [ServiceAction](/previous-versions/dotnet/wcf-data-services/hh544089(v=vs.103)) is the metadata representation of an Action and includes information like the Action name, its parameters, and its return type. - -#### GetServiceActionsByBindingParameterType - - This method returns a collection of all [ServiceAction](/previous-versions/dotnet/wcf-data-services/hh544089(v=vs.103)) instances that can be bound to the specified binding parameter type. In other words, all [ServiceAction](/previous-versions/dotnet/wcf-data-services/hh544089(v=vs.103))s that can act on the specified resource type (also called binding parameter type).This is used when the service returns a resource in order to include information about Actions that can be invoked against that resource. This method should only return actions that can bind to the exact binding parameter type (no derived types). This method is called once per request per type encountered and the result is cached by WCF Data Services. - -#### TryResolveServiceAction - - This method searches for a specified [ServiceAction](/previous-versions/dotnet/wcf-data-services/hh544089(v=vs.103)) and returns `true` if the [ServiceAction](/previous-versions/dotnet/wcf-data-services/hh544089(v=vs.103)) is found. If found, the [ServiceAction](/previous-versions/dotnet/wcf-data-services/hh544089(v=vs.103)) is returned in the `serviceAction` `out` parameter. - -### IDataServiceInvokable - - This interface provides a way to execute a WCF Data Service Action. When implementing IDataServiceInvokable you are responsible for 3 things: - -1. Capturing and potentially marshaling the parameters - -2. Dispatching the parameters to the code that actually implements the Action when Invoke() is called - -3. Storing any results from Invoke() so they can be retrieved using GetResult() - - The parameters may be passed as tokens. This is because it is possible to write a Data Service Provider that works with tokens that represent resources, if this is the case you may need to convert (marshal) these tokens into actual resources before dispatching to the actual action. After the parameter has been marshaled, it must be in an editable state so that any changes to the resource that occur when the action is invoked will be saved and written to disk. - - This interface requires two methods: Invoke and GetResult. Invoke invokes the delegate that implements the action’s behavior and GetResult returns the result of the action. - -## Invoking a WCF Data Service Action - - Actions are invoked using an HTTP POST request. The URL specifies the resource followed by the action name. Parameters are passed in the body of the request. For example if there was a service called MovieService which exposed an action called Rate. You could use the following URL to invoke the Rate action on a specific movie: - - `http://MovieServer/MovieService.svc/Movies(1)/Rate` - - Movies(1) specifies the movie you wish to rate and Rate specifies the Rate action. The actual value of the rating will be in the body of the HTTP request as shown in the following example: - -```http -POST http://MovieServer/MoviesService.svc/Movies(1)/Rate HTTP/1.1 -Content-Type: application/json -Content-Length: 20 -Host: localhost:15238 -{ - "rating": 4 -} -``` - -> [!WARNING] -> The above sample code will work only with WCF Data Services 5.2 and later which has support for JSON light. If using an earlier version of WCF Data Services, you must specify the json verbose content-type as follows: `application/json;odata=verbose`. - - Alternatively you can invoke an action using the WCF Data Services Client as shown in the following code snippet. - -```csharp -MoviesModel context = new MoviesModel (new Uri("http://MyServer/MoviesService.svc/")); -//... -context.Execute(new Uri("http://MyServer/MoviesService.svc/Movies(1)/Rate"), "POST", new BodyOperationParameter("rating",4) ); -``` - - In the code snippet above, the `MoviesModel` class was generated by using Visual Studio to Add Service Reference to a WCF Data Service. - -## See also - -- [WCF Data Services 4.5](index.md) -- [Defining WCF Data Services](defining-wcf-data-services.md) -- [Developing and Deploying WCF Data Services](developing-and-deploying-wcf-data-services.md) -- [Custom Data Service Providers](custom-data-service-providers-wcf-data-services.md) diff --git a/docs/framework/data/wcf/wcf-data-service-client-utility-datasvcutil-exe.md b/docs/framework/data/wcf/wcf-data-service-client-utility-datasvcutil-exe.md deleted file mode 100644 index d0590b723b09d..0000000000000 --- a/docs/framework/data/wcf/wcf-data-service-client-utility-datasvcutil-exe.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -description: "Learn more about: WCF Data Service Client Utility (DataSvcUtil.exe)" -title: "WCF Data Service Client Utility (DataSvcUtil.exe)" -ms.date: "03/30/2017" -helpviewer_keywords: - - "WCF Data Services, generating client data classes" - - "WCF Data Services, client library" - - "WCF Data Services, consuming" -ms.assetid: 9d0af606-929b-4c03-b307-3ef5f705afce ---- -# WCF Data Service Client Utility (DataSvcUtil.exe) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -DataSvcUtil.exe is a command-line tool provided by WCF Data Services that consumes an Open Data Protocol (OData) feed and generates the client data service classes that are needed to access a data service from a .NET Framework client application. This utility can generate data classes by using the following metadata sources: - -- The root URI of a data service. The utility requests the service metadata document, which describes the data model exposed by the data service. For more information, see [AtomPub (RFC5023)](https://tools.ietf.org/html/rfc5023#section-8). - -- A data model file (.csdl) defined by using the conceptual schema definition language (CSDL), as defined in the [\[MC-CSDL\]: Conceptual Schema Definition File Format](/openspecs/windows_protocols/mc-csdl/c03ad8c3-e8b7-4306-af96-a9e52bb3df12) specification. - -- An .edmx file created by using the Entity Data Model tools that are provided with the Entity Framework. For more information, see the [\[MC-EDMX\]: Entity Data Model for Data Services Packaging Format](/openspecs/windows_protocols/mc-edmx/5dff5e25-56a1-408b-9d44-bff6634c7d16) specification. - -For more information, see [How to: Manually Generate Client Data Service Classes](how-to-manually-generate-client-data-service-classes-wcf-data-services.md). - -The DataSvcUtil.exe tool is installed in the .NET Framework directory. In many cases, this is located in *C:\Windows\Microsoft.NET\Framework\v4.0*. For 64-bit systems, this is located in *C:\Windows\Microsoft.NET\Framework64\v4.0*. You can also access the DataSvcUtil.exe tool from Developer Command Prompt for Visual Studio. - -## Syntax - -```console -datasvcutil /out:file [/in:file | /uri:serviceuri] [/dataservicecollection] [/language:devlang] [/nologo] [/version:ver] [/help] -``` - -## Parameters - -|Option|Description| -|------------|-----------------| -|`/dataservicecollection`|Specifies that the code required to bind objects to controls is also generated.| -|`/help`

-or-

`/?`|Displays command syntax and options for the tool.| -|`/in:` *\*|Specifies the .csdl or .edmx file or a directory where the file is located.| -|`/language:`[VB|CSharp]|Specifies the language for the generated source code files. The language defaults to C#.| -|`/nologo`|Suppresses the copyright message from displaying.| -|`/out:` *\*|Specifies the name of the source code file that contains the generated client data service classes.| -|`/uri:` *\*|The URI of the OData feed.| -|`/version:`[1.0|2.0]|Specifies the highest accepted version of OData. The version is determined based on the `DataServiceVersion` attribute of the DataService element in the returned data service metadata. For more information, see [Data Service Versioning](data-service-versioning-wcf-data-services.md). When you specify the `/dataservicecollection` parameter, you must also specify `/version:2.0` to enable data binding.| - -## See also - -- [Generating the Data Service Client Library](generating-the-data-service-client-library-wcf-data-services.md) -- [How to: Add a Data Service Reference](how-to-add-a-data-service-reference-wcf-data-services.md) diff --git a/docs/framework/data/wcf/wcf-data-services-client-library.md b/docs/framework/data/wcf/wcf-data-services-client-library.md deleted file mode 100644 index b1233d2466d93..0000000000000 --- a/docs/framework/data/wcf/wcf-data-services-client-library.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -title: "WCF Data Services Client Library" -description: Learn how to use WCF Data Services client libraries to access and change data from a .NET Framework client application. -ms.date: "03/30/2017" -helpviewer_keywords: - - "WCF Data Services, client library" - - "DataServiceQuery class, about DataServiceQuery class" - - "DataServiceContext class, about DataServiceContext class" -ms.assetid: 21075e50-8917-413e-a8ea-35a0f6e65aa5 ---- -# WCF Data Services Client Library - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -Any application can interact with an Open Data Protocol (OData)-based data service if it can send an HTTP request and process the OData feed that a data service returns. This interoperability enables you to access OData-based services from a broad range of Web-enabled applications. WCF Data Services includes client libraries that provide a richer programming experience when you consume OData feeds from .NET Framework or Silverlight-based applications. - - The two main classes of the client library are the class and the class. The class encapsulates operations that are supported against a specified data service. Although OData services are stateless, the context is not. Therefore, you can use the class to maintain state on the client between interactions with the data service in order to support features such as change management. This class also manages identities and tracks changes. The class represents a query against a specific entity set. - - This section describes how to use client libraries to access and change data from a .NET Framework client application. For more information about how to use the WCF Data Services client library with a Silverlight-based application, see [WCF Data Services (Silverlight)](/previous-versions/windows/silverlight/dotnet-windows-silverlight/cc838234(v=vs.95)). Other client libraries are available that enable you to consume an OData feed in other kinds of applications. For more information on OData SDK, see [OData SDK - Sample Code](https://www.odata.org/ecosystem/#sdk). - -## In This Section - - [Generating the Data Service Client Library](generating-the-data-service-client-library-wcf-data-services.md) - Describes how to generate a client library and client data service classes that are based on OData feeds. - - [Querying the Data Service](querying-the-data-service-wcf-data-services.md) - Describes how to query a data service from a .NET Framework-based application by using client libraries. - - [Loading Deferred Content](loading-deferred-content-wcf-data-services.md) - Describes how to load additional content not included in the initial query response. - - [Updating the Data Service](updating-the-data-service-wcf-data-services.md) - Describes how to create, modify, and delete entities and relationships by using the client libraries. - - [Asynchronous Operations](asynchronous-operations-wcf-data-services.md) - Describes the facilities provided by the client libraries for working with a data service in an asynchronous manner. - - [Batching Operations](batching-operations-wcf-data-services.md) - Describes how to send multiple requests to the data service in a single batch by using the client libraries. - - [Binding Data to Controls](binding-data-to-controls-wcf-data-services.md) - Describes how to bind controls to a OData feed returned by a data service. - - [Calling Service Operations](calling-service-operations-wcf-data-services.md) - Describes how to use the client library to call service operations. - - [Managing the Data Service Context](managing-the-data-service-context-wcf-data-services.md) - Describes options for managing the behavior of the client library. - - [Working with Binary Data](working-with-binary-data-wcf-data-services.md) - Describes how to access and change binary data returned by the data service as a data stream. - -## See also - -- [Defining WCF Data Services](defining-wcf-data-services.md) -- [Getting Started](getting-started-with-wcf-data-services.md) diff --git a/docs/framework/data/wcf/wcf-data-services-overview.md b/docs/framework/data/wcf/wcf-data-services-overview.md deleted file mode 100644 index e5810f10c234e..0000000000000 --- a/docs/framework/data/wcf/wcf-data-services-overview.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -description: "Learn more about: WCF Data Services Overview" -title: "WCF Data Services Overview" -ms.date: "03/30/2017" -helpviewer_keywords: - - "WCF Data Services" - - "WCF Data Services, about" -ms.assetid: 7924cf94-c9a6-4015-afc9-f5d22b1743bb ---- -# WCF Data Services Overview - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -## Overview - -WCF Data Services enables creation and consumption of data services for the Web or an intranet by using the Open Data Protocol (OData). OData enables you to expose your data as resources that are addressable by URIs. This enables you to access and change data by using the semantics of representational state transfer (REST), specifically the standard HTTP verbs of GET, PUT, POST, and DELETE. This topic provides an overview of both the patterns and practices defined by OData and also the facilities provided by WCF Data Services to take advantage of OData in .NET Framework-based applications. - -## Address Data as Resources - - OData exposes data as resources that are addressable by URIs. The resource paths are constructed based on the entity-relationship conventions of the Entity Data Model. In this model, entities represent operational units of data in an application domain, such as customers, orders, items, and products. For more information, see [Entity Data Model](../adonet/entity-data-model.md). - - In OData, you address entity resources as an entity set that contains instances of entity types. For example, the URI `https://services.odata.org/Northwind/Northwind.svc/Customers('ALFKI')/Orders` returns all of the orders from the `Northwind` data service that are related to the customer with a `CustomerID` value of `ALFKI.` - - Query expressions enable you to perform traditional query operations against resources, such as filtering, sorting, and paging. For example, the URI `https://services.odata.org/Northwind/Northwind.svc/Customers('ALFKI')/Orders?$filter=Freight gt 50` filters the resources to return only the orders with a freight cost of more than $50. For more information, see [Accessing Data Service Resources](accessing-data-service-resources-wcf-data-services.md). - -## Interoperable Data Access - - OData builds on standard Internet protocols to make data services interoperable with applications that do not use the .NET Framework. Because you can use standard URIs to address data, your application can access and change data by using the semantics of representational state transfer (REST), specifically the standard HTTP verbs of GET, PUT, POST, and DELETE. This enables you to access these services from any client that can parse and access data that is transmitted over standard HTTP protocols. - -OData defines a set of extensions to the Atom Publishing Protocol (AtomPub). It supports HTTP requests and responses in more than one data format to accommodate various client applications and platforms. An OData feed can represent data in Atom, JavaScript Object Notation (JSON), and as plain XML. While Atom is the default format, the format of the feed is specified in the header of the HTTP request. For more information, see [OData: Atom Format](https://www.odata.org/documentation/odata-version-2-0/atom-format/) and [OData: JSON Format](https://www.odata.org/documentation/odata-version-2-0/json-format/). - - When publishing data as an OData feed, WCF Data Services relies on other existing Internet facilities for such operations as caching and authentication. To accomplish this, WCF Data Services integrates with existing hosting applications and services, such as ASP.NET, Windows Communication Foundation (WCF), and Internet Information Services (IIS). - -## Storage Independence - - Although resources are addressed based on an entity-relationship model, WCF Data Services expose OData feeds regardless of the underlying data source. After WCF Data Services accepts an HTTP request for a resource that a URI identifies, the request is deserialized and a representation of that request is passed to an WCF Data Services provider. This provider translates the request into a data source-specific format and executes the request on the underlying data source. WCF Data Services achieves storage independence by separating the conceptual model that addresses resources prescribed by OData from the specific schema of the underlying data source. - - WCF Data Services integrates with the ADO.NET Entity Framework to enable you to create data services that expose relational data. You can use the Entity Data Model tools to create a data model that contains addressable resources as entities and at the same time define the mapping between this model and the tables in the underlying database. For more information, see [Entity Framework Provider](entity-framework-provider-wcf-data-services.md). - - WCF Data Services also enables you to create data services that expose any data structures that return an implementation of the interface. This enables you to create data services that expose data from .NET Framework types. Create, update, and delete operations are supported when you also implement the interface. For more information, see [Reflection Provider](reflection-provider-wcf-data-services.md). - - For an illustration of how WCF Data Services integrates with these data providers, see the architectural diagram later in this topic. - -## Custom Business Logic - - WCF Data Services makes it easy to add custom business logic to a data service through service operations and interceptors. Service operations are methods defined on the server that are addressable by URIs in the same form as data resources. Service operations can also use query expression syntax to filter, order, and page data returned by an operation. For example, the URI `http://localhost:12345/Northwind.svc/GetOrdersByCity?city='London'&$orderby=OrderDate&$top=10&$skip=10` represents a call to a service operation named `GetOrdersByCity` on the Northwind data service that returns orders for customers from London, with paged results sorted by `OrderDate`. For more information, see [Service Operations](service-operations-wcf-data-services.md). - - Interceptors enable custom application logic to be integrated in the processing of request or response messages by a data service. Interceptors are called when a query, insert, update, or delete action occurs on the specified entity set. An interceptor then may alter the data, enforce authorization policy, or even terminate the operation. Interceptor methods must be explicitly registered for a given entity set that is exposed by a data service. For more information, see [Interceptors](interceptors-wcf-data-services.md). - -## Client Libraries - - OData defines a set of uniform patterns for interacting with data services. This provides an opportunity to create reusable components that are based on these services, such as client-side libraries that make it easier to consume data services. - - WCF Data Services includes client libraries for both .NET Framework-based and Silverlight-based client applications. These client libraries enable you to interact with data services by using .NET Framework objects. They also support object-based queries and LINQ queries, loading related objects, change tracking, and identity resolution. For more information, see [WCF Data Services Client Library](wcf-data-services-client-library.md). - - In addition to the OData client libraries included with the .NET Framework and with Silverlight, there are other client libraries that enable you to consume an OData feed in client applications, such as PHP, AJAX, and Java applications. For more information on OData SDK, see [OData SDK - Sample Code](https://www.odata.org/ecosystem/#sdk). - -## Architecture Overview - - The following diagram illustrates the WCF Data Services architecture for exposing OData feeds and using these feeds in OData-enabled client libraries: - - ![Screenshot showing a WCF Data Services architecture diagram.](./media/wcf-data-services-overview/windows-communication-foundation-data-services-architecture.gif) - -## See also - -- [WCF Data Services 4.5](index.md) -- [Getting Started](getting-started-with-wcf-data-services.md) -- [Defining WCF Data Services](defining-wcf-data-services.md) -- [Accessing Data Service Resources (WCF Data Services)](/previous-versions/dotnet/netframework-4.0/dd728283(v=vs.100)) -- [WCF Data Services Client Library](wcf-data-services-client-library.md) -- [Representational State Transfer (REST)](https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm) diff --git a/docs/framework/data/wcf/wcf-data-services-protocol-implementation-details.md b/docs/framework/data/wcf/wcf-data-services-protocol-implementation-details.md deleted file mode 100644 index 2a1da8eb3fa5e..0000000000000 --- a/docs/framework/data/wcf/wcf-data-services-protocol-implementation-details.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -description: "Learn more about: WCF Data Services Protocol Implementation Details" -title: "WCF Data Services Protocol Implementation Details" -ms.date: "03/30/2017" -ms.assetid: 712d689b-fada-4cbb-bcdb-d65a3ef83b4c ---- -# WCF Data Services Protocol Implementation Details - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -## OData Protocol Implementation Details - -The Open Data Protocol (OData) requires that a data service that implements the protocol provide a certain minimum set of functionalities. These functionalities are described in the protocol documents in terms of "should" and "must". Other optional functionality is described in terms of "may". This article describes these optional functionalities that are not currently implemented by WCF Data Services. - -### Support for the $format Query Option - - The OData protocol supports both JavaScript Notation (JSON) and Atom feeds, and OData provides the `$format` system query option to allow a client to request the format of the response feed. This system query option, if supported by the data service, must override the value of the Accept header of the request. WCF Data Services supports returning both JSON and Atom feeds. However, the default implementation does not support the `$format` query option and uses only the value of the Accept header to determine the format of the response. There are cases when your data service may need to support the `$format` query option, such as when clients cannot set the Accept header. To support these scenarios, you must extend your data service to handle this option in the URI. - -## WCF Data Services Behaviors - - The following WCF Data Services behaviors are not explicitly defined by the OData protocol: - -### Default Sorting Behavior - - When a query request that is sent to the data service includes a `$top` or `$skip` system query option and does not include the `$orderby` system query option, the returned feed is sorted by the key properties, in ascending order. This is because ordering is required to ensure the correct paging of results. To do this, the data service adds an ordering expression to the query. This behavior also occurs when server-driven paging is enabled in the data service. For more information, see [Configuring the Data Service](configuring-the-data-service-wcf-data-services.md).To control the ordering of the returned feed, you should include `$orderby` in the query URI. - -## See also - -- [Defining WCF Data Services](defining-wcf-data-services.md) -- [WCF Data Services Client Library](wcf-data-services-client-library.md) diff --git a/docs/framework/data/wcf/wcf-data-services-resources.md b/docs/framework/data/wcf/wcf-data-services-resources.md deleted file mode 100644 index c61b7b739af77..0000000000000 --- a/docs/framework/data/wcf/wcf-data-services-resources.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -description: "Learn more about: WCF Data Services Resources" -title: "WCF Data Services Resources" -ms.date: "03/30/2017" -helpviewer_keywords: - - "WCF Data Services, learn more" -ms.assetid: e63a9baf-699c-42e2-b11f-fba57bcc14df ---- -# WCF Data Services Resources - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -WCF Data Services introductory topics can be found in the following locations. Many of these topics also contain links to related topics that contain more detailed information. - - [Overview](wcf-data-services-overview.md) - Provides an overview of the features and functionality available in WCF Data Services. - - [Getting Started](../adonet/ef/getting-started.md) - Describes how to design and access a data service by using WCF Data Services, as illustrated by the [quickstart](quickstart-wcf-data-services.md). - - [Application Scenarios](application-scenarios-wcf-data-services.md) - Provides a task-based approach to creating WCF Data Services and applications that access Open Data Protocol (OData) feeds. - - [.NET Glossary](../../../standard/glossary.md) - Includes terms used in WCF Data Services and OData documentation. - -## External Resources - - The following external resources provide additional information and support for creating WCF Data Services applications that expose and consume OData feeds. - - [WCF Data Services Forum](https://social.msdn.microsoft.com/Forums/en-US/home?forum=adodotnetdataservices) - Data programming support for WCF Data Services developers. - - [WCF Data Services Team Blog](/archive/blogs/astoriateam/) - Blog that contains updates and discussion of WCF Data Services features and functionality. - - [OData website](https://www.odata.org/) - The primary source of information about OData. - - [OData SDK - Sample Code](https://www.odata.org/ecosystem/#sdk) - Contains sample services, samples, and programming libraries that enable you to work with OData feeds. - - [OData Blog](https://www.odata.org/blog/) - Blog that contains discussions about OData programming. - - [Overview: WCF Data Services](/previous-versions/visualstudio/visual-studio-2008/cc956153(v=msdn.10)) - A white paper that provides more high-level information about the benefits of WCF Data Services. - - [Using Microsoft WCF Data Services](/previous-versions/visualstudio/visual-studio-2008/cc907912(v=msdn.10)) - A white paper that provides additional information and examples for creating data services and accessing data services in client applications. - - [The Entity-Relationship Model: Toward a Unified View of Data](https://dl.acm.org/doi/10.1145/320434.320440) by Peter Pin-Shan Chen, Massachusetts Institute of Technology - Describes the basis for the entity-relational model that is implemented by WCF Data Services. Written in 1976, this is one of the most frequently cited papers in the computer field. - -## See also - -- [Getting Started](getting-started-with-wcf-data-services.md) diff --git a/docs/framework/data/wcf/working-with-binary-data-wcf-data-services.md b/docs/framework/data/wcf/working-with-binary-data-wcf-data-services.md deleted file mode 100644 index eb67395bdce8c..0000000000000 --- a/docs/framework/data/wcf/working-with-binary-data-wcf-data-services.md +++ /dev/null @@ -1,75 +0,0 @@ ---- -description: "Learn more about: Working with Binary Data (WCF Data Services)" -title: "Working with Binary Data (WCF Data Services)" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "WCF Data Services, binary data" - - "WCF Data Services, streams" -ms.assetid: aeccc45c-d5c5-4671-ad63-a492ac8043ac ---- -# Working with Binary Data (WCF Data Services) - -[!INCLUDE [wcf-deprecated](~/includes/wcf-deprecated.md)] - -The WCF Data Services client library enables you to retrieve and update binary data from an Open Data Protocol (OData) feed in one of the following ways: - -- As a primitive type property of an entity. This is the recommended method for working with small binary data objects that can be easily loaded into memory. In this case, the binary property is an entity property exposed by the data model, and the data service serializes the binary data as base-64 binary encoded XML in the response message. - -- As a separate binary resource stream. This is the recommended method for accessing and changing binary large object (BLOB) data that may represent a photo, video, or any other type of binary encoded data. - -WCF Data Services implements the streaming of binary data by using HTTP as defined in the OData. In this mechanism, binary data is treated as a media resource that is separate from but related to an entity, which is called a media link entry. For more information, see [Streaming Provider](streaming-provider-wcf-data-services.md). - -> [!TIP] -> For a step-by-step example of how to create a Windows Presentation Foundation (WPF) client application that downloads binary image files from an OData service that stores photos, see the post [Data Services Streaming Provider Series-Part 2: Accessing a Media Resource Stream from the Client](/archive/blogs/astoriateam/data-services-streaming-provider-series-part-2-accessing-a-media-resource-stream-from-the-client). To download the sample code for the stream photo data service featured in the blog post, see the [Streaming Photo Data Service Sample](https://github.com/microsoftarchive/msdn-code-gallery-community-s-z/tree/master/Streaming%20Photo%20OData%20Service%20Sample) in GitHub. - -## Entity Metadata - -An entity that has a related media resource stream is indicated in the data service metadata by the `HasStream` attribute applied to an entity type that is the media link entry. In the following example, the `PhotoInfo` entity is a media link entry that has a related media resource, indicated by the `HasStream` attribute. - -[!code-xml[Astoria Photo Streaming Service#HasStream](../../../../samples/snippets/xml/VS_Snippets_Misc/astoria_photo_streaming_service/xml/photodata.edmx#hasstream)] - -The remaining examples in this topic show how to access and change the media resource stream. For a complete example of how to consume a media resource stream in a .NET Framework client application by using the WCF Data Services client library, see the post [Accessing a Media Resource Stream from the Client](/archive/blogs/astoriateam/data-services-streaming-provider-series-part-2-accessing-a-media-resource-stream-from-the-client). - -## Accessing the Binary Resource Stream - -The WCF Data Services client library provides methods for accessing binary resource streams from an OData-based data service. When downloading a media resource, you can either use the URI of the media resource or you can get a binary stream that contains the media resource data itself. You can also upload media resource data as a binary stream. - -> [!TIP] -> For a step-by-step example of how to create a Windows Presentation Foundation (WPF) client application that downloads binary image files from an OData service that stores photos, see the post [Data Services Streaming Provider Series-Part 2: Accessing a Media Resource Stream from the Client](/archive/blogs/astoriateam/data-services-streaming-provider-series-part-2-accessing-a-media-resource-stream-from-the-client). To download the sample code for the stream photo data service featured in the blog post, see the [Streaming Photo Data Service Sample](https://github.com/microsoftarchive/msdn-code-gallery-community-s-z/tree/master/Streaming%20Photo%20OData%20Service%20Sample) in GitHub. - -### Getting the URI of the Binary Stream - -When retrieving certain types of media resources, such as images and other media files, it is often easier to use the URI of the media resource in your application than handling the binary data stream itself. To get the URI of a resource stream associated with a give media link entry, you must call the method on the instance that is tracking the entity. The following example shows how to call the method to get the URI of a media resource stream that is used to create a new image on the client: - -[!code-csharp[Astoria Photo Streaming Client#GetReadStreamUri](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_photo_streaming_client/cs/photowindow.xaml.cs#getreadstreamuri)] -[!code-vb[Astoria Photo Streaming Client#GetReadStreamUri](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_photo_streaming_client/vb/photowindow.xaml.vb#getreadstreamuri)] - -### Downloading the Binary Resource Stream - -When retrieving a binary resource stream, you must call the method on the instance that is tracking the media link entry. This method sends a request to the data service that returns a object, which has a reference to the stream that contains the resource. Use this method when your application requires the binary resource as a . The following example shows how to call the method to retrieve a stream that is used to create a new image on the client: - -[!code-csharp[Astoria Streaming Client#GetReadStreamClient](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_streaming_client/cs/customerphotowindow.xaml.cs#getreadstreamclient)] -[!code-vb[Astoria Streaming Client#GetReadStreamClient](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_streaming_client/vb/customerphotowindow.xaml.vb#getreadstreamclient)] - -> [!NOTE] -> The Content-Length header in the response message that contains the binary steam is not set by the data service. This value may not reflect the actual length of the binary data stream. - -### Uploading a Media Resource as a Stream - -To insert or update a media resource, call the method on the instance that is tracking the entity. This method sends a request to the data service that contains the media resource read from the supplied stream. The following example shows how to call the method to send an image to the data service: - -[!code-csharp[Astoria Photo Streaming Client#SetSaveStream](../../../../samples/snippets/csharp/VS_Snippets_Misc/astoria_photo_streaming_client/cs/photodetailswindow.xaml.cs#setsavestream)] -[!code-vb[Astoria Photo Streaming Client#SetSaveStream](../../../../samples/snippets/visualbasic/VS_Snippets_Misc/astoria_photo_streaming_client/vb/photodetailswindow.xaml.vb#setsavestream)] - -In this example, the method is called by supplying a value of `true` for the `closeStream` parameter. This guarantees that the closes the stream after the binary data is uploaded to the data service. - -> [!NOTE] -> When you call , the stream is not sent to the data service until is called. - -## See also - -- [WCF Data Services Client Library](wcf-data-services-client-library.md) -- [Binding Data to Controls](binding-data-to-controls-wcf-data-services.md) diff --git a/docs/framework/windows-workflow-foundation/consuming-odata-feeds-from-a-workflow.md b/docs/framework/windows-workflow-foundation/consuming-odata-feeds-from-a-workflow.md index 531d262941e2f..ea8bd4ec250f5 100644 --- a/docs/framework/windows-workflow-foundation/consuming-odata-feeds-from-a-workflow.md +++ b/docs/framework/windows-workflow-foundation/consuming-odata-feeds-from-a-workflow.md @@ -10,7 +10,7 @@ WCF Data Services is a component of the .NET Framework that enables you to creat ## Using the sample Northwind OData service -The examples in this topic use the sample Northwind data service located at . This service is provided as part of the [OData SDK](https://www.odata.org/ecosystem/#sdk) and provides read-only access to the sample Northwind database. If write access is desired, or if a local WCF Data Service is desired, you can follow the steps of the [WCF Data Services Quickstart](../data/wcf/quickstart-wcf-data-services.md) to create a local OData service that provides access to the Northwind database. If you follow the quickstart, substitute the local URI for the one provided in the example code in this topic. +The examples in this topic use the sample Northwind data service located at . This service is provided as part of the [OData SDK](https://www.odata.org/ecosystem/#sdk) and provides read-only access to the sample Northwind database. If write access is desired, or if a local WCF Data Service is desired, you can follow the steps of the [WCF Data Services Quickstart](/previous-versions/dotnet/framework/data/wcf/quickstart-wcf-data-services) to create a local OData service that provides access to the Northwind database. If you follow the quickstart, substitute the local URI for the one provided in the example code in this topic. ## Consuming an OData feed using the client libraries @@ -25,14 +25,14 @@ To generate the Northwind client libraries, you can use the **Add Service Refere Note that there are no service operations exposed by the service, and in the **Services** list there are items representing the entities exposed by the Northwind data service. When the service reference is added, classes will be generated for these entities and they can be used in the client code. The examples in this topic use these classes and the `NorthwindEntities` class to perform the queries. > [!NOTE] -> For more information, see [Generating the Data Service Client Library (WCF Data Services)](../data/wcf/generating-the-data-service-client-library-wcf-data-services.md). +> For more information, see [Generating the Data Service Client Library (WCF Data Services)](/previous-versions/dotnet/framework/data/wcf/generating-the-data-service-client-library-wcf-data-services). ### Using asynchronous methods To address possible latency issues that may occur when accessing resources over the Web, we recommend accessing WCF Data Services asynchronously. The WCF Data Services client libraries include asynchronous methods for invoking queries, and Windows Workflow Foundation (WF) provides the class for authoring asynchronous activities. derived activities can be written to take advantage of .NET Framework classes that have asynchronous methods, or the code to be executed asynchronously can be put into a method and invoked by using a delegate. This section provides two examples of an derived activity; one that uses the asynchronous methods of the WCF Data Services client libraries and one that uses a delegate. > [!NOTE] -> For more information, see [Asynchronous Operations (WCF Data Services)](../data/wcf/asynchronous-operations-wcf-data-services.md) and [Creating Asynchronous Activities](creating-asynchronous-activities-in-wf.md). +> For more information, see [Asynchronous Operations (WCF Data Services)](/previous-versions/dotnet/framework/data/wcf/asynchronous-operations-wcf-data-services) and [Creating Asynchronous Activities](creating-asynchronous-activities-in-wf.md). ### Using client library asynchronous methods @@ -72,7 +72,7 @@ In addition to invoking the asynchronous method of a .NET Framework class, an ` that contains all of the customers in the Northwind database. The asynchronous work is performed by the `GetCustomers` method. This method queries the service for all customers, and then copies them into a `List`. It then checks to see if the results are paged. If so, it queries the service for the next page of results, adds them to the list, and continues until all of the customer data has been retrieved. > [!NOTE] -> For more information about paging in WCF Data Services, see [How to: Load Paged Results (WCF Data Services)](../data/wcf/how-to-load-paged-results-wcf-data-services.md). +> For more information about paging in WCF Data Services, see [How to: Load Paged Results (WCF Data Services)](/previous-versions/dotnet/framework/data/wcf/how-to-load-paged-results-wcf-data-services). Once all customers are added, the list is returned. The `GetCustomers` method is specified in the activity's override. Since the method has a return value, a `Func>` is created to specify the method. @@ -149,4 +149,4 @@ xmlns="http://www.w3.org/2005/Atom"> ... ``` -This example provides one method that workflow application authors can use to consume the raw data returned from an OData service. For more information about accessing WCF Data Services using URIs, see [Accessing Data Service Resources (WCF Data Services)](../data/wcf/accessing-data-service-resources-wcf-data-services.md) and [OData: URI Conventions](https://www.odata.org/documentation/odata-version-2-0/uri-conventions/). +This example provides one method that workflow application authors can use to consume the raw data returned from an OData service. For more information about accessing WCF Data Services using URIs, see [Accessing Data Service Resources (WCF Data Services)](/previous-versions/dotnet/framework/data/wcf/accessing-data-service-resources-wcf-data-services) and [OData: URI Conventions](https://www.odata.org/documentation/odata-version-2-0/uri-conventions/). From 268fcd6c2f8ef5f6af86a3cd1d73c2a713a9936f Mon Sep 17 00:00:00 2001 From: Genevieve Warren <24882762+gewarren@users.noreply.github.com> Date: Mon, 21 Jun 2021 10:01:40 -0700 Subject: [PATCH 060/105] Delete cross-platform docs (#24692) --- .openpublishing.redirection.json | 29 ++++ ...ibraries-that-target-multiple-platforms.md | 109 ------------ docs/framework/cross-platform/index.md | 26 --- .../media/add-portable-class-library.png | Bin 37783 -> 0 bytes .../media/pcl-project-properties.png | Bin 18477 -> 0 bytes ...mvvm-share-assemblies-across-platforms.png | Bin 5419 -> 0 bytes .../passing-a-uri-to-the-windows-runtime.md | 37 ---- .../cross-platform/portable-class-library.md | 85 ---------- ...-windows-store-apps-and-windows-runtime.md | 159 ------------------ ...lass-library-with-model-view-view-model.md | 94 ----------- docs/framework/develop-client-apps.md | 2 +- docs/framework/development-guide.md | 2 +- .../tools/ildasm-exe-il-disassembler.md | 2 +- ...xe-windows-runtime-metadata-export-tool.md | 4 +- .../clr-profilers-and-windows-store-apps.md | 4 +- ...-reference-in-a-portable-subset-project.md | 2 +- docs/framework/whats-new/index.md | 4 +- 17 files changed, 39 insertions(+), 520 deletions(-) delete mode 100644 docs/framework/cross-platform/app-resources-for-libraries-that-target-multiple-platforms.md delete mode 100644 docs/framework/cross-platform/index.md delete mode 100644 docs/framework/cross-platform/media/add-portable-class-library.png delete mode 100644 docs/framework/cross-platform/media/pcl-project-properties.png delete mode 100644 docs/framework/cross-platform/media/using-portable-class-library-with-model-view-view-model/mvvm-share-assemblies-across-platforms.png delete mode 100644 docs/framework/cross-platform/passing-a-uri-to-the-windows-runtime.md delete mode 100644 docs/framework/cross-platform/portable-class-library.md delete mode 100644 docs/framework/cross-platform/support-for-windows-store-apps-and-windows-runtime.md delete mode 100644 docs/framework/cross-platform/using-portable-class-library-with-model-view-view-model.md diff --git a/.openpublishing.redirection.json b/.openpublishing.redirection.json index 8cbb4acf071a5..1dbac2e4b955b 100644 --- a/.openpublishing.redirection.json +++ b/.openpublishing.redirection.json @@ -4162,6 +4162,35 @@ "redirect_url": "/previous-versions/dotnet/framework/windows-identity-foundation/file-schema/x509securitytokenhandlerrequirement", "redirect_document_id": false }, + { + "source_path": "docs/framework/cross-platform/app-resources-for-libraries-that-target-multiple-platforms.md", + "redirect_url": "/previous-versions/dotnet/framework/cross-platform/app-resources-for-libraries-that-target-multiple-platforms", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/cross-platform/index.md", + "redirect_url": "/previous-versions/dotnet/framework/cross-platform/index", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/cross-platform/passing-a-uri-to-the-windows-runtime.md", + "redirect_url": "/previous-versions/dotnet/framework/cross-platform/passing-a-uri-to-the-windows-runtime", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/cross-platform/portable-class-library.md", + "redirect_url": "/previous-versions/dotnet/framework/cross-platform/portable-class-library", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/cross-platform/support-for-windows-store-apps-and-windows-runtime.md", + "redirect_url": "/previous-versions/dotnet/framework/cross-platform/support-for-windows-store-apps-and-windows-runtime", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/cross-platform/using-portable-class-library-with-model-view-view-model.md", + "redirect_url": "/previous-versions/dotnet/framework/cross-platform/using-portable-class-library-with-model-view-view-model" + }, { "source_path": "docs/framework/data/adonet/ef/architecture-and-design.md", "redirect_url": "/previous-versions/dotnet/netframework-4.0/ee794151(v=vs.100)" diff --git a/docs/framework/cross-platform/app-resources-for-libraries-that-target-multiple-platforms.md b/docs/framework/cross-platform/app-resources-for-libraries-that-target-multiple-platforms.md deleted file mode 100644 index f3d566b5b3e89..0000000000000 --- a/docs/framework/cross-platform/app-resources-for-libraries-that-target-multiple-platforms.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -description: "Learn more about: App Resources for Libraries That Target Multiple Platforms" -title: "App Resources for Libraries That Target Multiple Platforms" -ms.date: "07/18/2018" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "multiple platforms, resources for" - - "resources [.NET Framework]" - - ".NET Framework, resources when targeting multiple platforms" - - "resources, for multiple platforms" - - "targeting multiple platforms, resources for" -ms.assetid: 72c76f0b-7255-4576-9261-3587f949669c ---- -# App Resources for Libraries That Target Multiple Platforms - -You can use the .NET Framework [Portable Class Library](portable-class-library.md) project type to ensure that resources in your class libraries can be accessed from multiple platforms. This project type is available in Visual Studio 2012 and targets the portable subset of the .NET Framework class library. Using a Portable Class Library ensures that your library can be accessed from desktop apps, Silverlight apps, Windows Phone apps, and Windows 8.x Store apps. - -[!INCLUDE[standard](../../../includes/pcl-to-standard.md)] - - The Portable Class Library project makes only a very limited subset of the types in the namespace available to your application, but it does allow you to use the class to retrieve resources. However, if you are creating an app by using Visual Studio, you should use the strongly typed wrapper created by Visual Studio instead of using the class directly. - - To create a strongly typed wrapper in Visual Studio, set the main resource file's **Access Modifier** in the Visual Studio Resource Designer to **Public**. This creates a [resourceFileName].designer.cs or [resourceFileName].designer.vb file that contains the strongly typed ResourceManager wrapper. For more information about using a strongly typed resource wrapper, see the "Generating a Strongly Typed Resource Class" section in the [Resgen.exe (Resource File Generator)](../../framework/tools/resgen-exe-resource-file-generator.md) topic. - -## Resource Manager in the Portable Class Library - - In a Portable Class Library project, all access to resources is handled by the class. Because types in the namespace, such as and , are not accessible from a Portable Class Library project, they cannot be used to access resources. - - The Portable Class Library project includes the four members listed in the following table. These constructors and methods enable you to instantiate a object and retrieve string resources. - -|`ResourceManager` member|Description| -|------------------------------|-----------------| -||Creates a instance to access the named resource file found in the specified assembly.| -||Creates a instance that corresponds to the specified type.| -||Retrieves a named resource for the current culture.| -||Retrieves a named resource belonging to the specified culture.| - - The exclusion of other members from the Portable Class Library means that serialized objects, non-string data, and images cannot be retrieved from a resource file. To use resources from a Portable Class Library, you should store all object data in string form. For example, you can store numeric values in a resource file by converting them to strings, and you can retrieve them and then convert them back to numbers by using the numeric data type's `Parse` or `TryParse` method. You can convert images or other binary data to a string representation by calling the method, and restore them to a byte array by calling the method. - -## The Portable Class Library and Windows Store Apps - - Portable Class Library projects store resources in .resx files, which are then compiled into .resources files and embedded in the main assembly or in satellite assemblies at compile time. Windows 8.x Store apps, on the other hand, require resources to be stored in .resw files, which are then compiled into a single package resource index (PRI) file. However, despite the incompatible file formats, your Portable Class Library will work in a Windows 8.x Store app. - - To consume your class library from a Windows 8.x Store app, add a reference to it in your Windows Store app project. Visual Studio will transparently extract the resources from your assembly into a .resw file and use it to generate a PRI file from which the Windows Runtime can extract resources. At run time, the Windows Runtime executes the code in your Portable Class Library, but it retrieves your Portable Class Library's resources from the PRI file. - - If your Portable Class Library project includes localized resources, you use the hub-and-spoke model to deploy them just as you would for a library in a desktop app. To consume your main resource file and any localized resource files in your Windows 8.x Store app, you add a reference to the main assembly. At compile time, Visual Studio extracts the resources from your main resource file and any localized resource files into separate .resw files. It then compiles the .resw files into a single PRI file that the Windows Runtime accesses at run time. - - - -## Example: Non-Localized Portable Class Library - - The following simple, non-localized Portable Class Library example uses resources to store the names of columns and to determine the number of characters to reserve for tabular data. The example uses a file named LibResources.resx to store the string resources listed in the following table. - -|Resource name|Resource value| -|-------------------|--------------------| -|Born|Birthdate| -|BornLength|12| -|Hired|Hire Date| -|HiredLength|12| -|ID|ID| -|ID.Length|12| -|Name|Name| -|NameLength|25| -|Title|Employee Database| - - The following code defines a `UILibrary` class that uses the Resource Manager wrapper named `resources` generated by Visual Studio when the **Access Modifier** for the file is changed to **Public**. The UILibrary class parses the string data as necessary. . Note that the class is in the `MyCompany.Employees` namespace. - - [!code-csharp[Conceptual.Resources.Portable#1](../../../samples/snippets/csharp/VS_Snippets_CLR/conceptual.resources.portable/cs/uilibrary.cs#1)] - [!code-vb[Conceptual.Resources.Portable#1](../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.resources.portable/vb/uilibrary.vb#1)] - - The following code illustrates how the `UILibrary` class and its resources can be accessed from a console-mode app. It requires a reference to UILibrary.dll to be added to the console app project. - - [!code-csharp[Conceptual.Resources.Portable#2](../../../samples/snippets/csharp/VS_Snippets_CLR/conceptual.resources.portable/cs/program.cs#2)] - [!code-vb[Conceptual.Resources.Portable#2](../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.resources.portable/vb/module1.vb#2)] - - The following code illustrates how the `UILibrary` class and its resources can be accessed from a Windows 8.x Store app. It requires a reference to UILibrary.dll to be added to the Windows Store app project. - - [!code-csharp[Conceptual.Resources.PortableMetro#1](../../../samples/snippets/csharp/VS_Snippets_CLR/conceptual.resources.portablemetro/cs/blankpage.xaml.cs#1)] - -## Example: Localized Portable Class Library - - The following localized Portable Class Library example includes resources for the French (France) and English (United States) cultures. The English (United States) culture is the app's default culture; its resources are shown in the table in the [previous section](app-resources-for-libraries-that-target-multiple-platforms.md#NonLoc). The resources file for the French (France) culture is named LibResources.fr-FR.resx and consists of the string resources listed in the following table. The source code for the `UILibrary` class is the same as that shown in the previous section. - -|Resource name|Resource value| -|-------------------|--------------------| -|Born|Date de naissance| -|BornLength|20| -|Hired|Date embauché| -|HiredLength|16| -|ID|ID| -|Name|Nom| -|Title|Base de données des employés| - - The following code illustrates how the `UILibrary` class and its resources can be accessed from a console-mode app. It requires a reference to UILibrary.dll to be added to the console app project. - - [!code-csharp[Conceptual.Resources.Portable#3](../../../samples/snippets/csharp/VS_Snippets_CLR/conceptual.resources.portable/cs/program2.cs#3)] - [!code-vb[Conceptual.Resources.Portable#3](../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.resources.portable/vb/module2.vb#3)] - - The following code illustrates how the `UILibrary` class and its resources can be accessed from a Windows 8.x Store app. It requires a reference to UILibrary.dll to be added to the Windows Store app project. It uses the static `ApplicationLanguages.PrimaryLanguageOverride` property to set the app's preferred language to French. - - [!code-csharp[Conceptual.Resources.PortableMetroLoc#1](../../../samples/snippets/csharp/VS_Snippets_CLR/conceptual.resources.portablemetroloc/cs/blankpage.xaml.cs#1)] - [!code-vb[Conceptual.Resources.PortableMetroLoc#1](../../../samples/snippets/visualbasic/VS_Snippets_CLR/conceptual.resources.portablemetroloc/vb/blankpage.xaml.vb#1)] - -## See also - -- -- [Resources in Desktop Apps](../../framework/resources/index.md) -- [Packaging and Deploying Resources](../../framework/resources/packaging-and-deploying-resources-in-desktop-apps.md) diff --git a/docs/framework/cross-platform/index.md b/docs/framework/cross-platform/index.md deleted file mode 100644 index 67ceda90940b0..0000000000000 --- a/docs/framework/cross-platform/index.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -description: "Learn more about: Develop for multiple platforms with .NET Framework" -title: "Developing for Multiple Platforms with .NET Framework" -ms.date: 10/21/2020 -ms.assetid: b153baaa-130c-4169-860b-e580591de91e ---- -# Develop for multiple platforms with .NET Framework - -You can develop apps for both Microsoft and non-Microsoft platforms by using .NET Framework and Visual Studio. - -[!INCLUDE [net-framework-future](../../../includes/net-framework-future.md)] - -## Options for cross-platform development - -[!INCLUDE[standard](../../../includes/pcl-to-standard.md)] - -To develop for multiple platforms, you can share source code or binaries, and you can make calls between .NET Framework code and Windows Runtime APIs. - -|If you want to...|Use...| -|-----------------------|------------| -|Share source code between Windows Phone 8.1 and Windows 8.1 apps|**Shared projects** (Universal Apps template in Visual Studio 2013, Update 2).

- Currently no Visual Basic support.
- You can separate platform-specific code by using #`if` statements.

For details, see:

- [Start coding](/windows/uwp/get-started/create-uwp-apps)
- [Using Visual Studio to build Universal XAML Apps](https://devblogs.microsoft.com/visualstudio/using-visual-studio-to-build-universal-xaml-apps/) (blog post)
- [Using Visual Studio to Build XAML Converged Apps](https://channel9.msdn.com/Events/Build/2014/3-591) (video)| -|Share binaries between apps that target different platforms|**Portable Class Library projects** for code that is platform-agnostic.

- This approach is typically used for code that implements business logic.
- You can use Visual Basic or C#.
- API support varies by platform.
- Portable Class Library projects that target Windows 8.1 and Windows Phone 8.1 support Windows Runtime APIs and XAML. These features aren't available in older versions of the Portable Class Library.
- If needed, you can abstract out platform-specific code by using interfaces or abstract classes.

For details, see:

- [Portable Class Library](portable-class-library.md)
- [How to Make Portable Class Libraries Work for You](/archive/blogs/dsplaisted/how-to-make-portable-class-libraries-work-for-you) (blog post)
- [Using Portable Class Library with MVVM](using-portable-class-library-with-model-view-view-model.md)
- [App Resources for Libraries That Target Multiple Platforms](app-resources-for-libraries-that-target-multiple-platforms.md)
- [.NET Portability Analyzer](https://marketplace.visualstudio.com/items?itemName=ConnieYau.NETPortabilityAnalyzer) (Visual Studio extension)| -|Share source code between apps for platforms other than Windows 8.1 and Windows Phone 8.1|**Add as link** feature.

- This approach is suitable for app logic that's common to both apps but not portable, for some reason. You can use this feature for C# or Visual Basic code.
For example, Windows Phone 8 and Windows 8 share Windows Runtime APIs, but Portable Class Libraries do not support Windows Runtime for those platforms. You can use `Add as link` to share common Windows Runtime code between a Windows Phone 8 app and a Windows Store app that targets Windows 8.

For details, see:

- [Share code with Add as Link](/previous-versions/windows/apps/jj714082(v=vs.105))
- [How to: Add Existing Items to a Project](/previous-versions/visualstudio/visual-studio-2010/9f4t9t92(v=vs.100))| -|Write Windows Store apps using the .NET Framework or call Windows Runtime APIs from .NET Framework code|**Windows Runtime APIs** from your .NET Framework C# or Visual Basic code, and use the .NET Framework to create Windows Store apps. You should be aware of API differences between the two platforms. However, there are classes to help you work with those differences.

For details, see:

- [.NET Framework Support for Windows Store Apps and Windows Runtime](support-for-windows-store-apps-and-windows-runtime.md)
- [Passing a URI to the Windows Runtime](passing-a-uri-to-the-windows-runtime.md)
-
- | -|Build .NET Framework apps for non-Microsoft platforms|**Portable Class Library reference assemblies** in the .NET Framework, and a Visual Studio extension or third-party tool such as Xamarin.

For details, see:

- [Portable Class Library now available on all platforms.](https://devblogs.microsoft.com/dotnet/portable-class-library-pcl-now-available-on-all-platforms/) (blog post)
- [Xamarin documentation](/xamarin)| -|Use JavaScript and HTML for cross-platform development|**Universal App templates** in Visual Studio 2013, Update 2 to develop against Windows Runtime APIs for Windows 8.1 and Windows Phone 8.1. Currently, you can't use JavaScript and HTML with .NET Framework APIs to develop cross-platform apps.

For details, see:

- [JavaScript Project Templates](/previous-versions/windows/apps/hh758331(v=win.10))
- [Porting a Windows Runtime app using JavaScript to Windows Phone](/previous-versions/windows/apps/dn636144(v=win.10))| diff --git a/docs/framework/cross-platform/media/add-portable-class-library.png b/docs/framework/cross-platform/media/add-portable-class-library.png deleted file mode 100644 index 8925c3ecaf1fe73857cc84285549bac0ae7cef94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37783 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 diff --git a/docs/framework/cross-platform/media/pcl-project-properties.png b/docs/framework/cross-platform/media/pcl-project-properties.png deleted file mode 100644 index 81f08ba39fbb76cbb4497d57b38ade2688f53242..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18477 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 NwACSMr7AX|{{sx%G5-Jn diff --git a/docs/framework/cross-platform/passing-a-uri-to-the-windows-runtime.md b/docs/framework/cross-platform/passing-a-uri-to-the-windows-runtime.md deleted file mode 100644 index f98f5e59bdfc0..0000000000000 --- a/docs/framework/cross-platform/passing-a-uri-to-the-windows-runtime.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -description: "Learn more about: Passing a URI to the Windows Runtime" -title: "Passing a URI to the Windows Runtime" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "Windows Runtime, .NET Framework support for" - - "Windows Runtime, passing a URI to" -ms.assetid: 3eb5ce6f-f304-4f87-8e81-0f25092f5ad4 ---- -# Passing a URI to the Windows Runtime - -Windows Runtime methods accept only absolute URIs. If you pass a relative URI to a Windows Runtime method, an exception is thrown. Here's why: When you use the Windows Runtime in .NET Framework code, the class appears as in Intellisense. The class allows relative URIs, but the class does not. This is also true for methods you expose in Windows Runtime Components. If your component exposes a method that takes a URI, the signature in your code includes . However, to users of your component, the signature includes . A URI that is passed to your component must be an absolute URI. - -This topic shows how to detect an absolute URI and how to create one when referring to a resource in the app package. - -## Detecting and using an absolute URI - -Use the property to ensure that a URI is absolute before passing it to the Windows Runtime. Using this property is more efficient than catching and handling the exception. - -## Using an absolute URI for a resource in the app package - -If you want to specify a URI for a resource that your app package contains, you can use the `ms-appx` or `ms-appx-web` scheme to create an absolute URI. - -The following example shows how to set the property for a control and the property for an control to resources that are contained in a folder named Pages, using both XAML and code. - -[!code-xaml[System.URIToWindowsURI#1](../../../samples/snippets/csharp/VS_Snippets_CLR_System/system.uritowindowsuri/cs/mainpage.xaml#1)] -[!code-csharp[System.URIToWindowsURI#2](../../../samples/snippets/csharp/VS_Snippets_CLR_System/system.uritowindowsuri/cs/mainpage.xaml.cs#2)] -[!code-vb[System.URIToWindowsURI#2](../../../samples/snippets/visualbasic/VS_Snippets_CLR_System/system.uritowindowsuri/vb/mainpage.xaml.vb#2)] - -For more information about these schemes, see [URI schemes](/windows/uwp/app-resources/uri-schemes) in the Windows Dev Center. - -## See also - -- [.NET Framework Support for Windows Store Apps and Windows Runtime](support-for-windows-store-apps-and-windows-runtime.md) diff --git a/docs/framework/cross-platform/portable-class-library.md b/docs/framework/cross-platform/portable-class-library.md deleted file mode 100644 index 9a90158767000..0000000000000 --- a/docs/framework/cross-platform/portable-class-library.md +++ /dev/null @@ -1,85 +0,0 @@ ---- -title: "Cross-Platform Development with the Portable Class Library" -description: Build cross-platform apps and libraries for Microsoft platforms quickly and easily using the Portable Class Library project type in .NET. -ms.date: 09/17/2018 -helpviewer_keywords: - - "Portable Class Library [.NET Framework]" - - "targeting multiple platforms" - - "multiple platforms, targeting" -ms.assetid: c31e1663-c164-4e65-b66d-d3aa8750a154 ---- -# Cross-platform development with the Portable Class Library - -The Portable Class Library project type in Visual Studio helps you build cross-platform apps and libraries for Microsoft platforms quickly and easily. - -[!INCLUDE[standard](../../../includes/pcl-to-standard.md)] - -Portable class libraries can help you reduce the time and costs of developing and testing code. Use this project type to write and build portable .NET Framework assemblies, and then reference those assemblies from apps that target multiple platforms such as the .NET Framework, iOS, or Mac. - -Even after you create a Portable Class Library project in Visual Studio and start developing it, you can change the target platforms. Visual Studio compiles your library with the new assemblies, which helps you identify the changes you need to make in your code. - -## Create a Portable Class Library project - -To create a Portable Class Library, use the template provided in Visual Studio. Create a new project (**File** > **New Project**), and in the **New Project** dialog box, select your programming language (Visual C# or Visual Basic). Then, select the **Class Library (Legacy Portable)** template. Enter a name for your project and choose **OK**. - -The **Add Portable Class Library** dialog box appears. Choose two or more targets, and then choose **OK**. - -![Add portable class library targets in Visual Studio](media/add-portable-class-library.png) - -## Change targets - -You can change the target platforms of a portable class library project when you create it or after you've started development. If you want to change the targets after you've created your project, in **Solution Explorer**, open the shortcut menu for your Portable Class Library project (not the solution), and then choose **Properties**. On the project properties page, the **Library** tab shows the platforms that your project currently targets. - -![Project properties for Portable Class Library in Visual Studio](media/pcl-project-properties.png) - -To add or remove targets, choose the **Change** button, and then select and clear the appropriate check boxes. - -When you change the targets, the APIs that are available to you for developing your project will change to match your selection. Visual Studio reports the errors and warnings that may occur as a result of the targets changing. - -If you want to evaluate the portability of your assemblies before you make changes in Visual Studio, you can use the [.NET Portability Analyzer](https://marketplace.visualstudio.com/items?itemName=ConnieYau.NETPortabilityAnalyzer). - -## Supported types and members - -The types and members that are available in Portable Class Library projects are constrained by several compatibility factors: - -- They must be shared across the targets you selected. - -- The must behave similarly across those targets. - -- They must not be candidates for deprecation. - -- They must make sense in a portable environment, especially when supporting members are not portable. - -If a member is supported in the Portable Class Library and for your selected targets, it will appear in your project in IntelliSense. However, remember that an API may be supported in the Portable Class Library, but whether you can use the API depends on the targets you select. - -## API differences in the Portable Class Library - -To make Portable Class Library assemblies compatible across all supported platforms, some members have been slightly changed in the Portable Class Library. - -## Use the Portable Class Library - -After you build your Portable Class Library project, you just reference it from other projects. You can reference either the project or specific assemblies that contain the classes you want to access. - -To run an app that references a Portable Class Library assembly, the required version (or later) of the targeted platforms must be installed on your computer. Visual Studio contains all the required frameworks, so you can run the app without further modification on the computer that you used to develop the app. - -### Deploy a Universal Windows app - -When you create a Universal Windows app that references a Portable Class Library assembly, everything you need to deploy the app is included in the app package, and no further steps are required. - -### Deploy a .NET Framework app - -When you deploy a .NET Framework app that references a Portable Class Library assembly, you must specify a dependency on the correct version of the .NET Framework. By specifying this dependency, you ensure that the required version is installed with your app. - -- To create a dependency with ClickOnce deployment: In **Solution Explorer**, choose the project node for the project you want to publish. (This is the project that references the Portable Class Library project.) On the menu bar, choose **Project** > **Properties**, and then choose the **Publish** tab. On the **Publish** page, choose **Prerequisites**. Select the required .NET Framework version as a prerequisite. - -- To create a dependency with a setup project: In **Solution Explorer**, choose the setup project. On the menu bar, choose **Project** > **Properties** > **Prerequisites**. Select the required .NET Framework version as a prerequisite. - -For more information about deploying .NET Framework apps, see [Deployment Guide for Developers](../../framework/deployment/deployment-guide-for-developers.md). - -## See also - -- [Using Portable Class Library with MVVM](using-portable-class-library-with-model-view-view-model.md) -- [App Resources for Libraries That Target Multiple Platforms](app-resources-for-libraries-that-target-multiple-platforms.md) -- [.NET Portability Analyzer](https://marketplace.visualstudio.com/items?itemName=ConnieYau.NETPortabilityAnalyzer) -- [.NET Framework Support for Windows Store Apps and Windows Runtime](support-for-windows-store-apps-and-windows-runtime.md) -- [Deployment](../../framework/deployment/net-framework-applications.md) diff --git a/docs/framework/cross-platform/support-for-windows-store-apps-and-windows-runtime.md b/docs/framework/cross-platform/support-for-windows-store-apps-and-windows-runtime.md deleted file mode 100644 index cdc1293918a51..0000000000000 --- a/docs/framework/cross-platform/support-for-windows-store-apps-and-windows-runtime.md +++ /dev/null @@ -1,159 +0,0 @@ ---- -description: "Learn more about: .NET Framework Support for Microsoft Store Apps and Windows Runtime" -title: ".NET Framework Support for Microsoft Store Apps and Windows Runtime" -ms.date: "03/30/2017" -helpviewer_keywords: - - "Windows Store apps, .NET Framework support for" - - "Windows Runtime, .NET Framework support for" - - ".NET for Windows Store apps" - - ".NET Framework, and Windows Store apps" - - ".NET Framework, and Windows Runtime" -ms.assetid: 6fa7d044-ae12-4c54-b8ee-50915607a565 ---- -# .NET Framework Support for Microsoft Store Apps and Windows Runtime - -The .NET Framework 4.5 supports a number of software development scenarios with the Windows Runtime. These scenarios fall into three categories: - -- Developing Windows 8.x Store apps with XAML controls, as described in [Roadmap for Windows Store apps using C# or Visual Basic](/previous-versions/windows/apps/br229583(v=win.10)), [How tos (XAML)](/previous-versions/windows/apps/br229566(v=win.10)), and [.NET for Windows Store apps overview](/previous-versions/windows/apps/br230302(v=vs.140)). - -- Developing class libraries to use in the Windows 8.x Store apps that you create with the .NET Framework. - -- Developing Windows Runtime Components, packaged in .WinMD files, that can be used by any programming language that supports the Windows Runtime. For example, see [Creating Windows Runtime Components in C# and Visual Basic](/windows/uwp/winrt-components/creating-windows-runtime-components-in-csharp-and-visual-basic). - -This article outlines the support that the .NET Framework provides for all three categories, and describes the scenarios for Windows Runtime Components. The first section includes basic information about the relationship between the .NET Framework and the Windows Runtime, and explains some oddities you might encounter in the Help system and the IDE. The [second section](#WindowsRuntimeComponents) discusses scenarios for developing Windows Runtime Components. - -## The Basics - -The .NET Framework supports the three development scenarios listed earlier by providing .NET for Windows 8.x Store apps, and by supporting the Windows Runtime itself. - -- [.NET Framework and Windows Runtime namespaces](/previous-versions/windows/apps/br230302(v=vs.140)#net-framework-and-windows-runtime-namespaces) provides a streamlined view of the .NET Framework class libraries and include only the types and members you can use to create Windows 8.x Store apps and Windows Runtime Components. - - - When you use Visual Studio (Visual Studio 2012 or later) to develop a Windows 8.x Store app or a Windows Runtime component, a set of reference assemblies ensures that you see only the relevant types and members. - - - This streamlined API set is simplified further by the removal of features that are duplicated within the .NET Framework or that duplicate Windows Runtime features. For example, it contains only the generic versions of collection types, and the XML document object model is eliminated in favor of the Windows Runtime XML API set. - - - Features that simply wrap the operating system API are also removed, because the Windows Runtime is easy to call from managed code. - - To read more about the .NET for Windows 8.x Store apps, see the [.NET for Windows Store apps overview](/previous-versions/windows/apps/br230302(v=vs.140)). To read about the API selection process, see the [.NET for Metro style apps](https://devblogs.microsoft.com/dotnet/net-for-metro-style-apps/) entry in the .NET blog. - -- The [Windows Runtime](/uwp/api/) provides the user interface elements for building Windows 8.x Store apps, and provides access to operating system features. Like the .NET Framework, the Windows Runtime has metadata that enables the C# and Visual Basic compilers to use the Windows Runtime the way they use the .NET Framework class libraries. The .NET Framework makes it easier to use the Windows Runtime by hiding some differences: - - - Some differences in programming patterns between the .NET Framework and the Windows Runtime, such as the pattern for adding and removing event handlers, are hidden. You simply use the .NET Framework pattern. - - - Some differences in commonly used types (for example, primitive types and collections) are hidden. You simply use the .NET Framework type, as discussed in [Differences That Are Visible in the IDE](#DifferencesVisibleInIDE), later in this article. - -Most of the time, .NET Framework support for the Windows Runtime is transparent. The next section discusses some of the apparent differences between managed code and the Windows Runtime. - - - -### The .NET Framework and the Windows Runtime Reference Documentation - -The Windows Runtime and the .NET Framework documentation sets are separate. If you press F1 to display Help on a type or member, reference documentation from the appropriate set is displayed. However, if you browse through the [Windows Runtime reference](/uwp/api/) you might encounter examples that seem puzzling: - -- Topics such as the interface don't have declaration syntax for Visual Basic or C#. Instead, a note appears above the syntax section (in this case, ".NET: This interface appears as System.Collections.Generic.IEnumerable\"). This is because the .NET Framework and the Windows Runtime provide similar functionality with different interfaces. In addition, there are behavioral differences: `IIterable` has a `First` method instead of a method to return the enumerator. Instead of forcing you to learn a different way of performing a common task, the .NET Framework supports the Windows Runtime by making your managed code appear to use the type you're familiar with. You won't see the `IIterable` interface in the IDE, and therefore the only way you'll encounter it in the Windows Runtime reference documentation is by browsing through that documentation directly. - -- The documentation illustrates a closely related issue: Its parameter types appear to be different for different languages. For C# and Visual Basic, the parameter types are and . Again, this is because the .NET Framework has its own `String` and `Uri` types, and for such commonly used types it doesn't make sense to force .NET Framework users to learn a different way of doing things. In the IDE, the .NET Framework hides the corresponding Windows Runtime types. - -- In a few cases, such as the structure, the .NET Framework provides a type with the same name but more functionality. For example, a set of constructor and property topics are associated with `GridLength`, but they have syntax blocks only for Visual Basic and C# because the members are available only in managed code. In the Windows Runtime, structures have only fields. The Windows Runtime structure requires a helper class, , to provide equivalent functionality. You won't see that helper class in the IDE when you're writing managed code. - -- In the IDE, Windows Runtime types appear to derive from . They appear to have members inherited from , such as . These members operate as they would if the types actually inherited from , and Windows Runtime types can be cast to . This functionality is part of the support that the .NET Framework provides for the Windows Runtime. However, if you view the types in the Windows Runtime reference documentation, no such members appear. The documentation for these apparent inherited members is provided by the reference documentation. - - - -### Differences That Are Visible in the IDE - -In more advanced programming scenarios, such as using a Windows Runtime component written in C# to provide the application logic for a Windows 8.x Store app built for Windows using JavaScript, such differences are apparent in the IDE as well as in the documentation. When your component returns an `IDictionary` to JavaScript, and you look at it in the JavaScript debugger, you'll see the methods of `IMap` because JavaScript uses the Windows Runtime type. Some commonly used collection types that appear differently in the two languages are shown in the following table: - -|Windows Runtime type|Corresponding .NET Framework type| -|--------------------------------------------------------------|---------------------------------------| -|`IIterable`|`IEnumerable`| -|`IIterator`|`IEnumerator`| -|`IVector`|`IList`| -|`IVectorView`|`IReadOnlyList`| -|`IMap`|`IDictionary`| -|`IMapView`|`IReadOnlyDictionary`| -|`IBindableIterable`|`IEnumerable`| -|`IBindableVector`|`IList`| -|`Windows.UI.Xaml.Data.INotifyPropertyChanged`|`System.ComponentModel.INotifyPropertyChanged`| -|`Windows.UI.Xaml.Data.PropertyChangedEventHandler`|`System.ComponentModel.PropertyChangedEventHandler`| -|`Windows.UI.Xaml.Data.PropertyChangedEventArgs`|`System.ComponentModel.PropertyChangedEventArgs`| - -In the Windows Runtime, `IMap` and `IMapView` are iterated using `IKeyValuePair`. When you pass them to managed code, they appear as `IDictionary` and `IReadOnlyDictionary`, so naturally you use `System.Collections.Generic.KeyValuePair` to enumerate them. - -The way interfaces appear in managed code affects the way types that implement these interfaces appear. For example, the `PropertySet` class implements `IMap`, which appears in managed code as `IDictionary`. `PropertySet` appears as if it implemented `IDictionary` instead of `IMap`, so in managed code it appears to have an `Add` method, which behaves like the `Add` method on .NET Framework dictionaries. It doesn't appear to have an `Insert` method. - -For more information about using the .NET Framework to create a Windows Runtime component, and a walkthrough that shows how to use such a component with JavaScript, see [Creating Windows Runtime Components in C# and Visual Basic](/windows/uwp/winrt-components/creating-windows-runtime-components-in-csharp-and-visual-basic). - -### Primitive Types - -To enable the natural use of the Windows Runtime in managed code, .NET Framework primitive types appear instead of Windows Runtime primitive types in your code. In the .NET Framework, primitive types like the `Int32` structure have many useful properties and methods, such as the `Int32.TryParse` method. By contrast, primitive types and structures in the Windows Runtime have only fields. When you use primitives in managed code, they appear to be .NET Framework types, and you can use the properties and methods of the .NET Framework types as you normally would. The following list provides a summary: - -- For the Windows Runtime primitives `Int32`, `Int64`, `Single`, `Double`, `Boolean`, `String` (an immutable collection of Unicode characters), `Enum`, `UInt32`, `UInt64`, and `Guid`, use the type of the same name in the `System` namespace. - -- For `UInt8`, use `System.Byte`. - -- For `Char16`, use `System.Char`. - -- For the `IInspectable` interface, use `System.Object`. - -- For `HRESULT`, use a structure with one `System.Int32` member. - -As with interface types, the only time you might see evidence of this representation is when your .NET Framework project is a Windows Runtime component that is used by a Windows 8.x Store app built using JavaScript. - -Other basic, commonly used Windows Runtime types that appear in managed code as their .NET Framework equivalents include the `Windows.Foundation.DateTime` structure, which appears in managed code as the structure, and the `Windows.Foundation.TimeSpan` structure, which appears as the structure. - -### Other Differences - -In a few cases, the fact that .NET Framework types appear in your code instead of Windows Runtime types requires action on your part. For example, the class appears as in .NET Framework code. allows a relative URI, but requires an absolute URI. Therefore, when you pass a URI to a Windows Runtime method, you must ensure that it's absolute. See [Passing a URI to the Windows Runtime](passing-a-uri-to-the-windows-runtime.md). - - - -## Scenarios for Developing Windows Runtime Components - -The scenarios that are supported for managed Windows Runtime Components depend on the following general principles: - -- Windows Runtime Components that are built using the .NET Framework have no apparent differences from other Windows Runtimelibraries. For example, if you re-implement a native Windows Runtime component by using managed code, the two components are outwardly indistinguishable. The fact that your component is written in managed code is invisible to the code that uses it, even if that code is itself managed code. However, internally, your component is true managed code and runs on the common language runtime (CLR). - -- Components can contain types that implement application logic, Windows 8.x Store UI controls, or both. - - > [!NOTE] - > It's good practice to separate UI elements from application logic. Also, you can't use Windows 8.x Store UI controls in a Windows 8.x Store app built for Windows using JavaScript and HTML. - -- A component can be a project within a Visual Studio solution for a Windows 8.x Store app, or a reusable component that you can add to multiple solutions. - - > [!NOTE] - > If your component will be used only with C# or Visual Basic, there's no reason to make it a Windows Runtime component. If you make it an ordinary .NET Framework class library instead, you don't have to restrict its public API surface to Windows Runtime types. - -- You can release versions of reusable components by using the Windows Runtime attribute to identify which types (and which members within a type) were added in different versions. - -- The types in your component can derive from Windows Runtime types. Controls can derive from the primitive control types in the namespace or from more finished controls such as . - - > [!IMPORTANT] - > Starting with Windows 8 and the .NET Framework 4.5, all public types in a managed Windows Runtime component must be sealed. A type in another Windows Runtime component can't derive from them. If you want to provide polymorphic behavior in your component, you can create an interface and implement it in the polymorphic types. - -- All parameter and return types on the public types in your component must be Windows Runtime types (including the Windows Runtime types that your component defines). - -The following sections provide examples of common scenarios. - -### Application Logic for a Windows 8.x Store App with JavaScript - -When you develop a Windows 8.x Store app for Windows using JavaScript, you might find that some parts of the application logic perform better in managed code, or are easier to develop. JavaScript can't use .NET Framework class libraries directly, but you can make the class library a .WinMD file. In this scenario, the Windows Runtime component is an integral part of the app, so it doesn't make sense to provide version attributes. - -### Reusable Windows 8.x Store UI Controls - -You can package a set of related UI controls in a reusable Windows Runtime component. The component can be marketed on its own or used as an element in the apps you create. In this scenario, it makes sense to use the Windows Runtime attribute to improve compatibility. - -### Reusable Application Logic from Existing .NET Framework Apps - -You can package managed code from your existing desktop apps as a standalone Windows Runtime component. This enables you to use the component in Windows 8.x Store apps built using C++ or JavaScript, as well as in Windows 8.x Store apps built using C# or Visual Basic. Versioning is an option if there are multiple reuse scenarios for the code. - -## Related Topics - -|Title|Description| -|-----------|-----------------| -|[.NET for Windows Store apps overview](/previous-versions/windows/apps/br230302(v=vs.140))|Describes the .NET Framework types and members that you can use to create Windows 8.x Store apps and Windows RuntimeComponents. (In the Windows Dev Center.)| -|[Roadmap for Windows Store apps using C# or Visual Basic](/previous-versions/windows/apps/br229583(v=win.10))|Provides key resources to help you get started developing Windows 8.x Store apps by using C# or Visual Basic, including many Quickstart topics, guidelines, and best practices. (In the Windows Dev Center.)| -|[How tos (XAML)](/previous-versions/windows/apps/br229566(v=win.10))|Provides key resources to help you get started developing Windows 8.x Store apps by using C# or Visual Basic, including many Quickstart topics, guidelines, and best practices. (In the Windows Dev Center.)| -|[Creating Windows Runtime Components in C# and Visual Basic](/windows/uwp/winrt-components/creating-windows-runtime-components-in-csharp-and-visual-basic)|Describes how to create a Windows Runtime component using the .NET Framework, explains how to use it as part of a Windows 8.x Store app built for Windows using JavaScript, and describes how to debug the combination with Visual Studio. (In the Windows Dev Center.)| -|[Windows Runtime reference](/uwp/api/)|The reference documentation for the Windows Runtime. (In the Windows Dev Center.)| -|[Passing a URI to the Windows Runtime](passing-a-uri-to-the-windows-runtime.md)|Describes an issue that can arise when you pass a URI from managed code to the Windows Runtime, and how to avoid it.| diff --git a/docs/framework/cross-platform/using-portable-class-library-with-model-view-view-model.md b/docs/framework/cross-platform/using-portable-class-library-with-model-view-view-model.md deleted file mode 100644 index 35d9385b445c1..0000000000000 --- a/docs/framework/cross-platform/using-portable-class-library-with-model-view-view-model.md +++ /dev/null @@ -1,94 +0,0 @@ ---- -description: "Learn more about: Using Portable Class Library with Model-View-View Model" -title: "Using Portable Class Library with Model-View-View Model" -ms.date: "07/18/2018" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "Portable Class Library [.NET Framework], and MVVM" - - "MVVM, and Portable Class Library" -ms.assetid: 41a0b9f8-15a2-431a-bc35-e310b2953b03 ---- -# Using Portable Class Library with Model-View-View Model - -You can use the .NET Framework [Portable Class Library](portable-class-library.md) to implement the Model-View-View Model (MVVM) pattern and share assemblies across multiple platforms. - -[!INCLUDE[standard](../../../includes/pcl-to-standard.md)] - - MVVM is an application pattern that isolates the user interface from the underlying business logic. You can implement the model and view model classes in a Portable Class Library project in Visual Studio 2012, and then create views that are customized for different platforms. This approach enables you to write the data model and business logic only once, and use that code from .NET Framework, Silverlight, Windows Phone, and Windows 8.x Store apps, as shown in the following illustration. - - ![Shows the Portable Class Library with MVVM sharing assemblies across platforms.](./media/using-portable-class-library-with-model-view-view-model/mvvm-share-assemblies-across-platforms.png) - - This topic does not provide general information about the MVVM pattern. It only provides information about how to use Portable Class Library to implement MVVM. For more information about MVVM, see the [MVVM Quickstart Using the Prism Library 5.0 for WPF](/previous-versions/msp-n-p/gg430857(v=pandp.40)). - -## Classes That Support MVVM - - When you target the .NET Framework 4.5, .NET for Windows 8.x Store apps, Silverlight, or Windows Phone 7.5 for your Portable Class Library project, the following classes are available for implementing the MVVM pattern: - -- class - -- class - -- class - -- class - -- class - -- class - -- class - -- class - -- class - -- class - -- All classes in the namespace - -## Implementing MVVM - - To implement MVVM, you typically create both the model and the view model in a Portable Class Library project, because a Portable Class Library project cannot reference a non-portable project. The model and view model can be in the same project or in separate projects. If you use separate projects, add a reference from the view model project to the model project. - - After you compile the model and view model projects, you reference those assemblies in the app that contains the view. If the view interacts only with the view model, you only have to reference the assembly that contains the view model. - -### Model - - The following example shows a simplified model class that could reside in a Portable Class Library project. - - [!code-csharp[PortableClassLibraryMVVM#1](../../../samples/snippets/csharp/VS_Snippets_CLR/portableclasslibrarymvvm/cs/customer.cs#1)] - [!code-vb[PortableClassLibraryMVVM#1](../../../samples/snippets/visualbasic/VS_Snippets_CLR/portableclasslibrarymvvm/vb/customer.vb#1)] - - The following example shows a simple way to populate, retrieve, and update the data in a Portable Class Library project. In a real app, you would retrieve the data from a source such as a Windows Communication Foundation (WCF) service. - - [!code-csharp[PortableClassLibraryMVVM#2](../../../samples/snippets/csharp/VS_Snippets_CLR/portableclasslibrarymvvm/cs/customerrepository.cs#2)] - [!code-vb[PortableClassLibraryMVVM#2](../../../samples/snippets/visualbasic/VS_Snippets_CLR/portableclasslibrarymvvm/vb/customerrepository.vb#2)] - -### View Model - - A base class for view models is frequently added when implementing the MVVM pattern. The following example shows a base class. - - [!code-csharp[PortableClassLibraryMVVM#3](../../../samples/snippets/csharp/VS_Snippets_CLR/portableclasslibrarymvvm/cs/viewmodelbase.cs#3)] - [!code-vb[PortableClassLibraryMVVM#3](../../../samples/snippets/visualbasic/VS_Snippets_CLR/portableclasslibrarymvvm/vb/viewmodelbase.vb#3)] - - An implementation of the interface is frequently used with the MVVM pattern. The following example shows an implementation of the interface. - - [!code-csharp[PortableClassLibraryMVVM#4](../../../samples/snippets/csharp/VS_Snippets_CLR/portableclasslibrarymvvm/cs/relaycommand.cs#4)] - [!code-vb[PortableClassLibraryMVVM#4](../../../samples/snippets/visualbasic/VS_Snippets_CLR/portableclasslibrarymvvm/vb/relaycommand.vb#4)] - - The following example shows a simplified view model. - - [!code-csharp[PortableClassLibraryMVVM#5](../../../samples/snippets/csharp/VS_Snippets_CLR/portableclasslibrarymvvm/cs/mainpageviewmodel.cs#5)] - [!code-vb[PortableClassLibraryMVVM#5](../../../samples/snippets/visualbasic/VS_Snippets_CLR/portableclasslibrarymvvm/vb/customerviewmodel.vb#5)] - -### View - - From a .NET Framework 4.5 app, Windows 8.x Store app, Silverlight-based app, or Windows Phone 7.5 app, you can reference the assembly that contains the model and view model projects. You then create a view that interacts with the view model. The following example shows a simplified Windows Presentation Foundation (WPF) app that retrieves and updates data from the view model. You could create similar views in Silverlight, Windows Phone, or Windows 8.x Store apps. - - [!code-xaml[PortableClassLibraryMVVM#6](../../../samples/snippets/csharp/VS_Snippets_CLR/portableclasslibrarymvvm/cs/mainwindow.xaml#6)] - -## See also - -- [Portable Class Library](portable-class-library.md) diff --git a/docs/framework/develop-client-apps.md b/docs/framework/develop-client-apps.md index ebd5630a82294..3a12aeb903a50 100644 --- a/docs/framework/develop-client-apps.md +++ b/docs/framework/develop-client-apps.md @@ -33,7 +33,7 @@ Describes how to create UWP applications that you can make available to users th [.NET API for UWP apps](../../api/index.md?view=dotnet-uwp-10.0)\ Reference for .NET types that support UWP apps. -[Develop for Multiple Platforms](./cross-platform/index.md)\ +[Develop for Multiple Platforms](/previous-versions/dotnet/framework/cross-platform/index)\ Describes the different methods you can use .NET Framework to target multiple client app types. [Get Started with ASP.NET Web Sites](https://dotnet.microsoft.com/apps/aspnet/web-apps)\ diff --git a/docs/framework/development-guide.md b/docs/framework/development-guide.md index e8e2abe71d1d8..39e3755233be1 100644 --- a/docs/framework/development-guide.md +++ b/docs/framework/development-guide.md @@ -45,7 +45,7 @@ This section explains how to create, configure, debug, secure, and deploy your . [Debugging, Tracing, and Profiling](./debug-trace-profile/index.md) Explains how to test, optimize, and profile .NET Framework apps and the app environment. This section includes information for administrators as well as developers. - [Developing for Multiple Platforms](./cross-platform/index.md) + [Developing for Multiple Platforms](/previous-versions/dotnet/framework/cross-platform/index) Provides information about how you can use the .NET Framework to build assemblies that can be shared across multiple platforms and multiple devices such as phones, desktop, and web. [Deployment](./deployment/index.md) diff --git a/docs/framework/tools/ildasm-exe-il-disassembler.md b/docs/framework/tools/ildasm-exe-il-disassembler.md index 49762d6094d52..6846785a91c56 100644 --- a/docs/framework/tools/ildasm-exe-il-disassembler.md +++ b/docs/framework/tools/ildasm-exe-il-disassembler.md @@ -46,7 +46,7 @@ The following additional options are available for *.exe*, *.dll*, and *.winmd* |**/linenum**|Includes references to original source lines.| |**/nobar**|Suppresses the disassembly progress indicator pop-up window.| |**/noca**|Suppresses the output of custom attributes.| -|**/project**|Displays metadata the way it appears to managed code, instead of the way it appears in the native Windows Runtime. If `PEfilename` is not a Windows metadata (*.winmd*) file, this option has no effect. See [.NET Framework Support for Windows Store Apps and Windows Runtime](../cross-platform/support-for-windows-store-apps-and-windows-runtime.md).| +|**/project**|Displays metadata the way it appears to managed code, instead of the way it appears in the native Windows Runtime. If `PEfilename` is not a Windows metadata (*.winmd*) file, this option has no effect. See [.NET Framework Support for Windows Store Apps and Windows Runtime](/previous-versions/dotnet/framework/cross-platform/support-for-windows-store-apps-and-windows-runtime).| |**/pubonly**|Disassembles only public types and members. Equivalent to **/visibility:PUB**.| |**/quoteallnames**|Includes all names in single quotes.| |**/raweh**|Shows exception handling clauses in raw form.| diff --git a/docs/framework/tools/winmdexp-exe-windows-runtime-metadata-export-tool.md b/docs/framework/tools/winmdexp-exe-windows-runtime-metadata-export-tool.md index ef1cda4c85314..0f1160414e102 100644 --- a/docs/framework/tools/winmdexp-exe-windows-runtime-metadata-export-tool.md +++ b/docs/framework/tools/winmdexp-exe-windows-runtime-metadata-export-tool.md @@ -43,11 +43,11 @@ winmdexp [options] winmdmodule Winmdexp.exe is not designed to convert an arbitrary .NET Framework assembly to a .winmd file. It requires a module that is compiled with the `/target:winmdobj` option, and additional restrictions apply. The most important of these restrictions is that all types that are exposed in the API surface of the assembly must be Windows Runtime types. For more information, see the "Declaring types in Windows Runtime Components" section of the article [Creating Windows Runtime Components in C# and Visual Basic](/previous-versions/br230301(v=vs.110)). - When you write a Windows 8.x Store app or a Windows Runtime component with C# or Visual Basic, the .NET Framework provides support to make programming with the Windows Runtime more natural. This is discussed in the article [.NET Framework Support for Windows Store Apps and Windows Runtime](../cross-platform/support-for-windows-store-apps-and-windows-runtime.md). In the process, some commonly used Windows Runtime types are mapped to .NET Framework types. Winmdexp.exe reverses this process and produces an API surface that uses the corresponding Windows Runtime types. For example, types that are constructed from the interface map to types that are constructed from the Windows Runtime interface. + When you write a Windows 8.x Store app or a Windows Runtime component with C# or Visual Basic, the .NET Framework provides support to make programming with the Windows Runtime more natural. This is discussed in the article [.NET Framework Support for Windows Store Apps and Windows Runtime](/previous-versions/dotnet/framework/cross-platform/support-for-windows-store-apps-and-windows-runtime). In the process, some commonly used Windows Runtime types are mapped to .NET Framework types. Winmdexp.exe reverses this process and produces an API surface that uses the corresponding Windows Runtime types. For example, types that are constructed from the interface map to types that are constructed from the Windows Runtime interface. ## See also -- [.NET Framework Support for Windows Store Apps and Windows Runtime](../cross-platform/support-for-windows-store-apps-and-windows-runtime.md) +- [.NET Framework Support for Windows Store Apps and Windows Runtime](/previous-versions/dotnet/framework/cross-platform/support-for-windows-store-apps-and-windows-runtime) - [Creating Windows Runtime Components in C# and Visual Basic](/previous-versions/br230301(v=vs.110)) - [Winmdexp.exe Error Messages](winmdexp-exe-error-messages.md) - [Build, Deployment, and Configuration Tools (.NET Framework)](/previous-versions/dotnet/netframework-4.0/dd233108(v=vs.100)) diff --git a/docs/framework/unmanaged-api/profiling/clr-profilers-and-windows-store-apps.md b/docs/framework/unmanaged-api/profiling/clr-profilers-and-windows-store-apps.md index f1ffb37927463..d25a7d917cbcd 100644 --- a/docs/framework/unmanaged-api/profiling/clr-profilers-and-windows-store-apps.md +++ b/docs/framework/unmanaged-api/profiling/clr-profilers-and-windows-store-apps.md @@ -352,7 +352,7 @@ Your Profiler DLL can distinguish WinMD files from other modules by calling the ### Reading metadata from WinMDs -WinMD files, like regular modules, contain metadata that can be read via the [Metadata APIs](../metadata/index.md). However, the CLR maps Windows Runtime types to .NET Framework types when it reads WinMD files so that developers who program in managed code and consume the WinMD file can have a more natural programming experience. For some examples of these mappings, see [.NET Framework Support for Windows Store Apps and Windows Runtime](../../cross-platform/support-for-windows-store-apps-and-windows-runtime.md). +WinMD files, like regular modules, contain metadata that can be read via the [Metadata APIs](../metadata/index.md). However, the CLR maps Windows Runtime types to .NET Framework types when it reads WinMD files so that developers who program in managed code and consume the WinMD file can have a more natural programming experience. For some examples of these mappings, see [.NET Framework Support for Windows Store Apps and Windows Runtime](/previous-versions/dotnet/framework/cross-platform/support-for-windows-store-apps-and-windows-runtime). So which view will your profiler get when it uses the metadata APIs: the raw Windows Runtime view, or the mapped .NET Framework view? The answer: it’s up to you. @@ -402,7 +402,7 @@ It is possible to use the CLR Profiling API to analyze managed code running insi **The CLR's interaction with the Windows Runtime** -- [.NET Framework Support for Windows Store Apps and Windows Runtime](../../cross-platform/support-for-windows-store-apps-and-windows-runtime.md) +- [.NET Framework Support for Windows Store Apps and Windows Runtime](/previous-versions/dotnet/framework/cross-platform/support-for-windows-store-apps-and-windows-runtime) **Windows Store apps** diff --git a/docs/framework/wcf/add-service-reference-in-a-portable-subset-project.md b/docs/framework/wcf/add-service-reference-in-a-portable-subset-project.md index 3b36e1b42966c..9d166e0029de8 100644 --- a/docs/framework/wcf/add-service-reference-in-a-portable-subset-project.md +++ b/docs/framework/wcf/add-service-reference-in-a-portable-subset-project.md @@ -43,4 +43,4 @@ Portable subset projects enable .NET assembly programmers to maintain a single s ## See also - [Accessing Services Using a WCF Client](accessing-services-using-a-wcf-client.md) -- [Portable Class Library](../cross-platform/portable-class-library.md) +- [Portable Class Library](/previous-versions/dotnet/framework/cross-platform/portable-class-library) diff --git a/docs/framework/whats-new/index.md b/docs/framework/whats-new/index.md index 86d3d3d133a41..4fe3a28665c73 100644 --- a/docs/framework/whats-new/index.md +++ b/docs/framework/whats-new/index.md @@ -1850,7 +1850,7 @@ Universal Windows Platform (UWP) apps that are written in C# or Visual Basic can - You can retarget a Windows Store or Windows Phone Store class library like a Portable Class Library. - For more information about these changes, see [Portable Class Library](../cross-platform/portable-class-library.md). + For more information about these changes, see [Portable Class Library](/previous-versions/dotnet/framework/cross-platform/portable-class-library). - The .NET Framework content set now includes documentation for .NET Native, which is a precompilation technology for building and deploying Windows apps. .NET Native compiles your apps directly to native code, rather than to intermediate language (IL), for better performance. For details, see [Compiling Apps with .NET Native](/windows/uwp/dotnet-native/). @@ -2120,7 +2120,7 @@ Windows 8.x Store apps are designed for specific form factors and leverage the p ### Portable Class Libraries -The Portable Class Library project in Visual Studio 2012 (and later versions) enables you to write and build managed assemblies that work on multiple .NET Framework platforms. Using a Portable Class Library project, you choose the platforms (such as Windows Phone and .NET for Windows 8.x Store apps) to target. The available types and members in your project are automatically restricted to the common types and members across these platforms. For more information, see [Portable Class Library](../cross-platform/portable-class-library.md). +The Portable Class Library project in Visual Studio 2012 (and later versions) enables you to write and build managed assemblies that work on multiple .NET Framework platforms. Using a Portable Class Library project, you choose the platforms (such as Windows Phone and .NET for Windows 8.x Store apps) to target. The available types and members in your project are automatically restricted to the common types and members across these platforms. For more information, see [Portable Class Library](/previous-versions/dotnet/framework/cross-platform/portable-class-library). ## See also From 3867c9bf2d09e50f5b12ce3ee335d7b1e4f8d31e Mon Sep 17 00:00:00 2001 From: Genevieve Warren <24882762+gewarren@users.noreply.github.com> Date: Mon, 21 Jun 2021 10:13:31 -0700 Subject: [PATCH 061/105] Delete SQL Server security docs (#24696) --- .openpublishing.redirection.json | 85 ++++++++++++++++++ .../data/adonet/code-access-security.md | 2 +- .../data/adonet/privacy-and-data-security.md | 2 +- .../data/adonet/secure-data-access.md | 6 +- .../adonet/securing-ado-net-applications.md | 2 +- .../data/adonet/security-overview.md | 4 +- .../adonet/sql-server-connection-pooling.md | 2 +- ...cation-security-scenarios-in-sql-server.md | 67 -------------- .../sql/authentication-in-sql-server.md | 87 ------------------- ...orization-and-permissions-in-sql-server.md | 71 --------------- .../clr-integration-security-in-sql-server.md | 27 ------ ...reating-application-roles-in-sql-server.md | 67 -------------- ...ssions-with-impersonation-in-sql-server.md | 77 ---------------- .../sql/data-encryption-in-sql-server.md | 38 -------- ...ing-cross-database-access-in-sql-server.md | 60 ------------- ...ing-row-level-permissions-in-sql-server.md | 68 --------------- docs/framework/data/adonet/sql/index.md | 2 +- .../sql/linq/security-in-linq-to-sql.md | 2 +- ...ns-with-stored-procedures-in-sql-server.md | 68 --------------- .../sql/overview-of-sql-server-security.md | 44 ---------- ...nd-user-schema-separation-in-sql-server.md | 68 --------------- ...server-and-database-roles-in-sql-server.md | 73 ---------------- ...signing-stored-procedures-in-sql-server.md | 64 -------------- .../adonet/sql/sql-server-express-security.md | 41 --------- .../data/adonet/sql/sql-server-security.md | 43 --------- docs/framework/data/adonet/sql/toc.yml | 33 ------- ...riting-secure-dynamic-sql-in-sql-server.md | 79 ----------------- 27 files changed, 96 insertions(+), 1086 deletions(-) delete mode 100644 docs/framework/data/adonet/sql/application-security-scenarios-in-sql-server.md delete mode 100644 docs/framework/data/adonet/sql/authentication-in-sql-server.md delete mode 100644 docs/framework/data/adonet/sql/authorization-and-permissions-in-sql-server.md delete mode 100644 docs/framework/data/adonet/sql/clr-integration-security-in-sql-server.md delete mode 100644 docs/framework/data/adonet/sql/creating-application-roles-in-sql-server.md delete mode 100644 docs/framework/data/adonet/sql/customizing-permissions-with-impersonation-in-sql-server.md delete mode 100644 docs/framework/data/adonet/sql/data-encryption-in-sql-server.md delete mode 100644 docs/framework/data/adonet/sql/enabling-cross-database-access-in-sql-server.md delete mode 100644 docs/framework/data/adonet/sql/granting-row-level-permissions-in-sql-server.md delete mode 100644 docs/framework/data/adonet/sql/managing-permissions-with-stored-procedures-in-sql-server.md delete mode 100644 docs/framework/data/adonet/sql/overview-of-sql-server-security.md delete mode 100644 docs/framework/data/adonet/sql/ownership-and-user-schema-separation-in-sql-server.md delete mode 100644 docs/framework/data/adonet/sql/server-and-database-roles-in-sql-server.md delete mode 100644 docs/framework/data/adonet/sql/signing-stored-procedures-in-sql-server.md delete mode 100644 docs/framework/data/adonet/sql/sql-server-express-security.md delete mode 100644 docs/framework/data/adonet/sql/sql-server-security.md delete mode 100644 docs/framework/data/adonet/sql/writing-secure-dynamic-sql-in-sql-server.md diff --git a/.openpublishing.redirection.json b/.openpublishing.redirection.json index 1dbac2e4b955b..024b39a7c5ba6 100644 --- a/.openpublishing.redirection.json +++ b/.openpublishing.redirection.json @@ -4247,6 +4247,91 @@ "source_path": "docs/framework/data/adonet/sql/linq/linq-to-sql-with-tightly-coupled-client-server-applications.md", "redirect_url": "/previous-versions/dotnet/netframework-4.0/bb882676(v=vs.100)" }, + { + "source_path": "docs/framework/data/adonet/sql/sql-server-security.md", + "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/sql-server-security", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/adonet/sql/overview-of-sql-server-security.md", + "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/overview-of-sql-server-security", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/adonet/sql/authentication-in-sql-server.md", + "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/authentication-in-sql-server", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/adonet/sql/authorization-and-permissions-in-sql-server.md", + "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/authorization-and-permissions-in-sql-server", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/adonet/sql/server-and-database-roles-in-sql-server.md", + "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/server-and-database-roles-in-sql-server", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/adonet/sql/ownership-and-user-schema-separation-in-sql-server.md", + "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/ownership-and-user-schema-separation-in-sql-server", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/adonet/sql/data-encryption-in-sql-server.md", + "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/data-encryption-in-sql-server", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/adonet/sql/clr-integration-security-in-sql-server.md", + "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/clr-integration-security-in-sql-server", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/adonet/sql/application-security-scenarios-in-sql-server.md", + "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/application-security-scenarios-in-sql-server", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/adonet/sql/managing-permissions-with-stored-procedures-in-sql-server.md", + "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/managing-permissions-with-stored-procedures-in-sql-server", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/adonet/sql/writing-secure-dynamic-sql-in-sql-server.md", + "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/writing-secure-dynamic-sql-in-sql-server", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/adonet/sql/signing-stored-procedures-in-sql-server.md", + "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/signing-stored-procedures-in-sql-server", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/adonet/sql/customizing-permissions-with-impersonation-in-sql-server.md", + "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/customizing-permissions-with-impersonation-in-sql-server", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/adonet/sql/granting-row-level-permissions-in-sql-server.md", + "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/granting-row-level-permissions-in-sql-server", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/adonet/sql/creating-application-roles-in-sql-server.md", + "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/creating-application-roles-in-sql-server", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/adonet/sql/enabling-cross-database-access-in-sql-server.md", + "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/enabling-cross-database-access-in-sql-server", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/data/adonet/sql/sql-server-express-security.md", + "redirect_url": "/previous-versions/dotnet/framework/data/adonet/sql/sql-server-express-security", + "redirect_document_id": false + }, { "source_path": "docs/framework/data/wcf/writing-a-windows-store-app-that-consumes-an-odata-service.md", "redirect_url": "/dotnet/framework/data/wcf/" diff --git a/docs/framework/data/adonet/code-access-security.md b/docs/framework/data/adonet/code-access-security.md index 21592cac89d95..f530510a4357f 100644 --- a/docs/framework/data/adonet/code-access-security.md +++ b/docs/framework/data/adonet/code-access-security.md @@ -46,7 +46,7 @@ The .NET Framework offers role-based security as well as code access security (C The CLR uses permissions to implement its mechanism for enforcing restrictions on managed code. Role-based security permissions provide a mechanism for discovering whether a user (or the agent acting on the user's behalf) has a particular identity or is a member of a specified role. For more information, see [Security Permissions](/previous-versions/dotnet/netframework-4.0/5ba4k1c5(v=vs.100)). - Depending on the type of application you are building, you should also consider implementing role-based permissions in the database. For more information on role-based security in SQL Server, see [SQL Server Security](./sql/sql-server-security.md). + Depending on the type of application you are building, you should also consider implementing role-based permissions in the database. For more information on role-based security in SQL Server, see [SQL Server Security](/previous-versions/dotnet/framework/data/adonet/sql/sql-server-security). ## Assemblies diff --git a/docs/framework/data/adonet/privacy-and-data-security.md b/docs/framework/data/adonet/privacy-and-data-security.md index 7a93c5d5207be..3c8185bae5c06 100644 --- a/docs/framework/data/adonet/privacy-and-data-security.md +++ b/docs/framework/data/adonet/privacy-and-data-security.md @@ -29,5 +29,5 @@ Safeguarding and managing sensitive information in an ADO.NET application is dep ## See also - [Securing ADO.NET Applications](securing-ado-net-applications.md) -- [SQL Server Security](./sql/sql-server-security.md) +- [SQL Server Security](/previous-versions/dotnet/framework/data/adonet/sql/sql-server-security) - [ADO.NET Overview](ado-net-overview.md) diff --git a/docs/framework/data/adonet/secure-data-access.md b/docs/framework/data/adonet/secure-data-access.md index 9841a53eba76b..34507644dc7fb 100644 --- a/docs/framework/data/adonet/secure-data-access.md +++ b/docs/framework/data/adonet/secure-data-access.md @@ -23,7 +23,7 @@ To write secure ADO.NET code, you have to understand the security mechanisms ava |[Protecting Connection Information](protecting-connection-information.md)|Describes security best practices and techniques for protecting connection information, such as using protected configuration to encrypt connection strings.| |[Recommendations for Data Access Strategies](/previous-versions/visualstudio/visual-studio-2008/8fxztkff(v=vs.90))|Provides recommendations for accessing data and performing database operations.| |[Connection String Builders](connection-string-builders.md)|Describes how to build connection strings from user input at run time.| -|[Overview of SQL Server Security](./sql/overview-of-sql-server-security.md)|Describes the SQL Server security architecture.| +|[Overview of SQL Server Security](/previous-versions/dotnet/framework/data/adonet/sql/overview-of-sql-server-security)|Describes the SQL Server security architecture.| ## Parameterized Commands and SQL Injection @@ -35,7 +35,7 @@ To write secure ADO.NET code, you have to understand the security mechanisms ava |--------------|-----------------| |[DataAdapter Parameters](dataadapter-parameters.md)|Describes how to use parameters with a `DataAdapter`.| |[Modifying Data with Stored Procedures](modifying-data-with-stored-procedures.md)|Describes how to specify parameters and obtain a return value.| -|[Managing Permissions with Stored Procedures in SQL Server](./sql/managing-permissions-with-stored-procedures-in-sql-server.md)|Describes how to use SQL Server stored procedures to encapsulate data access.| +|[Managing Permissions with Stored Procedures in SQL Server](/previous-versions/dotnet/framework/data/adonet/sql/managing-permissions-with-stored-procedures-in-sql-server)|Describes how to use SQL Server stored procedures to encapsulate data access.| ## Script Exploits @@ -93,7 +93,7 @@ To write secure ADO.NET code, you have to understand the security mechanisms ava ## See also - [Securing ADO.NET Applications](securing-ado-net-applications.md) -- [SQL Server Security](./sql/sql-server-security.md) +- [SQL Server Security](/previous-versions/dotnet/framework/data/adonet/sql/sql-server-security) - [Recommendations for Data Access Strategies](/previous-versions/visualstudio/visual-studio-2008/8fxztkff(v=vs.90)) - [Protecting Connection Information](protecting-connection-information.md) - [Connection String Builders](connection-string-builders.md) diff --git a/docs/framework/data/adonet/securing-ado-net-applications.md b/docs/framework/data/adonet/securing-ado-net-applications.md index c24820fbb3d63..cf8781f6f1d07 100644 --- a/docs/framework/data/adonet/securing-ado-net-applications.md +++ b/docs/framework/data/adonet/securing-ado-net-applications.md @@ -34,7 +34,7 @@ Writing secure code does not guard against self-inflicted security holes when wo [DataSet and DataTable security guidance](dataset-datatable-dataview/security-guidance.md) Provides security guidance for and . - [SQL Server Security](./sql/sql-server-security.md) + [SQL Server Security](/previous-versions/dotnet/framework/data/adonet/sql/sql-server-security) Describes SQL Server security features from a developer's perspective. [Security Considerations](./ef/security-considerations.md) diff --git a/docs/framework/data/adonet/security-overview.md b/docs/framework/data/adonet/security-overview.md index e503152034a3f..f7b9f653d9b7d 100644 --- a/docs/framework/data/adonet/security-overview.md +++ b/docs/framework/data/adonet/security-overview.md @@ -89,7 +89,7 @@ For more information, see the following resources: |Resource|Description| |--------------|-----------------| -|[SQL Server Security](./sql/sql-server-security.md)|Provides an overview of SQL Server security with application scenarios that provide guidance for creating secure ADO.NET applications that target SQL Server.| +|[SQL Server Security](/previous-versions/dotnet/framework/data/adonet/sql/sql-server-security)|Provides an overview of SQL Server security with application scenarios that provide guidance for creating secure ADO.NET applications that target SQL Server.| |[Recommendations for Data Access Strategies](/previous-versions/visualstudio/visual-studio-2008/8fxztkff(v=vs.90))|Provides recommendations for accessing data and performing database operations.| ## Security Policy and Administration @@ -107,5 +107,5 @@ For more information, see the following resources: - [Securing ADO.NET Applications](securing-ado-net-applications.md) - [Security in .NET](../../../standard/security/index.md) -- [SQL Server Security](./sql/sql-server-security.md) +- [SQL Server Security](/previous-versions/dotnet/framework/data/adonet/sql/sql-server-security) - [ADO.NET Overview](ado-net-overview.md) diff --git a/docs/framework/data/adonet/sql-server-connection-pooling.md b/docs/framework/data/adonet/sql-server-connection-pooling.md index d8053825f2a40..7b763b650ee0b 100644 --- a/docs/framework/data/adonet/sql-server-connection-pooling.md +++ b/docs/framework/data/adonet/sql-server-connection-pooling.md @@ -134,7 +134,7 @@ using (SqlConnection connection = new SqlConnection( ### Application Role Alternatives - We recommend that you take advantage of security mechanisms that you can use instead of application roles. For more information, see [Creating Application Roles in SQL Server](./sql/creating-application-roles-in-sql-server.md). + We recommend that you take advantage of security mechanisms that you can use instead of application roles. For more information, see [Creating Application Roles in SQL Server](/previous-versions/dotnet/framework/data/adonet/sql/creating-application-roles-in-sql-server). ## See also diff --git a/docs/framework/data/adonet/sql/application-security-scenarios-in-sql-server.md b/docs/framework/data/adonet/sql/application-security-scenarios-in-sql-server.md deleted file mode 100644 index 20668fb26f578..0000000000000 --- a/docs/framework/data/adonet/sql/application-security-scenarios-in-sql-server.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -description: "Learn more about: Application Security Scenarios in SQL Server" -title: "Application Security Scenarios in SQL Server" -ms.date: "03/30/2017" -ms.assetid: 0164f3a4-406e-4693-bec3-03c8e18b46d7 ---- -# Application Security Scenarios in SQL Server - -There is no single correct way to create a secure SQL Server client application. Every application is unique in its requirements, deployment environment, and user population. An application that is reasonably secure when it is initially deployed can become less secure over time. It is impossible to predict with any accuracy what threats may emerge in the future. - - SQL Server, as a product, has evolved over many versions to incorporate the latest security features that enable developers to create secure database applications. However, security doesn't come in the box; it requires continual monitoring and updating. - -## Common Threats - - Developers need to understand security threats, the tools provided to counter them, and how to avoid self-inflicted security holes. Security can best be thought of as a chain, where a break in any one link compromises the strength of the whole. The following list includes some common security threats that are discussed in more detail in the topics in this section. - -### SQL Injection - - SQL Injection is the process by which a malicious user enters Transact-SQL statements instead of valid input. If the input is passed directly to the server without being validated and if the application inadvertently executes the injected code, then the attack has the potential to damage or destroy data. You can thwart SQL Server injection attacks by using stored procedures and parameterized commands, avoiding dynamic SQL, and restricting permissions on all users. - -### Elevation of Privilege - - Elevation of privilege attacks occur when a user is able to assume the privileges of a trusted account, such as an owner or administrator. Always run under least-privileged user accounts and assign only needed permissions. Avoid using administrative or owner accounts for executing code. This limits the amount of damage that can occur if an attack succeeds. When performing tasks that require additional permissions, use procedure signing or impersonation only for the duration of the task. You can sign stored procedures with certificates or use impersonation to temporarily assign permissions. - -### Probing and Intelligent Observation - - A probing attack can use error messages generated by an application to search for security vulnerabilities. Implement error handling in all procedural code to prevent SQL Server error information from being returned to the end user. - -### Authentication - - A connection string injection attack can occur when using SQL Server logins if a connection string based on user input is constructed at run time. If the connection string is not checked for valid keyword pairs, an attacker can insert extra characters, potentially accessing sensitive data or other resources on the server. Use Windows authentication wherever possible. If you must use SQL Server logins, use the to create and validate connection strings at run time. - -### Passwords - - Many attacks succeed because an intruder was able to obtain or guess a password for a privileged user. Passwords are your first line of defense against intruders, so setting strong passwords is essential to the security of your system. Create and enforce password policies for mixed mode authentication. - - Always assign a strong password to the `sa` account, even when using Windows Authentication. - -## In This Section - - [Managing Permissions with Stored Procedures in SQL Server](managing-permissions-with-stored-procedures-in-sql-server.md) - Describes how to use stored procedures to manage permissions and control data access. Using stored procedures is an effective way to respond to many security threats. - - [Writing Secure Dynamic SQL in SQL Server](writing-secure-dynamic-sql-in-sql-server.md) - Describes techniques for writing secure dynamic SQL using stored procedures. - - [Signing Stored Procedures in SQL Server](signing-stored-procedures-in-sql-server.md) - Describes how to sign a stored procedure with a certificate to enable users to work with data they do not have direct access to. This enables stored procedures to perform operations that the caller does not have permissions to perform directly. - - [Customizing Permissions with Impersonation in SQL Server](customizing-permissions-with-impersonation-in-sql-server.md) - Describes how to use the EXECUTE AS clause to impersonate another user. Impersonation switches the execution context from the caller to the specified user. - - [Granting Row-Level Permissions in SQL Server](granting-row-level-permissions-in-sql-server.md) - Describes how to implement row-level permissions to restrict data access. - - [Creating Application Roles in SQL Server](creating-application-roles-in-sql-server.md) - Describes features and functionality of application roles. - - [Enabling Cross-Database Access in SQL Server](enabling-cross-database-access-in-sql-server.md) - Describes how to enable cross-database access without jeopardizing security. - -## See also - -- [SQL Server Security](sql-server-security.md) -- [Overview of SQL Server Security](overview-of-sql-server-security.md) -- [Securing ADO.NET Applications](../securing-ado-net-applications.md) -- [ADO.NET Overview](../ado-net-overview.md) diff --git a/docs/framework/data/adonet/sql/authentication-in-sql-server.md b/docs/framework/data/adonet/sql/authentication-in-sql-server.md deleted file mode 100644 index f7543284a45b1..0000000000000 --- a/docs/framework/data/adonet/sql/authentication-in-sql-server.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -title: "Authentication in SQL Server" -description: Learn about authentication with SQL Server for ADO.NET, including Windows authentication mode and mixed mode. -ms.date: "05/22/2018" -ms.assetid: 646ddbf5-dd4e-4285-8e4a-f565f666c5cc ---- -# Authentication in SQL Server - -SQL Server supports two authentication modes, Windows authentication mode and mixed mode. - -- Windows authentication is the default, and is often referred to as integrated security because this SQL Server security model is tightly integrated with Windows. Specific Windows user and group accounts are trusted to log in to SQL Server. Windows users who have already been authenticated do not have to present additional credentials. - -- Mixed mode supports authentication both by Windows and by SQL Server. User name and password pairs are maintained within SQL Server. - -> [!IMPORTANT] -> We recommend using Windows authentication wherever possible. Windows authentication uses a series of encrypted messages to authenticate users in SQL Server. When SQL Server logins are used, SQL Server login names and encrypted passwords are passed across the network, which makes them less secure. - - With Windows authentication, users are already logged onto Windows and do not have to log on separately to SQL Server. The following `SqlConnection.ConnectionString` specifies Windows authentication without requiring users to provide a user name or password. - -```csharp -"Server=MSSQL1;Database=AdventureWorks;Integrated Security=true;" -``` - -> [!NOTE] -> Logins are distinct from database users. You must map logins or Windows groups to database users or roles in a separate operation. You then grant permissions to users or roles to access database objects. - -## Authentication Scenarios - - Windows authentication is usually the best choice in the following situations: - -- There is a domain controller. - -- The application and the database are on the same computer. - -- You are using an instance of SQL Server Express or LocalDB. - - SQL Server logins are often used in the following situations: - -- If you have a workgroup. - -- Users connect from different, non-trusted domains. - -- Internet applications, such as ASP.NET. - -> [!NOTE] -> Specifying Windows authentication does not disable SQL Server logins. Use the ALTER LOGIN DISABLE Transact-SQL statement to disable highly-privileged SQL Server logins. - -## Login Types - - SQL Server supports three types of logins: - -- A local Windows user account or trusted domain account. SQL Server relies on Windows to authenticate the Windows user accounts. - -- Windows group. Granting access to a Windows group grants access to all Windows user logins that are members of the group. - -- SQL Server login. SQL Server stores both the username and a hash of the password in the master database, by using internal authentication methods to verify login attempts. - -> [!NOTE] -> SQL Server provides logins created from certificates or asymmetric keys that are used only for code signing. They cannot be used to connect to SQL Server. - -## Mixed Mode Authentication - - If you must use mixed mode authentication, you must create SQL Server logins, which are stored in SQL Server. You then have to supply the SQL Server user name and password at run time. - -> [!IMPORTANT] -> SQL Server installs with a SQL Server login named `sa` (an abbreviation of "system administrator"). Assign a strong password to the `sa` login and do not use the `sa` login in your application. The `sa` login maps to the `sysadmin` fixed server role, which has irrevocable administrative credentials on the whole server. There are no limits to the potential damage if an attacker gains access as a system administrator. - - SQL Server provides Windows password policy mechanisms for SQL Server logins. Password complexity policies are designed to deter brute force attacks by increasing the number of possible passwords. SQL Server can apply the same complexity and expiration policies to passwords used inside SQL Server. - -> [!IMPORTANT] -> Concatenating connection strings from user input can leave you vulnerable to a connection string injection attack. Use the to create syntactically valid connection strings at run time. For more information, see [Connection String Builders](../connection-string-builders.md). - -## External Resources - - For more information, see the following resources. - -|Resource|Description| -|--------------|-----------------| -|[Principals](/sql/relational-databases/security/authentication-access/principals-database-engine)|Describes logins and other security principals in SQL Server.| - -## See also - -- [Securing ADO.NET Applications](../securing-ado-net-applications.md) -- [Application Security Scenarios in SQL Server](application-security-scenarios-in-sql-server.md) -- [Connecting to a Data Source](../connecting-to-a-data-source.md) -- [Connection Strings](../connection-strings.md) -- [ADO.NET Overview](../ado-net-overview.md) diff --git a/docs/framework/data/adonet/sql/authorization-and-permissions-in-sql-server.md b/docs/framework/data/adonet/sql/authorization-and-permissions-in-sql-server.md deleted file mode 100644 index 8d3526a637d26..0000000000000 --- a/docs/framework/data/adonet/sql/authorization-and-permissions-in-sql-server.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: "Authorization and Permissions in SQL Server" -description: Learn to explicitly grant permissions to make database objects that you create accessible to users in SQL Server with ADO.NET. -ms.date: "03/30/2017" -ms.assetid: d340405c-91f4-4837-a3cc-a238ee89888a ---- -# Authorization and Permissions in SQL Server - -When you create database objects, you must explicitly grant permissions to make them accessible to users. Every securable object has permissions that can be granted to a principal using permission statements. - -## The Principle of Least Privilege - - Developing an application using a least-privileged user account (LUA) approach is an important part of a defensive, in-depth strategy for countering security threats. The LUA approach ensures that users follow the principle of least privilege and always log on with limited user accounts. Administrative tasks are broken out using fixed server roles, and the use of the `sysadmin` fixed server role is severely restricted. - - Always follow the principle of least privilege when granting permissions to database users. Grant the minimum permissions necessary to a user or role to accomplish a given task. - -> [!IMPORTANT] -> Developing and testing an application using the LUA approach adds a degree of difficulty to the development process. It is easier to create objects and write code while logged on as a system administrator or database owner than it is using a LUA account. However, developing applications using a highly privileged account can obfuscate the impact of reduced functionality when least privileged users attempt to run an application that requires elevated permissions in order to function correctly. Granting excessive permissions to users in order to reacquire lost functionality can leave your application vulnerable to attack. Designing, developing and testing your application logged on with a LUA account enforces a disciplined approach to security planning that eliminates unpleasant surprises and the temptation to grant elevated privileges as a quick fix. You can use a SQL Server login for testing even if your application is intended to deploy using Windows authentication. - -## Role-Based Permissions - - Granting permissions to roles rather than to users simplifies security administration. Permission sets that are assigned to roles are inherited by all members of the role. It is easier to add or remove users from a role than it is to recreate separate permission sets for individual users. Roles can be nested; however, too many levels of nesting can degrade performance. You can also add users to fixed database roles to simplify assigning permissions. - - You can grant permissions at the schema level. Users automatically inherit permissions on all new objects created in the schema; you do not need to grant permissions as new objects are created. - -## Permissions Through Procedural Code - - Encapsulating data access through modules such as stored procedures and user-defined functions provides an additional layer of protection around your application. You can prevent users from directly interacting with database objects by granting permissions only to stored procedures or functions while denying permissions to underlying objects such as tables. SQL Server achieves this by ownership chaining. - -## Permission Statements - - The three Transact-SQL permission statements are described in the following table. - -|Permission Statement|Description| -|--------------------------|-----------------| -|GRANT|Grants a permission.| -|REVOKE|Revokes a permission. This is the default state of a new object. A permission revoked from a user or role can still be inherited from other groups or roles to which the principal is assigned.| -|DENY|DENY revokes a permission so that it cannot be inherited. DENY takes precedence over all permissions, except DENY does not apply to object owners or members of `sysadmin`. If you DENY permissions on an object to the `public` role it is denied to all users and roles except for object owners and `sysadmin` members.| - -- The GRANT statement can assign permissions to a group or role that can be inherited by database users. However, the DENY statement takes precedence over all other permission statements. Therefore, a user who has been denied a permission cannot inherit it from another role. - -> [!NOTE] -> Members of the `sysadmin` fixed server role and object owners cannot be denied permissions. - -## Ownership Chains - - SQL Server ensures that only principals that have been granted permission can access objects. When multiple database objects access each other, the sequence is known as a chain. When SQL Server is traversing the links in the chain, it evaluates permissions differently than it would if it were accessing each item separately. When an object is accessed through a chain, SQL Server first compares the object's owner to the owner of the calling object (the previous link in the chain). If both objects have the same owner, permissions on the referenced object are not checked. Whenever an object accesses another object that has a different owner, the ownership chain is broken and SQL Server must check the caller's security context. - -## Procedural Code and Ownership Chaining - - Suppose that a user is granted execute permissions on a stored procedure that selects data from a table. If the stored procedure and the table have the same owner, the user doesn't need to be granted any permissions on the table and can even be denied permissions. However, if the stored procedure and the table have different owners, SQL Server must check the user's permissions on the table before allowing access to the data. - -> [!NOTE] -> Ownership chaining does not apply in the case of dynamic SQL statements. To call a procedure that executes an SQL statement, the caller must be granted permissions on the underlying tables, leaving your application vulnerable to SQL Injection attack. SQL Server provides new mechanisms, such as impersonation and signing modules with certificates, that do not require granting permissions on the underlying tables. These can also be used with CLR stored procedures. - -## External Resources - - For more information, see the following resources. - -|Resource|Description| -|--------------|-----------------| -|[Permissions](/sql/relational-databases/security/permissions-database-engine)|Contains topics describing permissions hierarchy, catalog views, and permissions of fixed server and database roles.| - -## See also - -- [Securing ADO.NET Applications](../securing-ado-net-applications.md) -- [Application Security Scenarios in SQL Server](application-security-scenarios-in-sql-server.md) -- [Authentication in SQL Server](authentication-in-sql-server.md) -- [Server and Database Roles in SQL Server](server-and-database-roles-in-sql-server.md) -- [Ownership and User-Schema Separation in SQL Server](ownership-and-user-schema-separation-in-sql-server.md) -- [ADO.NET Overview](../ado-net-overview.md) diff --git a/docs/framework/data/adonet/sql/clr-integration-security-in-sql-server.md b/docs/framework/data/adonet/sql/clr-integration-security-in-sql-server.md deleted file mode 100644 index a39d307c1220b..0000000000000 --- a/docs/framework/data/adonet/sql/clr-integration-security-in-sql-server.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -description: "Learn more about: CLR Integration Security in SQL Server" -title: "CLR Integration Security in SQL Server" -ms.date: "03/30/2017" -ms.assetid: 489fe096-fd1d-42de-8438-bf7aed46aea2 ---- -# CLR Integration Security in SQL Server - -Microsoft SQL Server provides the integration of the common language runtime (CLR) component of the .NET Framework. CLR integration allows you to write stored procedures, triggers, user-defined types, user-defined functions, user-defined aggregates, and streaming table-valued functions, using any .NET Framework language, such as Microsoft Visual Basic .NET or Microsoft Visual C#. - - The CLR supports a security model called code access security (CAS) for managed code. In this model, permissions are granted to assemblies based on evidence supplied by the code in metadata. SQL Server integrates the user-based security model of SQL Server with the code access-based security model of the CLR. - -## External Resources - - For more information on CLR integration with SQL Server, see the following resources. - -|Resource|Description| -|--------------|-----------------| -|[Code Access Security](/previous-versions/dotnet/framework/code-access-security/code-access-security)|Contains topics describing CAS in the .NET Framework.| -|[CLR Integration Security](/sql/relational-databases/clr-integration/security/clr-integration-security)|Discusses the security model for managed code executing inside of SQL Server.| - -## See also - -- [Securing ADO.NET Applications](../securing-ado-net-applications.md) -- [Application Security Scenarios in SQL Server](application-security-scenarios-in-sql-server.md) -- [SQL Server Common Language Runtime Integration](sql-server-common-language-runtime-integration.md) -- [ADO.NET Overview](../ado-net-overview.md) diff --git a/docs/framework/data/adonet/sql/creating-application-roles-in-sql-server.md b/docs/framework/data/adonet/sql/creating-application-roles-in-sql-server.md deleted file mode 100644 index fd6d46dad1da6..0000000000000 --- a/docs/framework/data/adonet/sql/creating-application-roles-in-sql-server.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -description: "Learn more about: Creating Application Roles in SQL Server" -title: "Creating Application Roles in SQL Server" -ms.date: "03/30/2017" -ms.assetid: 27442435-dfb2-4062-8c59-e2960833a638 ---- -# Creating Application Roles in SQL Server - -Application roles provide a way to assign permissions to an application instead of a database role or user. Users can connect to the database, activate the application role, and assume the permissions granted to the application. The permissions granted to the application role are in force for the duration of the connection. - -> [!IMPORTANT] -> Application roles are activated when a client application supplies an application role name and a password in the connection string. They present a security vulnerability in a two-tier application because the password must be stored on the client computer. In a three-tier application, you can store the password so that it cannot be accessed by users of the application. - -## Application Role Features - - Application roles have the following features: - -- Unlike database roles, application roles contain no members. - -- Application roles are activated when an application supplies the application role name and a password to the `sp_setapprole` system stored procedure. - -- The password must be stored on the client computer and supplied at run time; an application role cannot be activated from inside of SQL Server. - -- The password is not encrypted. The parameter password is stored as a one-way hash. - -- Once activated, permissions acquired through the application role remain in effect for the duration of the connection. - -- The application role inherits permissions granted to the `public` role. - -- If a member of the `sysadmin` fixed server role activates an application role, the security context switches to that of the application role for the duration of the connection. - -- If you create a `guest` account in a database that has an application role, you do not need to create a database user account for the application role or for any of the logins that invoke it. Application roles can directly access another database only if a `guest` account exists in the second database - -- Built-in functions that return login names, such as SYSTEM_USER, return the name of the login that invoked the application role. Built-in functions that return database user names return the name of the application role. - -### The Principle of Least Privilege - - Application roles should be granted only required permissions in case the password is compromised. Permissions to the `public` role should be revoked in any database using an application role. Disable the `guest` account in any database you do not want callers of the application role to have access to. - -### Application Role Enhancements - - The execution context can be switched back to the original caller after activating an application role, removing the need to disable connection pooling. The `sp_setapprole` procedure has a new option that creates a cookie, which contains context information about the caller. You can revert the session by calling the `sp_unsetapprole` procedure, passing it the cookie. - -## Application Role Alternatives - - Application roles depend on the security of a password, which presents a potential security vulnerability. Passwords may be exposed by being embedded in application code or saved on disk. - - You may want to consider the following alternatives. - -- Use context switching with the EXECUTE AS statement with its NO REVERT and WITH COOKIE clauses. You can create a user account in a database that is not mapped to a login. You then assign permissions to this account. Using EXECUTE AS with a login-less user is more secure because it is permission-based, not password-based. For more information, see [Customizing Permissions with Impersonation in SQL Server](customizing-permissions-with-impersonation-in-sql-server.md). - -- Sign stored procedures with certificates, granting only permission to execute the procedures. For more information, see [Signing Stored Procedures in SQL Server](signing-stored-procedures-in-sql-server.md). - -## External Resources - - For more information, see the following resources. - -|Resource|Description| -|--------------|-----------------| -|[Application Roles](/sql/relational-databases/security/authentication-access/application-roles)|Describes how to create and use application roles in SQL Server 2008.| - -## See also - -- [Securing ADO.NET Applications](../securing-ado-net-applications.md) -- [Overview of SQL Server Security](overview-of-sql-server-security.md) -- [Application Security Scenarios in SQL Server](application-security-scenarios-in-sql-server.md) -- [ADO.NET Overview](../ado-net-overview.md) diff --git a/docs/framework/data/adonet/sql/customizing-permissions-with-impersonation-in-sql-server.md b/docs/framework/data/adonet/sql/customizing-permissions-with-impersonation-in-sql-server.md deleted file mode 100644 index 3f8470183f6a1..0000000000000 --- a/docs/framework/data/adonet/sql/customizing-permissions-with-impersonation-in-sql-server.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -description: "Learn more about: Customizing Permissions with Impersonation in SQL Server" -title: "Customizing Permissions with Impersonation in SQL Server" -ms.date: "03/30/2017" -ms.assetid: dc733d09-1d6d-4af0-9c4b-8d24504860f1 ---- -# Customizing Permissions with Impersonation in SQL Server - -Many applications use stored procedures to access data, relying on ownership chaining to restrict access to base tables. You can grant EXECUTE permissions on stored procedures, revoking or denying permissions on the base tables. SQL Server does not check the permissions of the caller if the stored procedure and tables have the same owner. However, ownership chaining doesn't work if objects have different owners or in the case of dynamic SQL. - - You can use the EXECUTE AS clause in a stored procedure when the caller doesn't have permissions on the referenced database objects. The effect of the EXECUTE AS clause is that the execution context is switched to the proxy user. All code, as well as any calls to nested stored procedures or triggers, executes under the security context of the proxy user. Execution context is reverted to the original caller only after execution of the procedure or when a REVERT statement is issued. - -## Context Switching with the EXECUTE AS Statement - - The Transact-SQL EXECUTE AS statement allows you to switch the execution context of a statement by impersonating another login or database user. This is a useful technique for testing queries and procedures as another user. - -```sql -EXECUTE AS LOGIN = 'loginName'; -EXECUTE AS USER = 'userName'; -``` - - You must have IMPERSONATE permissions on the login or user you are impersonating. This permission is implied for `sysadmin` for all databases, and `db_owner` role members in databases that they own. - -## Granting Permissions with the EXECUTE AS Clause - - You can use the EXECUTE AS clause in the definition header of a stored procedure, trigger, or user-defined function (except for inline table-valued functions). This causes the procedure to execute in the context of the user name or keyword specified in the EXECUTE AS clause. You can create a proxy user in the database that is not mapped to a login, granting it only the necessary permissions on the objects accessed by the procedure. Only the proxy user specified in the EXECUTE AS clause must have permissions on all objects accessed by the module. - -> [!NOTE] -> Some actions, such as TRUNCATE TABLE, do not have grantable permissions. By incorporating the statement within a procedure and specifying a proxy user who has ALTER TABLE permissions, you can extend the permissions to truncate the table to callers who have only EXECUTE permissions on the procedure. - - The context specified in the EXECUTE AS clause is valid for the duration of the procedure, including nested procedures and triggers. Context reverts to the caller when execution is complete or the REVERT statement is issued. - - There are three steps involved in using the EXECUTE AS clause in a procedure. - -1. Create a proxy user in the database that is not mapped to a login. This is not required, but it helps when managing permissions. - -```sql -CREATE USER proxyUser WITHOUT LOGIN -``` - -1. Grant the proxy user the necessary permissions. - -2. Add the EXECUTE AS clause to the stored procedure or user-defined function. - -```sql -CREATE PROCEDURE [procName] WITH EXECUTE AS 'proxyUser' AS ... -``` - -> [!NOTE] -> Applications that require auditing can break because the original security context of the caller is not retained. Built-in functions that return the identity of the current user, such as SESSION_USER, USER, or USER_NAME, return the user associated with the EXECUTE AS clause, not the original caller. - -### Using EXECUTE AS with REVERT - - You can use the Transact-SQL REVERT statement to revert to the original execution context. - - The optional clause, WITH NO REVERT COOKIE = @variableName, allows you switch the execution context back to the caller if the @variableName variable contains the correct value. This allows you to switch the execution context back to the caller in environments where connection pooling is used. Because the value of @variableName is known only to the caller of the EXECUTE AS statement, the caller can guarantee that the execution context cannot be changed by the end user that invokes the application. When the connection is closed, it is returned to the pool. For more information on connection pooling in ADO.NET, see [SQL Server Connection Pooling (ADO.NET)](../sql-server-connection-pooling.md). - -### Specifying the Execution Context - - In addition to specifying a user, you can also use EXECUTE AS with any of the following keywords. - -- CALLER. Executing as CALLER is the default; if no other option is specified, then the procedure executes in the security context of the caller. - -- OWNER. Executing as OWNER executes the procedure in the context of the procedure owner. If the procedure is created in a schema owned by `dbo` or the database owner, the procedure will execute with unrestricted permissions. - -- SELF. Executing as SELF executes in the security context of the creator of the stored procedure. This is equivalent to executing as a specified user, where the specified user is the person creating or altering the procedure. - -## See also - -- [Securing ADO.NET Applications](../securing-ado-net-applications.md) -- [Overview of SQL Server Security](overview-of-sql-server-security.md) -- [Application Security Scenarios in SQL Server](application-security-scenarios-in-sql-server.md) -- [Managing Permissions with Stored Procedures in SQL Server](managing-permissions-with-stored-procedures-in-sql-server.md) -- [Writing Secure Dynamic SQL in SQL Server](writing-secure-dynamic-sql-in-sql-server.md) -- [Signing Stored Procedures in SQL Server](signing-stored-procedures-in-sql-server.md) -- [Modifying Data with Stored Procedures](../modifying-data-with-stored-procedures.md) -- [ADO.NET Overview](../ado-net-overview.md) diff --git a/docs/framework/data/adonet/sql/data-encryption-in-sql-server.md b/docs/framework/data/adonet/sql/data-encryption-in-sql-server.md deleted file mode 100644 index 4d7eeb51382a9..0000000000000 --- a/docs/framework/data/adonet/sql/data-encryption-in-sql-server.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -description: "Learn more about: Data Encryption in SQL Server" -title: "Data Encryption in SQL Server" -ms.date: "03/30/2017" -ms.assetid: 83b992f7-b351-4678-b4b9-f4ffd58134cc ---- -# Data Encryption in SQL Server - -SQL Server provides functions to encrypt and decrypt data using a certificate, asymmetric key, or symmetric key. It manages all of these in an internal certificate store. The store uses an encryption hierarchy that secures certificates and keys at one level with the layer above it in the hierarchy. This feature area of SQL Server is called Secret Storage. - - The fastest mode of encryption supported by the encryption functions is symmetric key encryption. This mode is suitable for handling large volumes of data. The symmetric keys can be encrypted by certificates, passwords or other symmetric keys. - -## Keys and Algorithms - - SQL Server supports several symmetric key encryption algorithms, including DES, Triple DES, RC2, RC4, 128-bit RC4, DESX, 128-bit AES, 192-bit AES, and 256-bit AES. The algorithms are implemented using the Windows Crypto API. - - Within the scope of a database connection, SQL Server can maintain multiple open symmetric keys. An open key is retrieved from the store and is available for decrypting data. When a piece of data is decrypted, there is no need to specify the symmetric key to use. Each encrypted value contains the key identifier (key GUID) of the key used to encrypt it. The engine matches the encrypted byte stream to an open symmetric key, if the correct key has been decrypted and is open. This key is then used to perform decryption and return the data. If the correct key is not open, NULL is returned. - - For an example that shows how to work with encrypted data in a database, see [Encrypt a Column of Data](/sql/relational-databases/security/encryption/encrypt-a-column-of-data). - -## External Resources - - For more information on data encryption, see the following resources. - -|Resource|Description| -|-|-| -|[SQL Server Encryption](/sql/relational-databases/security/encryption/sql-server-encryption)|Provides an overview of encryption in SQL Server. This topic includes links to additional articles.| -|[Encryption Hierarchy](/sql/relational-databases/security/encryption/encryption-hierarchy)|Provides an overview of encryption in SQL Server. This topic provides links to additional articles.| - -## See also - -- [Securing ADO.NET Applications](../securing-ado-net-applications.md) -- [Application Security Scenarios in SQL Server](application-security-scenarios-in-sql-server.md) -- [Authentication in SQL Server](authentication-in-sql-server.md) -- [Server and Database Roles in SQL Server](server-and-database-roles-in-sql-server.md) -- [Ownership and User-Schema Separation in SQL Server](ownership-and-user-schema-separation-in-sql-server.md) -- [Authorization and Permissions in SQL Server](authorization-and-permissions-in-sql-server.md) -- [ADO.NET Overview](../ado-net-overview.md) diff --git a/docs/framework/data/adonet/sql/enabling-cross-database-access-in-sql-server.md b/docs/framework/data/adonet/sql/enabling-cross-database-access-in-sql-server.md deleted file mode 100644 index 3fe4128462374..0000000000000 --- a/docs/framework/data/adonet/sql/enabling-cross-database-access-in-sql-server.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -description: "Learn more about: Enabling Cross-Database Access in SQL Server" -title: "Enabling Cross-Database Access in SQL Server" -ms.date: "03/30/2017" -ms.assetid: 10663fb6-434c-4c81-8178-ec894b9cf895 ---- -# Enabling Cross-Database Access in SQL Server - -Cross-database ownership chaining occurs when a procedure in one database depends on objects in another database. A cross-database ownership chain works in the same way as ownership chaining within a single database, except that an unbroken ownership chain requires that all the object owners are mapped to the same login account. If the source object in the source database and the target objects in the target databases are owned by the same login account, SQL Server does not check permissions on the target objects. - -## Off By Default - - Ownership chaining across databases is turned off by default. Microsoft recommends that you disable cross-database ownership chaining because it exposes you to the following security risks: - -- Database owners and members of the `db_ddladmin` or the `db_owners` database roles can create objects that are owned by other users. These objects can potentially target objects in other databases. This means that if you enable cross-database ownership chaining, you must fully trust these users with data in all databases. - -- Users with CREATE DATABASE permission can create new databases and attach existing databases. If cross-database ownership chaining is enabled, these users can access objects in other databases that they might not have privileges in from the newly created or attached databases that they create. - -## Enabling Cross-database Ownership Chaining - - Cross-database ownership chaining should only be enabled in environments where you can fully trust highly-privileged users. It can be configured during setup for all databases, or selectively for specific databases using the Transact-SQL commands `sp_configure` and `ALTER DATABASE`. - - To selectively configure cross-database ownership chaining, use `sp_configure` to turn it off for the server. Then use the ALTER DATABASE command with SET DB_CHAINING ON to configure cross-database ownership chaining for only the databases that require it. - - The following sample turns on cross-database ownership chaining for all databases: - -```sql -EXECUTE sp_configure 'show advanced', 1; -RECONFIGURE; -EXECUTE sp_configure 'cross db ownership chaining', 1; -RECONFIGURE; -``` - - The following sample turns on cross-database ownership chaining for specific databases: - -```sql -ALTER DATABASE Database1 SET DB_CHAINING ON; -ALTER DATABASE Database2 SET DB_CHAINING ON; -``` - -### Dynamic SQL - - Cross-database ownership chaining does not work in cases where dynamically created SQL statements are executed unless the same user exists in both databases. You can work around this in SQL Server by creating a stored procedure that accesses data in another database and signing the procedure with a certificate that exists in both databases. This gives users access to the database resources used by the procedure without granting them database access or permissions. - -## External Resources - - For more information, see the following resources. - -|Resource|Description| -|--------------|-----------------| -|[Extending Database Impersonation by Using EXECUTE AS](/previous-versions/sql/sql-server-2008-r2/ms188304(v=sql.105)) and [Cross DB Ownership Chaining Option](/sql/database-engine/configure-windows/cross-db-ownership-chaining-server-configuration-option).|Articles describe how to configure cross-database ownership chaining for an instance of SQL Server.| - -## See also - -- [Securing ADO.NET Applications](../securing-ado-net-applications.md) -- [Overview of SQL Server Security](overview-of-sql-server-security.md) -- [Managing Permissions with Stored Procedures in SQL Server](managing-permissions-with-stored-procedures-in-sql-server.md) -- [Writing Secure Dynamic SQL in SQL Server](writing-secure-dynamic-sql-in-sql-server.md) -- [Signing Stored Procedures in SQL Server](signing-stored-procedures-in-sql-server.md) -- [ADO.NET Overview](../ado-net-overview.md) diff --git a/docs/framework/data/adonet/sql/granting-row-level-permissions-in-sql-server.md b/docs/framework/data/adonet/sql/granting-row-level-permissions-in-sql-server.md deleted file mode 100644 index a2ce36ca5c641..0000000000000 --- a/docs/framework/data/adonet/sql/granting-row-level-permissions-in-sql-server.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -description: "Learn more about: Granting Row-Level Permissions in SQL Server" -title: "Granting Row-Level Permissions in SQL Server" -ms.date: "03/30/2017" -ms.assetid: a55aaa12-34ab-41cd-9dec-fd255b29258c ---- - -# Granting Row-Level Permissions in SQL Server - -In some scenarios, there is a requirement to control access to data at a more granular level than what simply granting, revoking, or denying permissions provides. For example, a hospital database application may require individual Doctors to be restricted to accessing information related to only their patients. Similar requirements exist in many environments, including finance, law, government, and military applications. To help address these scenarios, SQL Server 2016 provides a [Row-Level Security](/sql/relational-databases/security/row-level-security) feature that simplifies and centralizes row-level access logic in a security policy. For earlier versions of SQL Server, similar functionality can be achieved by using views to enact row-level filtering. - -## Implementing Row-level Filtering - -Row-level filtering is used for applications storing information in a single table like in the hospital example above. To implement row-level filtering each row has a column that defines a differentiating parameter, such as a user name, label or other identifier. You create either a security policy or a view on the table, which filters the rows that the user can access. You then create parameterized stored procedures, which control the types of queries the user can execute. - -The following example describes how to configure row-level filtering based on a user or login name: - -- Create the table, adding a column to store the name. - -- Enable row-level filtering: - - - If you are using SQL Server 2016 or higher, or [Azure SQL Database](/azure/sql-database/), create a security policy that adds a predicate on the table restricting the rows returned to those that match either the current database user (using the CURRENT_USER() built-in function) or the current login name (using the SUSER_SNAME() built-in function): - - ```sql - CREATE SCHEMA Security - GO - - CREATE FUNCTION Security.userAccessPredicate(@UserName sysname) - RETURNS TABLE - WITH SCHEMABINDING - AS - RETURN SELECT 1 AS accessResult - WHERE @UserName = SUSER_SNAME() - GO - - CREATE SECURITY POLICY Security.userAccessPolicy - ADD FILTER PREDICATE Security.userAccessPredicate(UserName) ON dbo.MyTable, - ADD BLOCK PREDICATE Security.userAccessPredicate(UserName) ON dbo.MyTable - GO - ``` - - - If you are using a version of SQL Server prior to 2016, you can achieve similar functionality using a view: - - ```sql - CREATE VIEW vw_MyTable - AS - RETURN SELECT * FROM MyTable - WHERE UserName = SUSER_SNAME() - GO - ``` - -- Create stored procedures to select, insert, update, and delete data. If the filtering is enacted by a security policy, the stored procedures should perform these operations on the base table directly; otherwise, if the filtering is enacted by a view, the stored procedures should instead operate against the view. The security policy or view will automatically filter the rows returned or modified by user queries, and the stored procedure will provide a harder security boundary to prevent users with direct query access from successfully running queries that can infer the existence of filtered data. - -- For stored procedures that insert data, capture the user name using the same function specified in the security policy or view, and insert that value into the UserName column. - -- Deny all permissions on the tables (and views, if applicable) to the `public` role. Users will not be able to inherit permissions from other database roles, because the filter predicate is based on user or login names, not on roles. - -- Grant EXECUTE on the stored procedures to database roles. Users can only access data through the stored procedures provided. - -## See also - -- [Row-Level Security](/sql/relational-databases/security/row-level-security) -- [Securing ADO.NET Applications](../securing-ado-net-applications.md) -- [Overview of SQL Server Security](overview-of-sql-server-security.md) -- [Application Security Scenarios in SQL Server](application-security-scenarios-in-sql-server.md) -- [Managing Permissions with Stored Procedures in SQL Server](managing-permissions-with-stored-procedures-in-sql-server.md) -- [Writing Secure Dynamic SQL in SQL Server](writing-secure-dynamic-sql-in-sql-server.md) -- [ADO.NET Overview](../ado-net-overview.md) diff --git a/docs/framework/data/adonet/sql/index.md b/docs/framework/data/adonet/sql/index.md index 771091eeb5118..6adca2a071e7f 100644 --- a/docs/framework/data/adonet/sql/index.md +++ b/docs/framework/data/adonet/sql/index.md @@ -16,7 +16,7 @@ This section describes features and behaviors that are specific to the .NET Fram ## In This Section - [SQL Server Security](sql-server-security.md) + [SQL Server Security](/previous-versions/dotnet/framework/data/adonet/sql/sql-server-security) Provides an overview of SQL Server security features, and application scenarios for creating secure ADO.NET applications that target SQL Server. [SQL Server Data Types and ADO.NET](sql-server-data-types.md) diff --git a/docs/framework/data/adonet/sql/linq/security-in-linq-to-sql.md b/docs/framework/data/adonet/sql/linq/security-in-linq-to-sql.md index 609d5096ecfe8..db64ab1192219 100644 --- a/docs/framework/data/adonet/sql/linq/security-in-linq-to-sql.md +++ b/docs/framework/data/adonet/sql/linq/security-in-linq-to-sql.md @@ -20,7 +20,7 @@ Security risks are always present when you connect to a database. Although LINQ Using passwords in connection strings should be avoided whenever possible. Not only is a connection string a security risk in its own right, but the connection string may also be added in clear text to the object model or external mapping file when using the Object Relational Designer or SQLMetal command-line tool. Anyone with access to the object model or external mapping file via the file system could see the connection password (if it is included in the connection string). - To minimize such risks, use integrated security to make a trusted connection with SQL Server. By using this approach, you do not have to store a password in the connection string. For more information, see [SQL Server Security](../sql-server-security.md). + To minimize such risks, use integrated security to make a trusted connection with SQL Server. By using this approach, you do not have to store a password in the connection string. For more information, see [SQL Server Security](/previous-versions/dotnet/framework/data/adonet/sql/sql-server-security). In the absence of integrated security, a clear-text password will be needed in the connection string. The best way to help secure your connection string, in increasing order of risk, is as follows: diff --git a/docs/framework/data/adonet/sql/managing-permissions-with-stored-procedures-in-sql-server.md b/docs/framework/data/adonet/sql/managing-permissions-with-stored-procedures-in-sql-server.md deleted file mode 100644 index dd0d55112e21e..0000000000000 --- a/docs/framework/data/adonet/sql/managing-permissions-with-stored-procedures-in-sql-server.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -title: "Managing Permissions with Stored Procedures in SQL Server" -description: Learn how to restrict access to your data and database objects by implementing access using stored procedures or user-defined functions. -ms.date: "03/30/2017" -ms.assetid: 08fa34e8-2ffa-470d-ba62-e511a5f8558e ---- -# Managing Permissions with Stored Procedures in SQL Server - -One method of creating multiple lines of defense around your database is to implement all data access using stored procedures or user-defined functions. You revoke or deny all permissions to underlying objects, such as tables, and grant EXECUTE permissions on stored procedures. This effectively creates a security perimeter around your data and database objects. - -## Stored Procedure Benefits - - Stored procedures have the following benefits: - -- Data logic and business rules can be encapsulated so that users can access data and objects only in ways that developers and database administrators intend. - -- Parameterized stored procedures that validate all user input can be used to thwart SQL injection attacks. If you use dynamic SQL, be sure to parameterize your commands, and never include parameter values directly into a query string. - -- Ad hoc queries and data modifications can be disallowed. This prevents users from maliciously or inadvertently destroying data or executing queries that impair performance on the server or the network. - -- Errors can be handled in procedure code without being passed directly to client applications. This prevents error messages from being returned that could aid in a probing attack. Log errors and handle them on the server. - -- Stored procedures can be written once, and accessed by many applications. - -- Client applications do not need to know anything about the underlying data structures. Stored procedure code can be changed without requiring changes in client applications as long as the changes do not affect parameter lists or returned data types. - -- Stored procedures can reduce network traffic by combining multiple operations into one procedure call. - -## Stored Procedure Execution - - Stored procedures take advantage of ownership chaining to provide access to data so that users do not need to have explicit permission to access database objects. An ownership chain exists when objects that access each other sequentially are owned by the same user. For example, a stored procedure can call other stored procedures, or a stored procedure can access multiple tables. If all objects in the chain of execution have the same owner, then SQL Server only checks the EXECUTE permission for the caller, not the caller's permissions on other objects. Therefore you need to grant only EXECUTE permissions on stored procedures; you can revoke or deny all permissions on the underlying tables. - -## Best Practices - - Simply writing stored procedures isn't enough to adequately secure your application. You should also consider the following potential security holes. - -- Grant EXECUTE permissions on the stored procedures for database roles you want to be able to access the data. - -- Revoke or deny all permissions to the underlying tables for all roles and users in the database, including the `public` role. All users inherit permissions from public. Therefore denying permissions to `public` means that only owners and `sysadmin` members have access; all other users will be unable to inherit permissions from membership in other roles. - -- Do not add users or roles to the `sysadmin` or `db_owner` roles. System administrators and database owners can access all database objects. - -- Disable the `guest` account. This will prevent anonymous users from connecting to the database. The guest account is disabled by default in new databases. - -- Implement error handling and log errors. - -- Create parameterized stored procedures that validate all user input. Treat all user input as untrusted. - -- Avoid dynamic SQL unless absolutely necessary. Use the Transact-SQL QUOTENAME() function to delimit a string value and escape any occurrence of the delimiter in the input string. - -## External Resources - - For more information, see the following resources. - -|Resource|Description| -|--------------|-----------------| -|[Stored Procedures](/sql/relational-databases/stored-procedures/stored-procedures-database-engine) and [SQL Injection](/sql/relational-databases/security/sql-injection)|Articles describe how to create stored procedures and how SQL Injection works.| - -## See also - -- [Securing ADO.NET Applications](../securing-ado-net-applications.md) -- [Overview of SQL Server Security](overview-of-sql-server-security.md) -- [Application Security Scenarios in SQL Server](application-security-scenarios-in-sql-server.md) -- [Writing Secure Dynamic SQL in SQL Server](writing-secure-dynamic-sql-in-sql-server.md) -- [Signing Stored Procedures in SQL Server](signing-stored-procedures-in-sql-server.md) -- [Customizing Permissions with Impersonation in SQL Server](customizing-permissions-with-impersonation-in-sql-server.md) -- [Modifying Data with Stored Procedures](../modifying-data-with-stored-procedures.md) -- [ADO.NET Overview](../ado-net-overview.md) diff --git a/docs/framework/data/adonet/sql/overview-of-sql-server-security.md b/docs/framework/data/adonet/sql/overview-of-sql-server-security.md deleted file mode 100644 index dd4ca390cec03..0000000000000 --- a/docs/framework/data/adonet/sql/overview-of-sql-server-security.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: "Overview of SQL Server Security" -description: Learn about the SQL Server security architecture to understand which features and functionality counter known threats, and to anticipate future threats. -ms.date: "03/30/2017" -ms.assetid: ae66dd75-5c16-4cc0-9e12-774dd26d3fb9 ---- -# Overview of SQL Server Security - -A defense-in-depth strategy, with overlapping layers of security, is the best way to counter security threats. SQL Server provides a security architecture that is designed to allow database administrators and developers to create secure database applications and counter threats. Each version of SQL Server has improved on previous versions of SQL Server with the introduction of new features and functionality. However, security does not ship in the box. Each application is unique in its security requirements. Developers need to understand which combination of features and functionality are most appropriate to counter known threats, and to anticipate threats that may arise in the future. - - A SQL Server instance contains a hierarchical collection of entities, starting with the server. Each server contains multiple databases, and each database contains a collection of securable objects. Every SQL Server securable has associated *permissions* that can be granted to a *principal*, which is an individual, group or process granted access to SQL Server. The SQL Server security framework manages access to securable entities through *authentication* and *authorization*. - -- Authentication is the process of logging on to SQL Server by which a principal requests access by submitting credentials that the server evaluates. Authentication establishes the identity of the user or process being authenticated. - -- Authorization is the process of determining which securable resources a principal can access, and which operations are allowed for those resources. - - The topics in this section cover SQL Server security fundamentals, providing links to the complete documentation in the SQL Server docs. - -## In This Section - - [Authentication in SQL Server](authentication-in-sql-server.md) - Describes logins and authentication in SQL Server and provides links to additional resources. - - [Server and Database Roles in SQL Server](server-and-database-roles-in-sql-server.md) - Describes fixed server and database roles, custom database roles, and built-in accounts and provides links to additional resources. - - [Ownership and User-Schema Separation in SQL Server](ownership-and-user-schema-separation-in-sql-server.md) - Describes object ownership and user-schema separation and provides links to additional resources. - - [Authorization and Permissions in SQL Server](authorization-and-permissions-in-sql-server.md) - Describes granting permissions using the principle of least privilege and provides links to additional resources. - - [Data Encryption in SQL Server](data-encryption-in-sql-server.md) - Describes data encryption options in SQL Server and provides links to additional resources. - - [CLR Integration Security in SQL Server](clr-integration-security-in-sql-server.md) - Provides links to CLR integration security resources. - -## See also - -- [Securing ADO.NET Applications](../securing-ado-net-applications.md) -- [SQL Server Security](sql-server-security.md) -- [Application Security Scenarios in SQL Server](application-security-scenarios-in-sql-server.md) -- [ADO.NET Overview](../ado-net-overview.md) diff --git a/docs/framework/data/adonet/sql/ownership-and-user-schema-separation-in-sql-server.md b/docs/framework/data/adonet/sql/ownership-and-user-schema-separation-in-sql-server.md deleted file mode 100644 index 7f6ccd53aec22..0000000000000 --- a/docs/framework/data/adonet/sql/ownership-and-user-schema-separation-in-sql-server.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -title: "Ownership and User-Schema Separation in SQL Server" -description: Learn how user-schema separation allows flexibility in managing SQL Server database object permissions. Schemas group objects into separate namespaces. -ms.date: "03/30/2017" -ms.assetid: 242830c1-31b5-4427-828c-cc22ff339f30 ---- -# Ownership and User-Schema Separation in SQL Server - -A core concept of SQL Server security is that owners of objects have irrevocable permissions to administer them. You cannot remove privileges from an object owner, and you cannot drop users from a database if they own objects in it. - -## User-Schema Separation - - User-schema separation allows for more flexibility in managing database object permissions. A *schema* is a named container for database objects, which allows you to group objects into separate namespaces. For example, the AdventureWorks sample database contains schemas for Production, Sales, and HumanResources. - - The four-part naming syntax for referring to objects specifies the schema name. - -```text -Server.Database.DatabaseSchema.DatabaseObject -``` - -### Schema Owners and Permissions - - Schemas can be owned by any database principal, and a single principal can own multiple schemas. You can apply security rules to a schema, which are inherited by all objects in the schema. Once you set up access permissions for a schema, those permissions are automatically applied as new objects are added to the schema. Users can be assigned a default schema, and multiple database users can share the same schema. - - By default, when developers create objects in a schema, the objects are owned by the security principal that owns the schema, not the developer. Object ownership can be transferred with ALTER AUTHORIZATION Transact-SQL statement. A schema can also contain objects that are owned by different users and have more granular permissions than those assigned to the schema, although this is not recommended because it adds complexity to managing permissions. Objects can be moved between schemas, and schema ownership can be transferred between principals. Database users can be dropped without affecting schemas. - -### Built-In Schemas - - SQL Server ships with ten pre-defined schemas that have the same names as the built-in database users and roles. These exist mainly for backward compatibility. You can drop the schemas that have the same names as the fixed database roles if you do not need them. You cannot drop the following schemas: - -- `dbo` - -- `guest` - -- `sys` - -- `INFORMATION_SCHEMA` - - If you drop them from the model database, they will not appear in new databases. - -> [!NOTE] -> The `sys` and `INFORMATION_SCHEMA` schemas are reserved for system objects. You cannot create objects in these schemas and you cannot drop them. - -#### The dbo Schema - - The `dbo` schema is the default schema for a newly created database. The `dbo` schema is owned by the `dbo` user account. By default, users created with the CREATE USER Transact-SQL command have `dbo` as their default schema. - - Users who are assigned the `dbo` schema do not inherit the permissions of the `dbo` user account. No permissions are inherited from a schema by users; schema permissions are inherited by the database objects contained in the schema. - -> [!NOTE] -> When database objects are referenced by using a one-part name, SQL Server first looks in the user's default schema. If the object is not found there, SQL Server looks next in the `dbo` schema. If the object is not in the `dbo` schema, an error is returned. - -## External Resources - - For more information on object ownership and schemas, see the following resources. - -|Resource|Description| -|--------------|-----------------| -|[User-Schema Separation](/previous-versions/sql/sql-server-2008-r2/ms190387(v=sql.105))|Describes the changes introduced by user-schema separation. Includes new behavior, its impact on ownership, catalog views, and permissions.| - -## See also - -- [Securing ADO.NET Applications](../securing-ado-net-applications.md) -- [Application Security Scenarios in SQL Server](application-security-scenarios-in-sql-server.md) -- [Authentication in SQL Server](authentication-in-sql-server.md) -- [Server and Database Roles in SQL Server](server-and-database-roles-in-sql-server.md) -- [Authorization and Permissions in SQL Server](authorization-and-permissions-in-sql-server.md) -- [ADO.NET Overview](../ado-net-overview.md) diff --git a/docs/framework/data/adonet/sql/server-and-database-roles-in-sql-server.md b/docs/framework/data/adonet/sql/server-and-database-roles-in-sql-server.md deleted file mode 100644 index c8b90442f0138..0000000000000 --- a/docs/framework/data/adonet/sql/server-and-database-roles-in-sql-server.md +++ /dev/null @@ -1,73 +0,0 @@ ---- -title: "Server and Database Roles in SQL Server" -description: Learn about fixed server and fixed database roles, which have a fixed set of permissions assigned to them. SQL Server uses role-based security. -ms.date: "03/30/2017" -ms.assetid: 5482dfdb-e498-4614-8652-b174829eed13 ---- -# Server and Database Roles in SQL Server - -All versions of SQL Server use role-based security, which allows you to assign permissions to a role, or group of users, instead of to individual users. Fixed server and fixed database roles have a fixed set of permissions assigned to them. - -## Fixed Server Roles - - Fixed server roles have a fixed set of permissions and server-wide scope. They are intended for use in administering SQL Server and the permissions assigned to them cannot be changed. Logins can be assigned to fixed server roles without having a user account in a database. - -> [!IMPORTANT] -> The `sysadmin` fixed server role encompasses all other roles and has unlimited scope. Do not add principals to this role unless they are highly trusted. `sysadmin` role members have irrevocable administrative privileges on all server databases and resources. - - Be selective when you add users to fixed server roles. For example, the `bulkadmin` role allows users to insert the contents of any local file into a table, which could jeopardize data integrity. - -## Fixed Database Roles - - Fixed database roles have a pre-defined set of permissions that are designed to allow you to easily manage groups of permissions. Members of the `db_owner` role can perform all configuration and maintenance activities on the database. - - For more information about SQL Server predefined roles, see the following resources. - -|Resource|Description| -|--------------|-----------------| -|[Server-Level Roles](/sql/relational-databases/security/authentication-access/server-level-roles)|Describes fixed server roles and the permissions associated with them in SQL Server.| -|[Database-Level Roles](/sql/relational-databases/security/authentication-access/database-level-roles)|Describes fixed database roles and the permissions associated with them| - -## Database Roles and Users - - Logins must be mapped to database user accounts in order to work with database objects. Database users can then be added to database roles, inheriting any permission sets associated with those roles. All permissions can be granted. - - You must also consider the `public` role, the `dbo` user account, and the `guest` account when you design security for your application. - -### The public Role - - The `public` role is contained in every database, which includes system databases. It cannot be dropped and you cannot add or remove users from it. Permissions granted to the `public` role are inherited by all other users and roles because they belong to the `public` role by default. Grant `public` only the permissions you want all users to have. - -### The dbo User Account - - The `dbo`, or database owner, is a user account that has implied permissions to perform all activities in the database. Members of the `sysadmin` fixed server role are automatically mapped to `dbo`. - -> [!NOTE] -> `dbo` is also the name of a schema, as discussed in [Ownership and User-Schema Separation in SQL Server](ownership-and-user-schema-separation-in-sql-server.md). - - The `dbo` user account is frequently confused with the `db_owner` fixed database role. The scope of `db_owner` is a database; the scope of `sysadmin` is the whole server. Membership in the `db_owner` role does not confer `dbo` user privileges. - -### The guest User Account - - After a user has been authenticated and allowed to log in to an instance of SQL Server, a separate user account must exist in each database the user has to access. Requiring a user account in each database prevents users from connecting to an instance of SQL Server and accessing all the databases on a server. The existence of a `guest` user account in the database circumvents this requirement by allowing a login without a database user account to access a database. - - The `guest` account is a built-in account in all versions of SQL Server. By default, it is disabled in new databases. If it is enabled, you can disable it by revoking its CONNECT permission by executing the Transact-SQL REVOKE CONNECT FROM GUEST statement. - -> [!IMPORTANT] -> Avoid using the `guest` account; all logins without their own database permissions obtain the database permissions granted to this account. If you must use the `guest` account, grant it minimum permissions. - - For more information about SQL Server logins, users and roles, see the following resources. - -|Resource|Description| -|--------------|-----------------| -|[Getting Started with Database Engine Permissions](/sql/relational-databases/security/authentication-access/getting-started-with-database-engine-permissions)|Contains links to topics that describe principals, roles, credentials, securables and permissions.| -|[Principals](/sql/relational-databases/security/authentication-access/principals-database-engine)|Describes principals and contains links to topics that describe server and database roles.| - -## See also - -- [Securing ADO.NET Applications](../securing-ado-net-applications.md) -- [Application Security Scenarios in SQL Server](application-security-scenarios-in-sql-server.md) -- [Authentication in SQL Server](authentication-in-sql-server.md) -- [Ownership and User-Schema Separation in SQL Server](ownership-and-user-schema-separation-in-sql-server.md) -- [Authorization and Permissions in SQL Server](authorization-and-permissions-in-sql-server.md) -- [ADO.NET Overview](../ado-net-overview.md) diff --git a/docs/framework/data/adonet/sql/signing-stored-procedures-in-sql-server.md b/docs/framework/data/adonet/sql/signing-stored-procedures-in-sql-server.md deleted file mode 100644 index b02900ec64441..0000000000000 --- a/docs/framework/data/adonet/sql/signing-stored-procedures-in-sql-server.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -description: "Learn more about: Signing Stored Procedures in SQL Server" -title: "Signing Stored Procedures in SQL Server" -ms.date: "01/05/2018" -ms.assetid: eeed752c-0084-48e5-9dca-381353007a0d ---- -# Signing Stored Procedures in SQL Server - -A digital signature is a data digest encrypted with the private key of the signer. The private key ensures that the digital signature is unique to its bearer or owner. You can sign stored procedures, functions (except for inline table-valued functions), triggers, and assemblies. - -You can sign a stored procedure with a certificate or an asymmetric key. This is designed for scenarios when permissions cannot be inherited through ownership chaining or when the ownership chain is broken, such as dynamic SQL. You can then create a user mapped to the certificate, granting the certificate user permissions on the objects the stored procedure needs to access. - -You can also create a login mapped to the same certificate, and then grant any necessary server-level permissions to that login, or add the login to one or more of the fixed server roles. This is designed to avoid enabling the `TRUSTWORTHY` database setting for scenarios in which higher level permissions are needed. - -When the stored procedure is executed, SQL Server combines the permissions of the certificate user and/or login with those of the caller. Unlike the `EXECUTE AS` clause, it does not change the execution context of the procedure. Built-in functions that return login and user names return the name of the caller, not the certificate user name. - -## Creating Certificates - -When you sign a stored procedure with a certificate or asymmetric key, a data digest consisting of the encrypted hash of the stored procedure code, along with the execute-as user, is created using the private key. At run time, the data digest is decrypted with the public key and compared with the hash value of the stored procedure. Changing the execute-as user invalidates the hash value so that the digital signature no longer matches. Modifying the stored procedure drops the signature entirely, which prevents someone who does not have access to the private key from changing the stored procedure code. In either case, you must re-sign the procedure each time you change the code or the execute-as user. - -There are two required steps involved in signing a module: - -1. Create a certificate using the Transact-SQL `CREATE CERTIFICATE [certificateName]` statement. This statement has several options for setting a start and end date and a password. The default expiration date is one year. - -1. Sign the procedure with the certificate using the Transact-SQL `ADD SIGNATURE TO [procedureName] BY CERTIFICATE [certificateName]` statement. - -Once the module has been signed, one or more principals needs to be created in order to hold the additional permissions that should be associated with the certificate. - -If the module needs additional database-level permissions: - -1. Create a database user associated with that certificate using the Transact-SQL `CREATE USER [userName] FROM CERTIFICATE [certificateName]` statement. This user exists in the database only and is not associated with a login unless a login has also been created from that same certificate. - -1. Grant the certificate user the required database-level permissions. - -If the module needs additional server-level permissions: - -1. Copy the certificate to the `master` database. - -1. Create a login associated with that certificate using the Transact-SQL `CREATE LOGIN [userName] FROM CERTIFICATE [certificateName]` statement. - -1. Grant the certificate login the required server-level permissions. - -> [!NOTE] -> A certificate cannot grant permissions to a user that has had permissions revoked using the DENY statement. DENY always takes precedence over GRANT, preventing the caller from inheriting permissions granted to the certificate user. - -## External Resources - -For more information, see the following resources. - -|Resource|Description| -|--------------|-----------------| -|[Module Signing](/previous-versions/sql/sql-server-2008/ms345102(v=sql.100))|Describes module signing, providing a sample scenario and links to the relevant Transact-SQL articles.| -|[Signing Stored Procedures with a Certificate](/sql/relational-databases/tutorial-signing-stored-procedures-with-a-certificate)|Provides a tutorial for signing a stored procedure with a certificate.| - -## See also - -- [Securing ADO.NET Applications](../securing-ado-net-applications.md) -- [Overview of SQL Server Security](overview-of-sql-server-security.md) -- [Application Security Scenarios in SQL Server](application-security-scenarios-in-sql-server.md) -- [Managing Permissions with Stored Procedures in SQL Server](managing-permissions-with-stored-procedures-in-sql-server.md) -- [Writing Secure Dynamic SQL in SQL Server](writing-secure-dynamic-sql-in-sql-server.md) -- [Customizing Permissions with Impersonation in SQL Server](customizing-permissions-with-impersonation-in-sql-server.md) -- [Modifying Data with Stored Procedures](../modifying-data-with-stored-procedures.md) -- [ADO.NET Overview](../ado-net-overview.md) diff --git a/docs/framework/data/adonet/sql/sql-server-express-security.md b/docs/framework/data/adonet/sql/sql-server-express-security.md deleted file mode 100644 index 3435728b57b63..0000000000000 --- a/docs/framework/data/adonet/sql/sql-server-express-security.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -description: "Learn more about: SQL Server Express Security" -title: "SQL Server Express Security" -ms.date: "03/30/2017" -ms.assetid: cf9cf6d9-4b05-43e9-ac7b-6cefbfcd6d4e ---- -# SQL Server Express Security - -Microsoft SQL Server Express Edition (SQL Server Express) is based on Microsoft SQL Server, and supports most of the features of the database engine. It is designed so that nonessential features and network connectivity are off by default. This reduces the surface area available for attack by a malicious user. - - SQL Server Express is usually installed as a named instance. The default name of the instance is `SQLExpress`. A named instance is identified by the network name of the computer plus the instance name that you specify during installation. - -## Network Access - - For security reasons, networking protocols are disabled by default in SQL Server Express. This prevents attacks from outside users that might compromise the computer that hosts the instance of SQL Server Express. You must explicitly enable network connectivity and start the SQL Server Browser service to connect to a SQL Server Express instance from another computer. - - Once network connectivity is enabled, a SQL Server Express instance has the same security requirements as the other editions of SQL Server. - -## User Instances - - A user instance is a separate instance of the SQL Server Express database engine that is generated by a parent instance of SQL Server Express. The primary goal of a user instance is to allow users who are running Windows under a least-privilege user account to have system administrator (`sysadmin`) privileges on the SQL Server Express instance on their local computer. User instances are not intended for users who are system administrators on their own computers. - - A user instance is generated from a primary instance of SQL Server or SQL Server Express on behalf of a user. It runs as a user process under the Windows security context of the user, not as a service. SQL Server logins are disallowed; only Windows logins are supported. This prevents software executing on a user instance from making system-wide changes that the user would not have permissions to make. A user instance is also known as a child or client instance, and is sometimes referred to by using the RANU acronym ("run as normal user"). - - Each user instance is isolated from its parent instance and from other user instances running on the same computer. Databases installed on user instances are opened in single-user mode only; multiple users cannot connect to them. Replication, distributed queries and remote connections are disabled for user instances. When connected to a user instance, users do not have any special privileges on the parent SQL Server Express instance. - -## External Resources - - For more information about SQL Server Express, see the following resources. - -||| -|-|-| -|[Microsoft SQL Server 2005 Express Edition Books Online](/previous-versions/sql/sql-server-2005/ms165706(v=sql.90))|Complete documentation for SQL Server 2005 Express Edition.| -|[User Instances for Non-Administrators](/previous-versions/sql/sql-server-2008/ms143684(v=sql.100))|Describes how to create and deploy user instances.| -|[SQL Server Express User Instances](sql-server-express-user-instances.md)|Describes user instance capabilities in an ADO.NET application. Provides information about how to enable a user instance, connect to a user instance using a , user instance lifetime, and user instance scenarios.| - -## See also - -- [SQL Server Security](sql-server-security.md) -- [SQL Server Express User Instances](sql-server-express-user-instances.md) -- [ADO.NET Overview](../ado-net-overview.md) diff --git a/docs/framework/data/adonet/sql/sql-server-security.md b/docs/framework/data/adonet/sql/sql-server-security.md deleted file mode 100644 index 3ea81be933ee1..0000000000000 --- a/docs/framework/data/adonet/sql/sql-server-security.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -description: "Learn more about: SQL Server Security" -title: "SQL Server Security" -ms.date: "03/30/2017" -ms.assetid: 9053724d-a1fb-4f0f-b9dc-7f6dd893e8ff ---- -# SQL Server Security - -SQL Server has many features that support creating secure database applications. - - Common security considerations, such as data theft or vandalism, apply regardless of the version of SQL Server you are using. Data integrity should also be considered as a security issue. If data is not protected, it is possible that it could become worthless if ad hoc data manipulation is permitted and the data is inadvertently or maliciously modified with incorrect values or deleted entirely. In addition, there are often legal requirements that must be adhered to, such as the correct storage of confidential information. Storing some kinds of personal data is proscribed entirely, depending on the laws that apply in a particular jurisdiction. - - Each version of SQL Server has different security features, as does each version of Windows, with later versions having enhanced functionality over earlier ones. It is important to understand that security features alone cannot guarantee a secure database application. Each database application is unique in its requirements, execution environment, deployment model, physical location, and user population. Some applications that are local in scope may need only minimal security whereas other local applications or applications deployed over the Internet may require stringent security measures and ongoing monitoring and evaluation. - - The security requirements of a SQL Server database application should be considered at design time, not as an afterthought. Evaluating threats early in the development cycle gives you the opportunity to mitigate potential damage wherever a vulnerability is detected. - - Even if the initial design of an application is sound, new threats may emerge as the system evolves. By creating multiple lines of defense around your database, you can minimize the damage inflicted by a security breach. Your first line of defense is to reduce the attack surface area by never to granting more permissions than are absolutely necessary. - - The topics in this section briefly describe the security features in SQL Server that are relevant for developers, with links to relevant articles in the SQL Server docs and other resources that provide more detailed coverage. - -## In This Section - - [Overview of SQL Server Security](overview-of-sql-server-security.md) - Describes the architecture and security features of SQL Server. - - [Application Security Scenarios in SQL Server](application-security-scenarios-in-sql-server.md) - Contains topics discussing various application security scenarios for ADO.NET and SQL Server applications. - - [SQL Server Express Security](sql-server-express-security.md) - Describes security considerations for SQL Server Express. - -## Related Sections - -[Security Center for SQL Server Database Engine and Azure SQL Database](/sql/relational-databases/security/security-center-for-sql-server-database-engine-and-azure-sql-database) -Describes security considerations for SQL Server and Azure SQL Database. - -[Security Considerations for a SQL Server Installation](/sql/sql-server/install/security-considerations-for-a-sql-server-installation) -Describes security concerns to consider before installing SQL Server. - -## See also - -- [Securing ADO.NET Applications](../securing-ado-net-applications.md) -- [SQL Server and ADO.NET](index.md) diff --git a/docs/framework/data/adonet/sql/toc.yml b/docs/framework/data/adonet/sql/toc.yml index 0dfa3433bffd3..7ae06b0f7c2fd 100644 --- a/docs/framework/data/adonet/sql/toc.yml +++ b/docs/framework/data/adonet/sql/toc.yml @@ -1,42 +1,9 @@ - name: SQL Server and ADO.NET href: index.md - name: SQL Server Security - href: sql-server-security.md items: - name: Overview of SQL Server Security - href: overview-of-sql-server-security.md - items: - - name: Authentication in SQL Server - href: authentication-in-sql-server.md - - name: Server and Database Roles in SQL Server - href: server-and-database-roles-in-sql-server.md - - name: Ownership and User-Schema Separation in SQL Server - href: ownership-and-user-schema-separation-in-sql-server.md - - name: Authorization and Permissions in SQL Server - href: authorization-and-permissions-in-sql-server.md - - name: Data Encryption in SQL Server - href: data-encryption-in-sql-server.md - - name: CLR Integration Security in SQL Server - href: clr-integration-security-in-sql-server.md - name: Application Security Scenarios in SQL Server - href: application-security-scenarios-in-sql-server.md - items: - - name: Managing Permissions with Stored Procedures in SQL Server - href: managing-permissions-with-stored-procedures-in-sql-server.md - - name: Writing Secure Dynamic SQL in SQL Server - href: writing-secure-dynamic-sql-in-sql-server.md - - name: Signing Stored Procedures in SQL Server - href: signing-stored-procedures-in-sql-server.md - - name: Customizing Permissions with Impersonation in SQL Server - href: customizing-permissions-with-impersonation-in-sql-server.md - - name: Granting Row-Level Permissions in SQL Server - href: granting-row-level-permissions-in-sql-server.md - - name: Creating Application Roles in SQL Server - href: creating-application-roles-in-sql-server.md - - name: Enabling Cross-Database Access in SQL Server - href: enabling-cross-database-access-in-sql-server.md - - name: SQL Server Express Security - href: sql-server-express-security.md - name: SQL Server Data Types and ADO.NET href: sql-server-data-types.md items: diff --git a/docs/framework/data/adonet/sql/writing-secure-dynamic-sql-in-sql-server.md b/docs/framework/data/adonet/sql/writing-secure-dynamic-sql-in-sql-server.md deleted file mode 100644 index f930daca1edb7..0000000000000 --- a/docs/framework/data/adonet/sql/writing-secure-dynamic-sql-in-sql-server.md +++ /dev/null @@ -1,79 +0,0 @@ ---- -description: "Learn more about: Writing Secure Dynamic SQL in SQL Server" -title: "Writing Secure Dynamic SQL in SQL Server" -ms.date: "03/30/2017" -ms.assetid: df5512b0-c249-40d2-82f9-f9a2ce6665bc ---- -# Writing Secure Dynamic SQL in SQL Server - -SQL Injection is the process by which a malicious user enters Transact-SQL statements instead of valid input. If the input is passed directly to the server without being validated and if the application inadvertently executes the injected code, the attack has the potential to damage or destroy data. - - Any procedure that constructs SQL statements should be reviewed for injection vulnerabilities because SQL Server will execute all syntactically valid queries that it receives. Even parameterized data can be manipulated by a skilled and determined attacker. If you use dynamic SQL, be sure to parameterize your commands, and never include parameter values directly into the query string. - -## Anatomy of a SQL Injection Attack - - The injection process works by prematurely terminating a text string and appending a new command. Because the inserted command may have additional strings appended to it before it is executed, the malefactor terminates the injected string with a comment mark "--". Subsequent text is ignored at execution time. Multiple commands can be inserted using a semicolon (;) delimiter. - - As long as injected SQL code is syntactically correct, tampering cannot be detected programmatically. Therefore, you must validate all user input and carefully review code that executes constructed SQL commands in the server that you are using. Never concatenate user input that is not validated. String concatenation is the primary point of entry for script injection. - - Here are some helpful guidelines: - -- Never build Transact-SQL statements directly from user input; use stored procedures to validate user input. - -- Validate user input by testing type, length, format, and range. Use the Transact-SQL QUOTENAME() function to escape system names or the REPLACE() function to escape any character in a string. - -- Implement multiple layers of validation in each tier of your application. - -- Test the size and data type of input and enforce appropriate limits. This can help prevent deliberate buffer overruns. - -- Test the content of string variables and accept only expected values. Reject entries that contain binary data, escape sequences, and comment characters. - -- When you are working with XML documents, validate all data against its schema as it is entered. - -- In multi-tiered environments, all data should be validated before admission to the trusted zone. - -- Do not accept the following strings in fields from which file names can be constructed: AUX, CLOCK$, COM1 through COM8, CON, CONFIG$, LPT1 through LPT8, NUL, and PRN. - -- Use objects with stored procedures and commands to provide type checking and length validation. - -- Use expressions in client code to filter invalid characters. - -## Dynamic SQL Strategies - - Executing dynamically created SQL statements in your procedural code breaks the ownership chain, causing SQL Server to check the permissions of the caller against the objects being accessed by the dynamic SQL. - - SQL Server has methods for granting users access to data using stored procedures and user-defined functions that execute dynamic SQL. - -- Using impersonation with the Transact-SQL EXECUTE AS clause, as described in [Customizing Permissions with Impersonation in SQL Server](customizing-permissions-with-impersonation-in-sql-server.md). - -- Signing stored procedures with certificates, as described in [Signing Stored Procedures in SQL Server](signing-stored-procedures-in-sql-server.md). - -### EXECUTE AS - - The EXECUTE AS clause replaces the permissions of the caller with that of the user specified in the EXECUTE AS clause. Nested stored procedures or triggers execute under the security context of the proxy user. This can break applications that rely on row-level security or require auditing. Some functions that return the identity of the user return the user specified in the EXECUTE AS clause, not the original caller. Execution context is reverted to the original caller only after execution of the procedure or when a REVERT statement is issued. - -### Certificate Signing - - When a stored procedure that has been signed with a certificate executes, the permissions granted to the certificate user are merged with those of the caller. The execution context remains the same; the certificate user does not impersonate the caller. Signing stored procedures requires several steps to implement. Each time the procedure is modified, it must be re-signed. - -### Cross Database Access - - Cross-database ownership chaining does not work in cases where dynamically created SQL statements are executed. You can work around this in SQL Server by creating a stored procedure that accesses data in another database and signing the procedure with a certificate that exists in both databases. This gives users access to the database resources used by the procedure without granting them database access or permissions. - -## External Resources - - For more information, see the following resources. - -|Resource|Description| -|--------------|-----------------| -|[Stored Procedures](/sql/relational-databases/stored-procedures/stored-procedures-database-engine) and [SQL Injection](/sql/relational-databases/security/sql-injection)|Topics describe how to create stored procedures and how SQL Injection works.| - -## See also - -- [Securing ADO.NET Applications](../securing-ado-net-applications.md) -- [Overview of SQL Server Security](overview-of-sql-server-security.md) -- [Application Security Scenarios in SQL Server](application-security-scenarios-in-sql-server.md) -- [Managing Permissions with Stored Procedures in SQL Server](managing-permissions-with-stored-procedures-in-sql-server.md) -- [Signing Stored Procedures in SQL Server](signing-stored-procedures-in-sql-server.md) -- [Customizing Permissions with Impersonation in SQL Server](customizing-permissions-with-impersonation-in-sql-server.md) -- [ADO.NET Overview](../ado-net-overview.md) From 9fe2d763ae698d3b2e4b4205b158943f6a98a410 Mon Sep 17 00:00:00 2001 From: Genevieve Warren <24882762+gewarren@users.noreply.github.com> Date: Mon, 21 Jun 2021 10:14:02 -0700 Subject: [PATCH 062/105] Delete MEF docs (#24699) --- .openpublishing.redirection.json | 10 ++ .../mef/composition-analysis-tool-mefx.md | 138 ------------------ .../mef/mef-for-net-for-windows-store-apps.md | 25 ---- docs/framework/mef/toc.yml | 4 - 4 files changed, 10 insertions(+), 167 deletions(-) delete mode 100644 docs/framework/mef/composition-analysis-tool-mefx.md delete mode 100644 docs/framework/mef/mef-for-net-for-windows-store-apps.md diff --git a/.openpublishing.redirection.json b/.openpublishing.redirection.json index 024b39a7c5ba6..536da1e9c6f5e 100644 --- a/.openpublishing.redirection.json +++ b/.openpublishing.redirection.json @@ -4788,6 +4788,16 @@ "redirect_url": "/dotnet/standard/native-interop/runtime-callable-wrapper", "redirect_document_id": true }, + { + "source_path": "docs/framework/mef/composition-analysis-tool-mefx.md", + "redirect_url": "/previous-versions/dotnet/framework/mef/composition-analysis-tool-mefx", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/mef/mef-for-net-for-windows-store-apps.md", + "redirect_url": "/previous-versions/dotnet/framework/mef/mef-for-net-for-windows-store-apps", + "redirect_document_id": false + }, { "source_path": "docs/framework/migration-guide/application-compatibility-in-the-net-framework-4-5-1.md", "redirect_url": "/dotnet/framework/migration-guide/application-compatibility" diff --git a/docs/framework/mef/composition-analysis-tool-mefx.md b/docs/framework/mef/composition-analysis-tool-mefx.md deleted file mode 100644 index d8f1476ac28d8..0000000000000 --- a/docs/framework/mef/composition-analysis-tool-mefx.md +++ /dev/null @@ -1,138 +0,0 @@ ---- -title: "Composition analysis tool (Mefx)" -description: Read about the composition analysis tool (Mefx), which analyzes DLL and EXE files that contain Managed Extensibility Framework (MEF) parts in .NET. -ms.date: 06/09/2021 -helpviewer_keywords: - - "Composition Analysis Tool [MEF]" - - "MEF, Composition Analysis Tool" - - "Mefx [MEF], Composition Analysis Tool" -ms.assetid: c48a7f93-83bb-4a06-aea0-d8e7bd1502ad ---- - -# Composition analysis tool (Mefx) - -The composition analysis tool (Mefx) is a command-line application that analyzes library (.dll) and application (.exe) files containing Managed Extensibility Framework (MEF) parts. The primary purpose of Mefx is to provide developers a way to diagnose composition failures in their MEF applications without the requirement to add cumbersome tracing code to the application itself. It can also be useful to help understand parts from a library provided by a third party. This topic describes how to use Mefx and provides a reference for its syntax. - - - -## Get Mefx - -Mefx is available on GitHub at [Managed Extensibility Framework](https://github.com/MicrosoftArchive/mef/releases/tag/4.0). Simply download and unzip the tool. - - - -## Basic syntax - -Mefx is invoked from the command line in the following format: - -```console -mefx [files and directories] [action] [options] -``` - -The first set of arguments specify the files and directories from which to load parts for analysis. Specify a file with the `/file:` switch, and a directory with the `/directory:` switch. You can specify multiple files or directories, as shown in the following example: - -```console -mefx /file:MyAddIn.dll /directory:Program\AddIns [action...] -``` - -> [!NOTE] -> Each .dll or .exe should only be loaded one time. If a file is loaded multiple times, the tool may return incorrect information. - -After the list of files and directories, you must specify a command, and any options for that command. - - - -## List available parts - -Use the `/parts` action to list all the parts declared in the files loaded. The result is a simple list of part names. - -```console -mefx /file:MyAddIn.dll /parts -MyAddIn.AddIn -MyAddIn.MemberPart -``` - -For more information about the parts, use the `/verbose` option. This will output more information for all available parts. To get more information about a single part, use the `/type` action instead of `/parts`. - -```console -mefx /file:MyAddIn.dll /type:MyAddIn.AddIn /verbose -[Part] MyAddIn.MemberPart from: AssemblyCatalog (Assembly=" MyAddIn, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null") - [Export] MyAddIn.MemberPart (ContractName=" MyAddIn.MemberPart") -``` - - - -## List Imports and Exports - -The `/imports` and `/exports` actions will list all the imported parts and all the exported parts, respectively. You can also list the parts that import or export a particular type by using the `/importers` or `/exporters` actions. - -```console -mefx /file:MyAddIn.dll /importers:MyAddin.MemberPart -MyAddin.AddIn -``` - -You can also apply the `/verbose` option to these actions. - - - -## Find rejected parts - -Once it has loaded the available parts, Mefx uses the MEF composition engine to compose them. Parts that cannot be successfully composed are referred to as *rejected*. To list all the rejected parts, use the `/rejected` action. - -You can use the `/verbose` option with the `/rejected` action to print detailed information about rejected parts. In the following example, the `ClassLibrary1` DLL contains the `AddIn` part, which imports the `MemberPart` and `ChainOne` parts. `ChainOne` imports `ChainTwo`, but `ChainTwo` does not exist. This means that `ChainOne` is rejected, which causes `AddIn` to be rejected. - -```console -mefx /file:ClassLibrary1.dll /rejected /verbose -``` - -The following shows the complete output of the previous command: - -```output -[Part] ClassLibrary1.AddIn from: AssemblyCatalog (Assembly="ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null") - [Export] ClassLibrary1.AddIn (ContractName="ClassLibrary1.AddIn") - [Import] ClassLibrary1.AddIn.memberPart (ContractName="ClassLibrary1.MemberPart") - [SatisfiedBy] ClassLibrary1.MemberPart (ContractName="ClassLibrary1.MemberPart") from: ClassLibrary1.MemberPart from: AssemblyCatalog (Assembly="ClassLibrar -y1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null") - [Import] ClassLibrary1.AddIn.chain (ContractName="ClassLibrary1.ChainOne") - [Exception] System.ComponentModel.Composition.ImportCardinalityMismatchException: No valid exports were found that match the constraint '((exportDefinition.ContractName == "ClassLibrary1.ChainOne") AndAlso (exportDefinition.Metadata.ContainsKey("ExportTypeIdentity") AndAlso "ClassLibrary1.ChainOne".Equals(exportDefinition.Metadata.get_Item("ExportTypeIdentity"))))', invalid exports may have been rejected. - at System.ComponentModel.Composition.Hosting.ExportProvider.GetExports(ImportDefinition definition, AtomicComposition atomicComposition) - at Microsoft.ComponentModel.Composition.Diagnostics.CompositionInfo.AnalyzeImportDefinition(ExportProvider host, IEnumerable`1 availableParts, ImportDefinition id) - [Unsuitable] ClassLibrary1.ChainOne (ContractName="ClassLibrary1.ChainOne") -from: ClassLibrary1.ChainOne from: AssemblyCatalog (Assembly="ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null") - [Because] PartDefinitionIsRejected, The part providing the export is rejected because of other issues. - -[Part] ClassLibrary1.ChainOne from: AssemblyCatalog (Assembly="ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null") - [Primary Rejection] - [Export] ClassLibrary1.ChainOne (ContractName="ClassLibrary1.ChainOne") - [Import] ClassLibrary1.ChainOne.chain (ContractName="ClassLibrary1.ChainTwo") - [Exception] System.ComponentModel.Composition.ImportCardinalityMismatchException: No valid exports were found that match the constraint '((exportDefinition.ContractName == "ClassLibrary1.ChainTwo") AndAlso (exportDefinition.Metadata.ContainsKey("ExportTypeIdentity") AndAlso "ClassLibrary1.ChainTwo".Equals(exportDefinition.Metadata.get_Item("ExportTypeIdentity"))))', invalid exports may have been rejected. - at System.ComponentModel.Composition.Hosting.ExportProvider.GetExports(ImportDefinition definition, AtomicComposition atomicComposition) - at Microsoft.ComponentModel.Composition.Diagnostics.CompositionInfo.AnalyzeImportDefinition(ExportProvider host, IEnumerable`1 availableParts, ImportDefinition id) -``` - -The interesting information is contained in the `[Exception]` and `[Unsuitable]` results. The `[Exception]` result provides information about why a part was rejected. The `[Unsuitable]` result indicates why an otherwise-matching part could not be used to fill an import; in this case, because that part was itself rejected for missing imports. - - - -## Analyze primary causes - -If several parts are linked in a long dependency chain, a problem involving a part near the bottom may cause the entire chain to be rejected. Diagnosing these problems can be difficult because the root cause of the failure is not always obvious. To help with the problem, you can use the `/causes` action, which attempts to find the root cause of any cascading rejection. - -Using the `/causes` action on the previous example would list only information for `ChainOne`, whose unfilled import is the root cause of the rejection of `AddIn`. The `/causes` action can be used in both normal and `/verbose` options. - -> [!NOTE] -> In most cases, Mefx will be able to diagnose the root cause of a cascading failure. However, in cases where parts are added programmatically to a container, cases involving hierarchical containers, or cases involving custom `ExportProvider` implementations, Mefx will not be able to diagnose the cause. In general, the previously described cases should be avoided where possible, as failures are generally difficult to diagnose. - - - -## Allow lists - -The `/whitelist` option enables you to specify a text file that lists parts that are expected to be rejected. Unexpected rejections will then be flagged. This can be useful when you analyze an incomplete library, or a sublibrary that's missing some dependencies. The `/whitelist` option can be applied to the `/rejected` or `/causes` actions. - -Consider a file named test.txt that contains the text "ClassLibrary1.ChainOne". If you run the `/rejected` action with the `/whitelist` option on the previous example, it produces the following output: - -```console -mefx /file:ClassLibrary1.dll /rejected /whitelist:test.txt -[Unexpected] ClassLibrary1.AddIn -ClassLibrary1.ChainOne -``` diff --git a/docs/framework/mef/mef-for-net-for-windows-store-apps.md b/docs/framework/mef/mef-for-net-for-windows-store-apps.md deleted file mode 100644 index 7b6d0edcff953..0000000000000 --- a/docs/framework/mef/mef-for-net-for-windows-store-apps.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -title: "MEF for .NET - Windows Store Apps" -description: Review Managed Extensibility Framework (MEF) namespaces that contain types for developing extensible Windows 8.x Store apps. -ms.date: 06/09/2021 -ms.assetid: 7667770e-d163-4ad6-a303-085cf73db2f2 ---- - -# MEF for .NET - Windows Store Apps - - and its child namespaces contain types for developing extensible Windows 8.x Store apps with Managed Extensibility Framework (MEF). These namespaces are part of the .NET for Windows 8.x Store apps subset for the Windows 8 operating system. - -These namespaces are not part of the core class library distributed with the .NET Framework. To install these namespaces, open your project in Visual Studio, choose **Manage NuGet Packages** from the **Project** menu, and search online for the Microsoft.Composition package. - -- provides classes that constitute the core MEF for Windows 8.x Store apps. -- provides types that support using MEF with a convention-based configuration model. -- provides MEF types that are useful to developers of host applications. -- provides MEF types used internally by the composition engine. - -For more information about .NET for Windows 8.x Store apps and a list of namespaces and types that it contains, see [.NET for Windows Store apps overview](/previous-versions/br230302(v=vs.110)). - -## See also - -- [.NET for Windows Store apps overview](/previous-versions/br230302(v=vs.110)) -- [.NET for Windows Store apps – supported APIs](/previous-versions/br230232(v=vs.110)) -- [Managed Extensibility Framework (MEF)](index.md) diff --git a/docs/framework/mef/toc.yml b/docs/framework/mef/toc.yml index f4b1c98a70f67..9f794a13b0dcd 100644 --- a/docs/framework/mef/toc.yml +++ b/docs/framework/mef/toc.yml @@ -3,7 +3,3 @@ items: - name: Attributed programming model overview (MEF) href: attributed-programming-model-overview-mef.md - - name: Composition analysis tool (Mefx) - href: composition-analysis-tool-mefx.md - - name: MEF for .NET - Windows Store Apps - href: mef-for-net-for-windows-store-apps.md From 6c20d7754f8132859af4c1db42ca2c2efac157e1 Mon Sep 17 00:00:00 2001 From: Genevieve Warren <24882762+gewarren@users.noreply.github.com> Date: Mon, 21 Jun 2021 10:15:38 -0700 Subject: [PATCH 063/105] Delete WF samples (#24743) --- .openpublishing.redirection.json | 235 +++++++ .../file-schema/wcf/basichttpbinding.md | 138 ++-- .../file-schema/wcf/nethttpbinding.md | 146 ++--- docs/framework/wcf/diagnostics/etw/index.md | 2 +- ...reate-a-custom-client-identity-verifier.md | 122 ++-- ...ate-a-service-endpoint-in-configuration.md | 272 ++++---- .../feature-details/how-to-dynamic-update.md | 554 ++++++++-------- .../how-to-service-versioning.md | 620 +++++++++--------- .../troubleshooting-correlation.md | 4 +- .../workflow-service-host-extensibility.md | 2 +- docs/framework/wcf/samples/index.md | 2 +- ...s-and-expressions-using-imperative-code.md | 2 +- .../configuring-tracking-for-a-workflow.md | 4 +- ...creating-custom-flow-control-activities.md | 2 +- ...tomizing-the-workflow-design-experience.md | 6 +- .../feature-specifics.md | 18 +- .../guide-to-the-documentation.md | 2 +- ...ow-to-create-a-custom-activity-designer.md | 4 +- .../how-to-create-a-custom-instance-store.md | 4 +- .../how-to-create-an-activity.md | 2 +- .../windows-workflow-foundation/index.md | 2 +- ...ling-cancellation-behavior-in-workflows.md | 2 +- .../pick-activity.md | 2 +- .../required-arguments-and-overload-groups.md | 2 +- .../samples/accessing-operationcontext.md | 44 -- .../samples/activity-library.md | 32 - .../samples/application.md | 26 - .../samples/asynchronous-communication.md | 47 -- .../samples/basic.md | 29 - ...rk-resolver-for-workflowhostingendpoint.md | 38 -- .../samples/built-in-activities.md | 20 - .../samples/code-bodied.md | 14 - .../samples/corporate-purchase-process.md | 178 ----- ...reating-and-running-a-workflow-instance.md | 32 - .../samples/custom-activities.md | 17 - .../samples/custom-activity-designers.md | 23 - ...osite-designers-workflow-item-presenter.md | 81 --- ...site-designers-workflow-items-presenter.md | 162 ----- .../custom-composite-using-native-activity.md | 40 -- .../samples/custom-tracking.md | 152 ----- .../samples/database-access-activities.md | 333 ---------- .../samples/designer-rehosting.md | 128 ---- .../samples/designer.md | 20 - .../samples/document-approval-process.md | 146 ----- .../samples/execution.md | 20 - .../samples/external-ruleset-toolkit.md | 127 ---- ...ed-policy-activity-in-net-framework-4-5.md | 89 --- ...-in-a-flowchart-activity-using-trycatch.md | 48 -- .../samples/get-workflowinstanceid.md | 38 -- .../samples/hiring-process.md | 236 ------- .../samples/index.md | 22 - .../samples/linq-message-query-correlation.md | 42 -- .../samples/load-from-xaml.md | 26 - .../71f08d57-e8f2-499e-8151-ece2cbdcabfd.gif | Bin 60464 -> 0 bytes .../document-approval-process.jpg | Bin 34287 -> 0 bytes .../ruleset-browser-dialog.gif | Bin 127097 -> 0 bytes .../ruleset-editor-dialog.gif | Bin 70749 -> 0 bytes .../ruleset-selector-dialog.gif | Bin 24536 -> 0 bytes .../ruleset-toolkit-overview.gif | Bin 6995 -> 0 bytes .../validation-errors-dialog.png | Bin 11738 -> 0 bytes .../workflow-designer-architecture.jpg | Bin 21272 -> 0 bytes .../samples/non-generic-foreach.md | 113 ---- .../samples/non-generic-parallelforeach.md | 117 ---- .../samples/programming-model-item-tree.md | 50 -- .../samples/property-grid-extensibility.md | 132 ---- ...state-the-designer-adds-to-an-xaml-file.md | 121 ---- .../samples/scenario.md | 19 - .../samples/sendmail-custom-activity.md | 141 ---- .../samples/sql-tracking.md | 62 -- .../samples/suspended-instance-management.md | 84 --- .../samples/throttled-parallel-foreach.md | 33 - .../samples/toc.yml | 109 +-- ...ng-events-into-event-tracing-in-windows.md | 151 ----- .../samples/tracking.md | 20 - .../samples/using-editing-scope.md | 42 -- ...ontextbox-in-a-custom-activity-designer.md | 49 -- .../samples/using-the-pick-activity.md | 54 -- .../samples/visual-workflow-tracking.md | 38 -- ...workflowhostingendpoint-resume-bookmark.md | 38 -- .../samples/wpf-and-wf-integration-in-xaml.md | 43 -- .../tracking-profiles.md | 2 +- .../using-a-custom-expression-editor.md | 2 +- ...custom-activity-designers-and-templates.md | 2 +- .../workflow-tracking-and-tracing.md | 2 +- 84 files changed, 1196 insertions(+), 4587 deletions(-) delete mode 100644 docs/framework/windows-workflow-foundation/samples/accessing-operationcontext.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/activity-library.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/application.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/asynchronous-communication.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/basic.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/bookmark-resolver-for-workflowhostingendpoint.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/built-in-activities.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/code-bodied.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/corporate-purchase-process.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/creating-and-running-a-workflow-instance.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/custom-activities.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/custom-activity-designers.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/custom-composite-designers-workflow-item-presenter.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/custom-composite-designers-workflow-items-presenter.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/custom-composite-using-native-activity.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/custom-tracking.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/database-access-activities.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/designer-rehosting.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/designer.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/document-approval-process.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/execution.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/external-ruleset-toolkit.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/externalized-policy-activity-in-net-framework-4-5.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/fault-handling-in-a-flowchart-activity-using-trycatch.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/get-workflowinstanceid.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/hiring-process.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/index.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/linq-message-query-correlation.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/load-from-xaml.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/media/71f08d57-e8f2-499e-8151-ece2cbdcabfd.gif delete mode 100644 docs/framework/windows-workflow-foundation/samples/media/document-approval-process/document-approval-process.jpg delete mode 100644 docs/framework/windows-workflow-foundation/samples/media/external-ruleset-toolkit/ruleset-browser-dialog.gif delete mode 100644 docs/framework/windows-workflow-foundation/samples/media/external-ruleset-toolkit/ruleset-editor-dialog.gif delete mode 100644 docs/framework/windows-workflow-foundation/samples/media/external-ruleset-toolkit/ruleset-selector-dialog.gif delete mode 100644 docs/framework/windows-workflow-foundation/samples/media/external-ruleset-toolkit/ruleset-toolkit-overview.gif delete mode 100644 docs/framework/windows-workflow-foundation/samples/media/external-ruleset-toolkit/validation-errors-dialog.png delete mode 100644 docs/framework/windows-workflow-foundation/samples/media/programming-model-item-tree/workflow-designer-architecture.jpg delete mode 100644 docs/framework/windows-workflow-foundation/samples/non-generic-foreach.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/non-generic-parallelforeach.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/programming-model-item-tree.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/property-grid-extensibility.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/removing-the-view-state-the-designer-adds-to-an-xaml-file.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/scenario.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/sendmail-custom-activity.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/sql-tracking.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/suspended-instance-management.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/throttled-parallel-foreach.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/tracking-events-into-event-tracing-in-windows.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/tracking.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/using-editing-scope.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/using-the-expressiontextbox-in-a-custom-activity-designer.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/using-the-pick-activity.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/visual-workflow-tracking.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/workflowhostingendpoint-resume-bookmark.md delete mode 100644 docs/framework/windows-workflow-foundation/samples/wpf-and-wf-integration-in-xaml.md diff --git a/.openpublishing.redirection.json b/.openpublishing.redirection.json index 536da1e9c6f5e..905529a22f6f0 100644 --- a/.openpublishing.redirection.json +++ b/.openpublishing.redirection.json @@ -5899,6 +5899,241 @@ "source_path": "docs/framework/windows-workflow-foundation/samples/xaml-activation.md", "redirect_url": "/previous-versions/dotnet/netframework-4.0/ee960215(v%3dvs.100)" }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/index.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/index", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/application.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/application", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/document-approval-process.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/document-approval-process", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/corporate-purchase-process.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/corporate-purchase-process", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/hiring-process.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/hiring-process", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/visual-workflow-tracking.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/visual-workflow-tracking", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/suspended-instance-management.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/suspended-instance-management", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/basic.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/basic", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/built-in-activities.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/built-in-activities", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/fault-handling-in-a-flowchart-activity-using-trycatch.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/fault-handling-in-a-flowchart-activity-using-trycatch", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/load-from-xaml.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/load-from-xaml", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/using-the-pick-activity.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/using-the-pick-activity", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/custom-activities.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/custom-activities", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/code-bodied.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/code-bodied", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/custom-composite-using-native-activity.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/custom-composite-using-native-activity", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/custom-activity-designers.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/custom-activity-designers", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/custom-composite-designers-workflow-item-presenter.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/custom-composite-designers-workflow-item-presenter", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/custom-composite-designers-workflow-items-presenter.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/custom-composite-designers-workflow-items-presenter", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/using-the-expressiontextbox-in-a-custom-activity-designer.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/using-the-expressiontextbox-in-a-custom-activity-designer", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/using-editing-scope.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/using-editing-scope", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/designer.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/designer", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/removing-the-view-state-the-designer-adds-to-an-xaml-file.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/removing-the-view-state-the-designer-adds-to-an-xaml-file", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/programming-model-item-tree.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/programming-model-item-tree", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/property-grid-extensibility.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/property-grid-extensibility", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/designer-rehosting.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/designer-rehosting", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/execution.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/execution", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/creating-and-running-a-workflow-instance.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/creating-and-running-a-workflow-instance", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/workflowhostingendpoint-resume-bookmark.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/workflowhostingendpoint-resume-bookmark", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/bookmark-resolver-for-workflowhostingendpoint.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/bookmark-resolver-for-workflowhostingendpoint", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/tracking.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/tracking", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/custom-tracking.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/custom-tracking", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/tracking-events-into-event-tracing-in-windows.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/tracking-events-into-event-tracing-in-windows", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/sql-tracking.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/sql-tracking", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/scenario.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/scenario", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/activity-library.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/activity-library", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/sendmail-custom-activity.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/sendmail-custom-activity", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/throttled-parallel-foreach.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/throttled-parallel-foreach", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/database-access-activities.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/database-access-activities", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/externalized-policy-activity-in-net-framework-4-5.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/externalized-policy-activity-in-net-framework-4-5", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/non-generic-foreach.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/non-generic-foreach", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/non-generic-parallelforeach.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/non-generic-parallelforeach", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/get-workflowinstanceid.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/get-workflowinstanceid", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/accessing-operationcontext.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/accessing-operationcontext", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/linq-message-query-correlation.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/linq-message-query-correlation", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/asynchronous-communication.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/asynchronous-communication", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/wpf-and-wf-integration-in-xaml.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/wpf-and-wf-integration-in-xaml", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/windows-workflow-foundation/samples/external-ruleset-toolkit.md", + "redirect_url": "/previous-versions/dotnet/framework/windows-workflow-foundation/samples/external-ruleset-toolkit", + "redirect_document_id": false + }, { "source_path": "docs/framework/windows-workflow-foundation/using-the-interop-activity-in-a-net-framework-4-workflow.md", "redirect_url": "/previous-versions/dotnet/netframework-4.0/ee264174(v%3dvs.100)" diff --git a/docs/framework/configure-apps/file-schema/wcf/basichttpbinding.md b/docs/framework/configure-apps/file-schema/wcf/basichttpbinding.md index 88c3efb3bcde6..d3fcc606fbb15 100644 --- a/docs/framework/configure-apps/file-schema/wcf/basichttpbinding.md +++ b/docs/framework/configure-apps/file-schema/wcf/basichttpbinding.md @@ -2,22 +2,22 @@ title: "" description: Defines a binding that a WCF service can use to configure and expose endpoints to communicate with services conforming to the WS-I Basic Profile 1.1. ms.date: "03/30/2017" -helpviewer_keywords: +helpviewer_keywords: - "basicHttpBinding Element" ms.assetid: 85cf1a4f-26c2-48c7-bda6-6c960d5d3fb3 --- # \ -Represents a binding that a Windows Communication Foundation (WCF) service can use to configure and expose endpoints that are able to communicate with ASMX-based Web services and clients and other services that conform to the WS-I Basic Profile 1.1. - +Represents a binding that a Windows Communication Foundation (WCF) service can use to configure and expose endpoints that are able to communicate with ASMX-based Web services and clients and other services that conform to the WS-I Basic Profile 1.1. + [**\**](../configuration-element.md)\   [**\**](system-servicemodel.md)\     [**\**](bindings.md)\ -      **\** - -## Syntax - -```xml +      **\** + +## Syntax + +```xml -``` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|`allowCookies`|A Boolean value that indicates whether the client accepts cookies and propagates them on future requests. The default is `false`.

You can use this property when you interact with ASMX Web services that use cookies. In this way, you can be sure that the cookies returned from the server are automatically copied to all future client requests for that service.| -|`bypassProxyOnLocal`|A Boolean value that indicates whether to bypass the proxy server for local addresses. The default is `false`.

An Internet resource is local if it has a local address. A local address is one that is on same computer, the local LAN or intranet and is identified, syntactically, by the lack of a period (.) as in the URIs `http://webserver/` and `http://localhost/`.

Setting this attribute determines whether endpoints configured with the BasicHttpBinding use the proxy server when accessing local resources. If this attribute is `true`, requests to local Internet resources do not use the proxy server. Use the host name (rather than localhost) if you want clients to go through a proxy when talking to services on the same machine when this attribute is set to `true`.

When this attribute is `false`, all Internet requests are made through the proxy server.| -|`closeTimeout`|A value that specifies the interval of time provided for a close operation to complete. This value should be greater than or equal to . The default is 00:01:00.| -|`hostNameComparisonMode`|Specifies the HTTP hostname comparison mode used to parse URIs. This attribute is of type , which indicates whether the hostname is used to reach the service when matching on the URI. The default value is , which ignores the hostname in the match.| -|`maxBufferPoolSize`|An integer value that specifies the maximum amount of memory that is allocated for use by the manager of the message buffers that receive messages from the channel. The default value is 524288 (0x80000) bytes.

The Buffer Manager minimizes the cost of using buffers by using a buffer pool. Buffers are required to process messages by the service when they come out of the channel. If there is not sufficient memory in the buffer pool to process the message load, the Buffer Manager must allocate additional memory from the CLR heap, which increases the garbage collection overhead. Extensive allocation from the CLR garbage heap is an indication that the buffer pool size is too small and that performance can be improved with a larger allocation by increasing the limit specified by this attribute.| -|`maxBufferSize`|An integer value that specifies the maximum size, in bytes, of a buffer that stores messages while they are processed for an endpoint configured with this binding. The default value is 65,536 bytes.| -|`maxReceivedMessageSize`|A positive integer that defines the maximum message size, in bytes, including headers, for a message that can be received on a channel configured with this binding. The sender receives a SOAP fault if the message is too large for the receiver. The receiver drops the message and creates an entry of the event in the trace log. The default is 65,536 bytes.| -|`messageEncoding`|Defines the encoder used to encode the SOAP message. Valid values include the following:

- Text: Use a text message encoder.
- Mtom: Use a Message Transmission Organization Mechanism 1.0 (MTOM) encoder.

The default is Text. This attribute is of type .| -|`name`|A string that contains the configuration name of the binding. This value should be unique among bindings of the same type. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| -|`openTimeout`|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| -|`proxyAddress`|A URI that contains the address of the HTTP proxy. If `useSystemWebProxy` is set to `true`, this setting must be `null`. The default is `null`.| -|`receiveTimeout`|A value that specifies the interval of time provided for a receive operation to complete. This value should be greater than or equal to . The default is 00:10:00.| -|`sendTimeout`|A value that specifies the interval of time provided for a send operation to complete. This value should be greater than or equal to . The default is 00:01:00.| -|`textEncoding`|Sets the character set encoding to be used for emitting messages on the binding. Valid values include the following:

- BigEndianUnicode: Unicode BigEndian encoding.
- Unicode: 16-bit encoding.
- UTF8: 8-bit encoding

The default is UTF8. This attribute is of type .| -|`transferMode`|A valid value that specifies whether messages are buffered or streamed on a request or response.| -|`useDefaultWebProxy`|A Boolean value that specifies whether the auto-configured HTTP proxy of the system should be used, if available. The default is `true`.| - -### Child Elements - -|Element|Description| -|-------------|-----------------| -|[\](security-of-basichttpbinding.md)|Defines the security settings for the binding. This element is of type .| -|[\](/previous-versions/dotnet/netframework-4.0/ms731325(v=vs.100))|Defines the constraints on the complexity of SOAP messages that can be processed by endpoints configured with this binding. This element is of type .| - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](bindings.md)|This element holds a collection of standard and custom bindings.| - -## Remarks - - The BasicHttpBinding uses HTTP as the transport for sending SOAP 1.1 messages. A service can use this binding to expose endpoints that conform to WS-I BP 1.1, such as those that ASMX clients consume. Similarly, a client can use the BasicHttpBinding to communicate with services exposing endpoints that conform to WS-I BP 1.1, such as ASMX Web services or services configured with the BasicHttpBinding. - - Security is turned off by default, but can be added setting the mode attribute of the [\](security-of-basichttpbinding.md) child element to a value other than `None`. It uses a "Text" message encoding and UTF-8 text encoding by default. - -## Example - - The following example demonstrates the use of that provides HTTP communication and maximum interoperability with first- and second-generation Web services. The binding is specified in the configuration files for the client and service. The binding type is specified using the `binding` attribute of the `` element. If you want to configure the basic binding and change some of its settings, it is necessary to define a binding configuration. The endpoint must reference the binding configuration by name by using the `bindingConfiguration` attribute of the `` element, as shown in the following configuration code for the service. - -```xml +``` + +## Attributes and Elements + + The following sections describe attributes, child elements, and parent elements. + +### Attributes + +|Attribute|Description| +|---------------|-----------------| +|`allowCookies`|A Boolean value that indicates whether the client accepts cookies and propagates them on future requests. The default is `false`.

You can use this property when you interact with ASMX Web services that use cookies. In this way, you can be sure that the cookies returned from the server are automatically copied to all future client requests for that service.| +|`bypassProxyOnLocal`|A Boolean value that indicates whether to bypass the proxy server for local addresses. The default is `false`.

An Internet resource is local if it has a local address. A local address is one that is on same computer, the local LAN or intranet and is identified, syntactically, by the lack of a period (.) as in the URIs `http://webserver/` and `http://localhost/`.

Setting this attribute determines whether endpoints configured with the BasicHttpBinding use the proxy server when accessing local resources. If this attribute is `true`, requests to local Internet resources do not use the proxy server. Use the host name (rather than localhost) if you want clients to go through a proxy when talking to services on the same machine when this attribute is set to `true`.

When this attribute is `false`, all Internet requests are made through the proxy server.| +|`closeTimeout`|A value that specifies the interval of time provided for a close operation to complete. This value should be greater than or equal to . The default is 00:01:00.| +|`hostNameComparisonMode`|Specifies the HTTP hostname comparison mode used to parse URIs. This attribute is of type , which indicates whether the hostname is used to reach the service when matching on the URI. The default value is , which ignores the hostname in the match.| +|`maxBufferPoolSize`|An integer value that specifies the maximum amount of memory that is allocated for use by the manager of the message buffers that receive messages from the channel. The default value is 524288 (0x80000) bytes.

The Buffer Manager minimizes the cost of using buffers by using a buffer pool. Buffers are required to process messages by the service when they come out of the channel. If there is not sufficient memory in the buffer pool to process the message load, the Buffer Manager must allocate additional memory from the CLR heap, which increases the garbage collection overhead. Extensive allocation from the CLR garbage heap is an indication that the buffer pool size is too small and that performance can be improved with a larger allocation by increasing the limit specified by this attribute.| +|`maxBufferSize`|An integer value that specifies the maximum size, in bytes, of a buffer that stores messages while they are processed for an endpoint configured with this binding. The default value is 65,536 bytes.| +|`maxReceivedMessageSize`|A positive integer that defines the maximum message size, in bytes, including headers, for a message that can be received on a channel configured with this binding. The sender receives a SOAP fault if the message is too large for the receiver. The receiver drops the message and creates an entry of the event in the trace log. The default is 65,536 bytes.| +|`messageEncoding`|Defines the encoder used to encode the SOAP message. Valid values include the following:

- Text: Use a text message encoder.
- Mtom: Use a Message Transmission Organization Mechanism 1.0 (MTOM) encoder.

The default is Text. This attribute is of type .| +|`name`|A string that contains the configuration name of the binding. This value should be unique among bindings of the same type. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| +|`openTimeout`|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| +|`proxyAddress`|A URI that contains the address of the HTTP proxy. If `useSystemWebProxy` is set to `true`, this setting must be `null`. The default is `null`.| +|`receiveTimeout`|A value that specifies the interval of time provided for a receive operation to complete. This value should be greater than or equal to . The default is 00:10:00.| +|`sendTimeout`|A value that specifies the interval of time provided for a send operation to complete. This value should be greater than or equal to . The default is 00:01:00.| +|`textEncoding`|Sets the character set encoding to be used for emitting messages on the binding. Valid values include the following:

- BigEndianUnicode: Unicode BigEndian encoding.
- Unicode: 16-bit encoding.
- UTF8: 8-bit encoding

The default is UTF8. This attribute is of type .| +|`transferMode`|A valid value that specifies whether messages are buffered or streamed on a request or response.| +|`useDefaultWebProxy`|A Boolean value that specifies whether the auto-configured HTTP proxy of the system should be used, if available. The default is `true`.| + +### Child Elements + +|Element|Description| +|-------------|-----------------| +|[\](security-of-basichttpbinding.md)|Defines the security settings for the binding. This element is of type .| +|[\](/previous-versions/dotnet/netframework-4.0/ms731325(v=vs.100))|Defines the constraints on the complexity of SOAP messages that can be processed by endpoints configured with this binding. This element is of type .| + +### Parent Elements + +|Element|Description| +|-------------|-----------------| +|[\](bindings.md)|This element holds a collection of standard and custom bindings.| + +## Remarks + + The BasicHttpBinding uses HTTP as the transport for sending SOAP 1.1 messages. A service can use this binding to expose endpoints that conform to WS-I BP 1.1, such as those that ASMX clients consume. Similarly, a client can use the BasicHttpBinding to communicate with services exposing endpoints that conform to WS-I BP 1.1, such as ASMX Web services or services configured with the BasicHttpBinding. + + Security is turned off by default, but can be added setting the mode attribute of the [\](security-of-basichttpbinding.md) child element to a value other than `None`. It uses a "Text" message encoding and UTF-8 text encoding by default. + +## Example 1 + + The following example demonstrates the use of that provides HTTP communication and maximum interoperability with first- and second-generation Web services. The binding is specified in the configuration files for the client and service. The binding type is specified using the `binding` attribute of the `` element. If you want to configure the basic binding and change some of its settings, it is necessary to define a binding configuration. The endpoint must reference the binding configuration by name by using the `bindingConfiguration` attribute of the `` element, as shown in the following configuration code for the service. + +```xml
-``` - -## Example +``` + +## Example 2 + + Starting with .NET Framework 4, bindings and behaviors are not required to have a name. The functionality from the previous example can be accomplished by removing the bindingConfiguration from the endpoint address and the name from the binding. - Starting with .NET Framework 4, bindings and behaviors are not required to have a name. The functionality from the previous example can be accomplished by removing the bindingConfiguration from the endpoint address and the name from the binding. - -```xml +```xml -``` - - For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md). - +``` + + For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md). + ## See also - diff --git a/docs/framework/configure-apps/file-schema/wcf/nethttpbinding.md b/docs/framework/configure-apps/file-schema/wcf/nethttpbinding.md index 248e7b6ce5bd8..de0f820c9c8dd 100644 --- a/docs/framework/configure-apps/file-schema/wcf/nethttpbinding.md +++ b/docs/framework/configure-apps/file-schema/wcf/nethttpbinding.md @@ -6,16 +6,16 @@ ms.assetid: b0d81ca0-87c5-4090-8baa-e390fd3656d2 --- # \ -Represents a binding that a Windows Communication Foundation (WCF) service can use to configure and expose endpoints that are able to communicate over HTTP. When used with a duplex contract, Web Sockets will be used, otherwise HTTP will be used. - +Represents a binding that a Windows Communication Foundation (WCF) service can use to configure and expose endpoints that are able to communicate over HTTP. When used with a duplex contract, Web Sockets will be used, otherwise HTTP will be used. + [**\**](../configuration-element.md)\   [**\**](system-servicemodel.md)\     [**\**](bindings.md)\ -      **\** - -## Syntax - -```xml +      **\** + +## Syntax + +```xml -``` - -## Type - - `Type` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|`allowCookies`|A Boolean value that indicates whether the client accepts cookies and propagates them on future requests. The default is `false`.

You can use this property when you interact with ASMX Web services that use cookies. In this way, you can be sure that the cookies returned from the server are automatically copied to all future client requests for that service.| -|`bypassProxyOnLocal`|A Boolean value that indicates whether to bypass the proxy server for local addresses. The default is `false`.

An Internet resource is local if it has a local address. A local address is one that is on same computer, the local LAN or intranet and is identified, syntactically, by the lack of a period (.) as in the URIs `http://webserver/` and `http://localhost/`.

Setting this attribute determines whether endpoints configured with the BasicHttpBinding use the proxy server when accessing local resources. If this attribute is `true`, requests to local Internet resources do not use the proxy server. Use the host name (rather than localhost) if you want clients to go through a proxy when talking to services on the same machine when this attribute is set to `true`.

When this attribute is `false`, all Internet requests are made through the proxy server.| -|`closeTimeout`|A value that specifies the interval of time provided for a close operation to complete. This value should be greater than or equal to . The default is 00:01:00.| -|`hostNameComparisonMode`|Specifies the HTTP hostname comparison mode used to parse URIs. This attribute is of type , which indicates whether the hostname is used to reach the service when matching on the URI. The default value is , which ignores the hostname in the match.| -|`maxBufferPoolSize`|An integer value that specifies the maximum amount of memory that is allocated for use by the manager of the message buffers that receive messages from the channel. The default value is 524288 (0x80000) bytes.

The Buffer Manager minimizes the cost of using buffers by using a buffer pool. Buffers are required to process messages by the service when they come out of the channel. If there is not sufficient memory in the buffer pool to process the message load, the Buffer Manager must allocate additional memory from the CLR heap, which increases the garbage collection overhead. Extensive allocation from the CLR garbage heap is an indication that the buffer pool size is too small and that performance can be improved with a larger allocation by increasing the limit specified by this attribute.| -|`maxBufferSize`|An integer value that specifies the maximum size, in bytes, of a buffer that stores messages while they are processed for an endpoint configured with this binding. The default value is 65,536 bytes.| -|`maxReceivedMessageSize`|A positive integer that defines the maximum message size, in bytes, including headers, for a message that can be received on a channel configured with this binding. The sender receives a SOAP fault if the message is too large for the receiver. The receiver drops the message and creates an entry of the event in the trace log. The default is 65,536 bytes.| -|`messageEncoding`|Defines the encoder used to encode the SOAP message. Valid values include the following:

- Text: Use a text message encoder.
- Mtom: Use a Message Transmission Organization Mechanism 1.0 (MTOM) encoder.

The default is Text. This attribute is of type .| -|`name`|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| -|`openTimeout`|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| -|`proxyAddress`|A URI that contains the address of the HTTP proxy. If `useSystemWebProxy` is set to `true`, this setting must be `null`. The default is `null`.| -|`receiveTimeout`|A value that specifies the interval of time provided for a receive operation to complete. This value should be greater than or equal to . The default is 00:10:00.| -|`sendTimeout`|A value that specifies the interval of time provided for a send operation to complete. This value should be greater than or equal to . The default is 00:01:00.| -|`textEncoding`|Sets the character set encoding to be used for emitting messages on the binding. Valid values include the following:

- BigEndianUnicode: Unicode BigEndian encoding.
- Unicode: 16-bit encoding.
- UTF8: 8-bit encoding

The default is UTF8. This attribute is of type .| -|`transferMode`|A valid value that specifies whether messages are buffered or streamed on a request or response.| -|`useDefaultWebProxy`|A Boolean value that specifies whether the auto-configured HTTP proxy of the system should be used, if available. The default is `true`.| -||| - -### Child Elements - -|Element|Description| -|-------------|-----------------| -|[\](security-of-basichttpbinding.md)|Defines the security settings for the binding. This element is of type .| -|[\](/previous-versions/dotnet/netframework-4.0/ms731325(v=vs.100))|Defines the constraints on the complexity of SOAP messages that can be processed by endpoints configured with this binding. This element is of type .| - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](bindings.md)|This element holds a collection of standard and custom bindings.| - -## Remarks - - The NetHttpBinding uses HTTP as the transport for sending messages. When used with a duplex contract, Web Sockets will be used. When used with a request-reply contract NetHttpBinding will behave like a BasicHttpBinding with a binary encoder. - - Security is turned off by default, but can be added setting the mode attribute of the [\](security-of-basichttpbinding.md) child element to a value other than `None`. It uses a "Text" message encoding and UTF-8 text encoding by default. - -## Example - - The following example demonstrates the use of that provides HTTP communication and maximum interoperability with first- and second-generation Web services. The binding is specified in the configuration files for the client and service. The binding type is specified using the `binding` attribute of the `` element. If you want to configure the basic binding and change some of its settings, it is necessary to define a binding configuration. The endpoint must reference the binding configuration by name by using the `bindingConfiguration` attribute of the `` element, as shown in the following configuration code for the service. - -```xml +``` + +## Type + + `Type` + +## Attributes and Elements + + The following sections describe attributes, child elements, and parent elements. + +### Attributes + +|Attribute|Description| +|---------------|-----------------| +|`allowCookies`|A Boolean value that indicates whether the client accepts cookies and propagates them on future requests. The default is `false`.

You can use this property when you interact with ASMX Web services that use cookies. In this way, you can be sure that the cookies returned from the server are automatically copied to all future client requests for that service.| +|`bypassProxyOnLocal`|A Boolean value that indicates whether to bypass the proxy server for local addresses. The default is `false`.

An Internet resource is local if it has a local address. A local address is one that is on same computer, the local LAN or intranet and is identified, syntactically, by the lack of a period (.) as in the URIs `http://webserver/` and `http://localhost/`.

Setting this attribute determines whether endpoints configured with the BasicHttpBinding use the proxy server when accessing local resources. If this attribute is `true`, requests to local Internet resources do not use the proxy server. Use the host name (rather than localhost) if you want clients to go through a proxy when talking to services on the same machine when this attribute is set to `true`.

When this attribute is `false`, all Internet requests are made through the proxy server.| +|`closeTimeout`|A value that specifies the interval of time provided for a close operation to complete. This value should be greater than or equal to . The default is 00:01:00.| +|`hostNameComparisonMode`|Specifies the HTTP hostname comparison mode used to parse URIs. This attribute is of type , which indicates whether the hostname is used to reach the service when matching on the URI. The default value is , which ignores the hostname in the match.| +|`maxBufferPoolSize`|An integer value that specifies the maximum amount of memory that is allocated for use by the manager of the message buffers that receive messages from the channel. The default value is 524288 (0x80000) bytes.

The Buffer Manager minimizes the cost of using buffers by using a buffer pool. Buffers are required to process messages by the service when they come out of the channel. If there is not sufficient memory in the buffer pool to process the message load, the Buffer Manager must allocate additional memory from the CLR heap, which increases the garbage collection overhead. Extensive allocation from the CLR garbage heap is an indication that the buffer pool size is too small and that performance can be improved with a larger allocation by increasing the limit specified by this attribute.| +|`maxBufferSize`|An integer value that specifies the maximum size, in bytes, of a buffer that stores messages while they are processed for an endpoint configured with this binding. The default value is 65,536 bytes.| +|`maxReceivedMessageSize`|A positive integer that defines the maximum message size, in bytes, including headers, for a message that can be received on a channel configured with this binding. The sender receives a SOAP fault if the message is too large for the receiver. The receiver drops the message and creates an entry of the event in the trace log. The default is 65,536 bytes.| +|`messageEncoding`|Defines the encoder used to encode the SOAP message. Valid values include the following:

- Text: Use a text message encoder.
- Mtom: Use a Message Transmission Organization Mechanism 1.0 (MTOM) encoder.

The default is Text. This attribute is of type .| +|`name`|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| +|`openTimeout`|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| +|`proxyAddress`|A URI that contains the address of the HTTP proxy. If `useSystemWebProxy` is set to `true`, this setting must be `null`. The default is `null`.| +|`receiveTimeout`|A value that specifies the interval of time provided for a receive operation to complete. This value should be greater than or equal to . The default is 00:10:00.| +|`sendTimeout`|A value that specifies the interval of time provided for a send operation to complete. This value should be greater than or equal to . The default is 00:01:00.| +|`textEncoding`|Sets the character set encoding to be used for emitting messages on the binding. Valid values include the following:

- BigEndianUnicode: Unicode BigEndian encoding.
- Unicode: 16-bit encoding.
- UTF8: 8-bit encoding

The default is UTF8. This attribute is of type .| +|`transferMode`|A valid value that specifies whether messages are buffered or streamed on a request or response.| +|`useDefaultWebProxy`|A Boolean value that specifies whether the auto-configured HTTP proxy of the system should be used, if available. The default is `true`.| +||| + +### Child Elements + +|Element|Description| +|-------------|-----------------| +|[\](security-of-basichttpbinding.md)|Defines the security settings for the binding. This element is of type .| +|[\](/previous-versions/dotnet/netframework-4.0/ms731325(v=vs.100))|Defines the constraints on the complexity of SOAP messages that can be processed by endpoints configured with this binding. This element is of type .| + +### Parent Elements + +|Element|Description| +|-------------|-----------------| +|[\](bindings.md)|This element holds a collection of standard and custom bindings.| + +## Remarks + + The NetHttpBinding uses HTTP as the transport for sending messages. When used with a duplex contract, Web Sockets will be used. When used with a request-reply contract NetHttpBinding will behave like a BasicHttpBinding with a binary encoder. + + Security is turned off by default, but can be added setting the mode attribute of the [\](security-of-basichttpbinding.md) child element to a value other than `None`. It uses a "Text" message encoding and UTF-8 text encoding by default. + +## Example 1 + + The following example demonstrates the use of that provides HTTP communication and maximum interoperability with first- and second-generation Web services. The binding is specified in the configuration files for the client and service. The binding type is specified using the `binding` attribute of the `` element. If you want to configure the basic binding and change some of its settings, it is necessary to define a binding configuration. The endpoint must reference the binding configuration by name by using the `bindingConfiguration` attribute of the `` element, as shown in the following configuration code for the service. + +```xml
-``` - -## Example +``` + +## Example 2 + + Starting with .NET Framework 4, bindings and behaviors are not required to have a name. The functionality from the previous example can be accomplished by removing the bindingConfiguration from the endpoint address and the name from the binding. - Starting with .NET Framework 4, bindings and behaviors are not required to have a name. The functionality from the previous example can be accomplished by removing the bindingConfiguration from the endpoint address and the name from the binding. - -```xml +```xml -``` - - For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md). - +``` + + For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md). + ## See also - diff --git a/docs/framework/wcf/diagnostics/etw/index.md b/docs/framework/wcf/diagnostics/etw/index.md index 3ea5214064ff5..60b6780f655d0 100644 --- a/docs/framework/wcf/diagnostics/etw/index.md +++ b/docs/framework/wcf/diagnostics/etw/index.md @@ -29,4 +29,4 @@ Windows Communication Foundation (WCF) analytic tracing offers a way to capture ## See also - [WCF Services and Event Tracing for Windows](../../samples/wcf-services-and-event-tracing-for-windows.md) -- [Tracking Events into Event Tracing in Windows](../../../windows-workflow-foundation/samples/tracking-events-into-event-tracing-in-windows.md) +- [Tracking Events into Event Tracing in Windows](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/tracking-events-into-event-tracing-in-windows) diff --git a/docs/framework/wcf/extending/how-to-create-a-custom-client-identity-verifier.md b/docs/framework/wcf/extending/how-to-create-a-custom-client-identity-verifier.md index b22c9ee991480..b4d73708fc0ff 100644 --- a/docs/framework/wcf/extending/how-to-create-a-custom-client-identity-verifier.md +++ b/docs/framework/wcf/extending/how-to-create-a-custom-client-identity-verifier.md @@ -2,83 +2,83 @@ description: "Learn more about: How to: Create a Custom Client Identity Verifier" title: "How to: Create a Custom Client Identity Verifier" ms.date: "03/30/2017" -dev_langs: +dev_langs: - "csharp" - "vb" ms.assetid: f2d34e43-fa8b-46d2-91cf-d2960e13e16b --- # How to: Create a Custom Client Identity Verifier -The *identity* feature of Windows Communication Foundation (WCF) enables a client to specify in advance the expected identity of the service. Whenever a server authenticates itself to the client, the identity is checked against the expected identity. (For an explanation of identity and how it works, see [Service Identity and Authentication](../feature-details/service-identity-and-authentication.md).) - - If needed, the verification can be customized using a custom identity verifier. For example, you can perform additional service identity verification checks. In this example, the custom identity verifier checks additional claims in the X.509 certificate returned from the server. For a sample application, see [Service Identity Sample](../samples/service-identity-sample.md). - -### To extend the EndpointIdentity class - -1. Define a new class that derives from the class. This example names the extension `OrgEndpointIdentity`. - -2. Add private members along with properties that will be used by the extended class to perform the identity check against claims in the security token returned from the service. This example defines one property: the `OrganizationClaim` property. - +The *identity* feature of Windows Communication Foundation (WCF) enables a client to specify in advance the expected identity of the service. Whenever a server authenticates itself to the client, the identity is checked against the expected identity. (For an explanation of identity and how it works, see [Service Identity and Authentication](../feature-details/service-identity-and-authentication.md).) + + If needed, the verification can be customized using a custom identity verifier. For example, you can perform additional service identity verification checks. In this example, the custom identity verifier checks additional claims in the X.509 certificate returned from the server. For a sample application, see [Service Identity Sample](../samples/service-identity-sample.md). + +### To extend the EndpointIdentity class + +1. Define a new class that derives from the class. This example names the extension `OrgEndpointIdentity`. + +2. Add private members along with properties that will be used by the extended class to perform the identity check against claims in the security token returned from the service. This example defines one property: the `OrganizationClaim` property. + [!code-csharp[c_HowToSetCustomClientIdentity#6](../../../../samples/snippets/csharp/VS_Snippets_CFX/c_howtosetcustomclientidentity/cs/source.cs#6)] - [!code-vb[c_HowToSetCustomClientIdentity#6](../../../../samples/snippets/visualbasic/VS_Snippets_CFX/c_howtosetcustomclientidentity/vb/source.vb#6)] - -### To extend the IdentityVerifier class - -1. Define a new class that derives from . This example names the extension `CustomIdentityVerifier`. - + [!code-vb[c_HowToSetCustomClientIdentity#6](../../../../samples/snippets/visualbasic/VS_Snippets_CFX/c_howtosetcustomclientidentity/vb/source.vb#6)] + +### To extend the IdentityVerifier class + +1. Define a new class that derives from . This example names the extension `CustomIdentityVerifier`. + [!code-csharp[c_HowToSetCustomClientIdentity#7](../../../../samples/snippets/csharp/VS_Snippets_CFX/c_howtosetcustomclientidentity/cs/source.cs#7)] - [!code-vb[c_HowToSetCustomClientIdentity#7](../../../../samples/snippets/visualbasic/VS_Snippets_CFX/c_howtosetcustomclientidentity/vb/source.vb#7)] - -2. Override the method. The method determines whether the identity check succeeded or failed. - -3. The `CheckAccess` method has two parameters. The first is an instance of the class. The second is an instance of the class. - - In the method implementation, examine the collection of claims returned by the property of the class, and perform authentication checks as required. This example begins by finding any claim that is of type "Distinguished Name" and then compares the name to the extension of the (`OrgEndpointIdentity`). - + [!code-vb[c_HowToSetCustomClientIdentity#7](../../../../samples/snippets/visualbasic/VS_Snippets_CFX/c_howtosetcustomclientidentity/vb/source.vb#7)] + +2. Override the method. The method determines whether the identity check succeeded or failed. + +3. The `CheckAccess` method has two parameters. The first is an instance of the class. The second is an instance of the class. + + In the method implementation, examine the collection of claims returned by the property of the class, and perform authentication checks as required. This example begins by finding any claim that is of type "Distinguished Name" and then compares the name to the extension of the (`OrgEndpointIdentity`). + [!code-csharp[c_HowToSetCustomClientIdentity#1](../../../../samples/snippets/csharp/VS_Snippets_CFX/c_howtosetcustomclientidentity/cs/source.cs#1)] - [!code-vb[c_HowToSetCustomClientIdentity#1](../../../../samples/snippets/visualbasic/VS_Snippets_CFX/c_howtosetcustomclientidentity/vb/source.vb#1)] - -### To implement the TryGetIdentity method - -1. Implement the method, which determines whether an instance of the class can be returned by the client. The WCF infrastructure calls the implementation of the `TryGetIdentity` method first to retrieve the service's identity from the message. Next, the infrastructure calls the `CheckAccess` implementation with the returned `EndpointIdentity` and . - -2. In the `TryGetIdentity` method, put the following code: - + [!code-vb[c_HowToSetCustomClientIdentity#1](../../../../samples/snippets/visualbasic/VS_Snippets_CFX/c_howtosetcustomclientidentity/vb/source.vb#1)] + +### To implement the TryGetIdentity method + +1. Implement the method, which determines whether an instance of the class can be returned by the client. The WCF infrastructure calls the implementation of the `TryGetIdentity` method first to retrieve the service's identity from the message. Next, the infrastructure calls the `CheckAccess` implementation with the returned `EndpointIdentity` and . + +2. In the `TryGetIdentity` method, put the following code: + [!code-csharp[c_HowToSetCustomClientIdentity#2](../../../../samples/snippets/csharp/VS_Snippets_CFX/c_howtosetcustomclientidentity/cs/source.cs#2)] - [!code-vb[c_HowToSetCustomClientIdentity#2](../../../../samples/snippets/visualbasic/VS_Snippets_CFX/c_howtosetcustomclientidentity/vb/source.vb#2)] - -### To implement a custom binding and set the custom IdentityVerifier - -1. Create a method that returns a object. This example begins creates an instance of the class and sets its security mode to , and its to . - -2. Create a using the method. - -3. Return the from the collection and cast it to a variable. - -4. Set the property of the class to a new instance of the `CustomIdentityVerifier` class created previously. - + [!code-vb[c_HowToSetCustomClientIdentity#2](../../../../samples/snippets/visualbasic/VS_Snippets_CFX/c_howtosetcustomclientidentity/vb/source.vb#2)] + +### To implement a custom binding and set the custom IdentityVerifier + +1. Create a method that returns a object. This example begins creates an instance of the class and sets its security mode to , and its to . + +2. Create a using the method. + +3. Return the from the collection and cast it to a variable. + +4. Set the property of the class to a new instance of the `CustomIdentityVerifier` class created previously. + [!code-csharp[c_HowToSetCustomClientIdentity#3](../../../../samples/snippets/csharp/VS_Snippets_CFX/c_howtosetcustomclientidentity/cs/source.cs#3)] - [!code-vb[c_HowToSetCustomClientIdentity#3](../../../../samples/snippets/visualbasic/VS_Snippets_CFX/c_howtosetcustomclientidentity/vb/source.vb#3)] - -5. The custom binding that is returned is used to create an instance of the client and class. The client can then perform a custom identity verification check of the service as shown in the following code. - + [!code-vb[c_HowToSetCustomClientIdentity#3](../../../../samples/snippets/visualbasic/VS_Snippets_CFX/c_howtosetcustomclientidentity/vb/source.vb#3)] + +5. The custom binding that is returned is used to create an instance of the client and class. The client can then perform a custom identity verification check of the service as shown in the following code. + [!code-csharp[c_HowToSetCustomClientIdentity#4](../../../../samples/snippets/csharp/VS_Snippets_CFX/c_howtosetcustomclientidentity/cs/source.cs#4)] - [!code-vb[c_HowToSetCustomClientIdentity#4](../../../../samples/snippets/visualbasic/VS_Snippets_CFX/c_howtosetcustomclientidentity/vb/source.vb#4)] - -## Example + [!code-vb[c_HowToSetCustomClientIdentity#4](../../../../samples/snippets/visualbasic/VS_Snippets_CFX/c_howtosetcustomclientidentity/vb/source.vb#4)] + +## Example 1 + + The following example shows a complete implementation of the class. - The following example shows a complete implementation of the class. - [!code-csharp[c_HowToSetCustomClientIdentity#5](../../../../samples/snippets/csharp/VS_Snippets_CFX/c_howtosetcustomclientidentity/cs/source.cs#5)] - [!code-vb[c_HowToSetCustomClientIdentity#5](../../../../samples/snippets/visualbasic/VS_Snippets_CFX/c_howtosetcustomclientidentity/vb/source.vb#5)] - -## Example + [!code-vb[c_HowToSetCustomClientIdentity#5](../../../../samples/snippets/visualbasic/VS_Snippets_CFX/c_howtosetcustomclientidentity/vb/source.vb#5)] + +## Example 2 + + The following example shows a complete implementation of the class. - The following example shows a complete implementation of the class. - [!code-csharp[c_HowToSetCustomClientIdentity#6](../../../../samples/snippets/csharp/VS_Snippets_CFX/c_howtosetcustomclientidentity/cs/source.cs#6)] - [!code-vb[c_HowToSetCustomClientIdentity#6](../../../../samples/snippets/visualbasic/VS_Snippets_CFX/c_howtosetcustomclientidentity/vb/source.vb#6)] - + [!code-vb[c_HowToSetCustomClientIdentity#6](../../../../samples/snippets/visualbasic/VS_Snippets_CFX/c_howtosetcustomclientidentity/vb/source.vb#6)] + ## See also - diff --git a/docs/framework/wcf/feature-details/how-to-create-a-service-endpoint-in-configuration.md b/docs/framework/wcf/feature-details/how-to-create-a-service-endpoint-in-configuration.md index 8bbdc97b0dac0..8c2fdb1c45327 100644 --- a/docs/framework/wcf/feature-details/how-to-create-a-service-endpoint-in-configuration.md +++ b/docs/framework/wcf/feature-details/how-to-create-a-service-endpoint-in-configuration.md @@ -6,142 +6,142 @@ ms.assetid: f474e25d-2a27-4f31-84c5-395c442b8e70 --- # How to: Create a Service Endpoint in Configuration -Endpoints provide clients with access to the functionality a Windows Communication Foundation (WCF) service offers. You can define one or more endpoints for a service by using a combination of relative and absolute endpoint addresses, or if you do not define any service endpoints, the runtime provides some by default for you. This topic shows how to add endpoints using a configuration file that contain both relative and absolute addresses. - -## Example - - The following service configuration specifies a base address and five endpoints. - -```xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -``` - -## Example - - The base address is specified using the `add` element, under service/host/baseAddresses, as shown in the following sample. - -```xml +Endpoints provide clients with access to the functionality a Windows Communication Foundation (WCF) service offers. You can define one or more endpoints for a service by using a combination of relative and absolute endpoint addresses, or if you do not define any service endpoints, the runtime provides some by default for you. This topic shows how to add endpoints using a configuration file that contain both relative and absolute addresses. + +## Example 1 + + The following service configuration specifies a base address and five endpoints. + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +## Example 2 + + The base address is specified using the `add` element, under service/host/baseAddresses, as shown in the following sample. + +```xml - - - - - -``` - -## Example - - The first endpoint definition shown in the following sample specifies a relative address, which means the endpoint address is a combination of the base address and the relative address following the rules of Uniform Resource Identifier (URI) composition. The relative address is empty (""), so the endpoint address is the same as the base address. The actual endpoint address is `http://localhost:8000/servicemodelsamples/service`. - -```xml + name="Microsoft.ServiceModel.Samples.CalculatorService"> + + + + + +``` + +## Example 3 + + The first endpoint definition shown in the following sample specifies a relative address, which means the endpoint address is a combination of the base address and the relative address following the rules of Uniform Resource Identifier (URI) composition. The relative address is empty (""), so the endpoint address is the same as the base address. The actual endpoint address is `http://localhost:8000/servicemodelsamples/service`. + +```xml -``` - -## Example - - The second endpoint definition also specifies a relative address, as shown in the following sample configuration. The relative address, "test", is appended to the base address. The actual endpoint address is `http://localhost:8000/servicemodelsamples/service/test`. - -```xml - -``` - -## Example - - The third endpoint definition specifies an absolute address, as shown in the following sample configuration. The base address plays no role in the address. The actual endpoint address is `http://localhost:8001/hello/servicemodelsamples`. - -```xml - -``` - -## Example - - The fourth endpoint address specifies an absolute address and a different transport—TCP. The base address plays no role in the address. The actual endpoint address is net.tcp://localhost:9000/servicemodelsamples/service. - -```xml - -``` - -## Example - - To use the default endpoints provided by the runtime, do not specify any service endpoints in either the code or the configuration file. In this example, the runtime creates the default endpoints when the service is opened. For more information about default endpoints, bindings, and behaviors, see [Simplified Configuration](../simplified-configuration.md) and [Simplified Configuration for WCF Services](../samples/simplified-configuration-for-wcf-services.md). - -```xml - - - - - - - - - - - - - - - - - - - - - + binding="wsHttpBinding" + contract="Microsoft.ServiceModel.Samples.ICalculator" /> +``` + +## Example 4 + + The second endpoint definition also specifies a relative address, as shown in the following sample configuration. The relative address, "test", is appended to the base address. The actual endpoint address is `http://localhost:8000/servicemodelsamples/service/test`. + +```xml + +``` + +## Example 5 + + The third endpoint definition specifies an absolute address, as shown in the following sample configuration. The base address plays no role in the address. The actual endpoint address is `http://localhost:8001/hello/servicemodelsamples`. + +```xml + +``` + +## Example 6 + + The fourth endpoint address specifies an absolute address and a different transport—TCP. The base address plays no role in the address. The actual endpoint address is net.tcp://localhost:9000/servicemodelsamples/service. + +```xml + +``` + +## Example 7 + + To use the default endpoints provided by the runtime, do not specify any service endpoints in either the code or the configuration file. In this example, the runtime creates the default endpoints when the service is opened. For more information about default endpoints, bindings, and behaviors, see [Simplified Configuration](../simplified-configuration.md) and [Simplified Configuration for WCF Services](../samples/simplified-configuration-for-wcf-services.md). + +```xml + + + + + + + + + + + + + + + + + + + + + ``` diff --git a/docs/framework/wcf/feature-details/how-to-dynamic-update.md b/docs/framework/wcf/feature-details/how-to-dynamic-update.md index 37b49cd341cab..ae6551bb85a26 100644 --- a/docs/framework/wcf/feature-details/how-to-dynamic-update.md +++ b/docs/framework/wcf/feature-details/how-to-dynamic-update.md @@ -6,295 +6,295 @@ ms.assetid: 9b8f6e0d-edab-4a7e-86e3-8c66bebc64bb --- # How To: Dynamic Update -This topic outlines the basic steps required to create and dynamically update the routing configuration. In this example, the initial routing configuration is obtained from the configuration file and routes all messages to the regularCalc calculator service; however, it is subsequently updated programmatically in order to change the destination endpoint the roundingCalc service. - +This topic outlines the basic steps required to create and dynamically update the routing configuration. In this example, the initial routing configuration is obtained from the configuration file and routes all messages to the regularCalc calculator service; however, it is subsequently updated programmatically in order to change the destination endpoint the roundingCalc service. + > [!NOTE] -> In many implementations, configuration will be fully dynamic and will not rely on a default configuration; however, there are some scenarios, such as the one in this topic, where it is desirable to have a default configuration state when the service starts. - +> In many implementations, configuration will be fully dynamic and will not rely on a default configuration; however, there are some scenarios, such as the one in this topic, where it is desirable to have a default configuration state when the service starts. + > [!NOTE] -> Dynamic updates occur only in memory, and do not result in the modification of configuration files. - - Both regularCalc and roundingCalc support the same operations of add, subtract, multiply and divide; however, roundingCalc rounds all calculations to the nearest integer value before returning. A configuration file is used to configure the service to route all messages to the regularCalc service. After the Routing Service has been started, is used to reconfigure the service to route messages to the roundingCalc service. - -### Implement Initial Configuration - -1. Create the basic Routing Service Configuration by specifying the service endpoints exposed by the service. The following example defines a single service endpoint, which will be used to receive messages. It also defines a client endpoint that will be used to send messages to the regularCalc. - - ```xml - - - - - - - - - - - - - - - - ``` - -2. Define the filter used to route messages to the destination endpoints. For this example, the MatchAll filter is used to route all messages to the regularCalcEndpoint defined previously. The following example defines the filter and filter table. - - ```xml - - - - - - - - - - - ``` - -3. To evaluate incoming messages against the filters contained in the filter table, you must associate the filter table with the service endpoints by using the routing behavior. The following example demonstrates associating "filterTable1" with the service endpoint. - - ```xml - - - - - - - - - ``` - -## Implement Dynamic Configuration - - Dynamic configuration of the Routing Service can only be performed in code by creating a new and using to replace the current configuration. For this example, the Routing Service is self-hosted within a console application. After the application has started, you can modify the routing configuration by entering ‘regular’ or ‘rounding’ at the console window to configure the destination endpoint that messages are routed to; regularCalc when ‘regular’ is entered, otherwise roundingCalc when ‘rounding’ is entered. - -1. The following using statements must be added in order to support the Routing Service. - - ```csharp - using System; - using System.Collections.Generic; - using System.ServiceModel; - using System.ServiceModel.Channels; - using System.ServiceModel.Description; - using System.ServiceModel.Dispatcher; - using System.ServiceModel.Routing; - ``` - -2. The following code is used to self-host the Routing Service as a console application. This initializes the Routing Service using the configuration described in the previous step, which is contained within the application configuration file. The while loop contains the code used to change the routing configuration. - - ```csharp - // Host the service within this EXE console application. - public static void Main() - { - // Create a ServiceHost for the CalculatorService type. - using (ServiceHost serviceHost = - new ServiceHost(typeof(RoutingService))) - { +> Dynamic updates occur only in memory, and do not result in the modification of configuration files. + + Both regularCalc and roundingCalc support the same operations of add, subtract, multiply and divide; however, roundingCalc rounds all calculations to the nearest integer value before returning. A configuration file is used to configure the service to route all messages to the regularCalc service. After the Routing Service has been started, is used to reconfigure the service to route messages to the roundingCalc service. + +### Implement Initial Configuration + +1. Create the basic Routing Service Configuration by specifying the service endpoints exposed by the service. The following example defines a single service endpoint, which will be used to receive messages. It also defines a client endpoint that will be used to send messages to the regularCalc. + + ```xml + + + + + + + + + + + + + + + + ``` + +2. Define the filter used to route messages to the destination endpoints. For this example, the MatchAll filter is used to route all messages to the regularCalcEndpoint defined previously. The following example defines the filter and filter table. + + ```xml + + + + + + + + + + + ``` + +3. To evaluate incoming messages against the filters contained in the filter table, you must associate the filter table with the service endpoints by using the routing behavior. The following example demonstrates associating "filterTable1" with the service endpoint. + + ```xml + + + + + + + + + ``` + +## Implement Dynamic Configuration + + Dynamic configuration of the Routing Service can only be performed in code by creating a new and using to replace the current configuration. For this example, the Routing Service is self-hosted within a console application. After the application has started, you can modify the routing configuration by entering ‘regular’ or ‘rounding’ at the console window to configure the destination endpoint that messages are routed to; regularCalc when ‘regular’ is entered, otherwise roundingCalc when ‘rounding’ is entered. + +1. The following using statements must be added in order to support the Routing Service. + + ```csharp + using System; + using System.Collections.Generic; + using System.ServiceModel; + using System.ServiceModel.Channels; + using System.ServiceModel.Description; + using System.ServiceModel.Dispatcher; + using System.ServiceModel.Routing; + ``` + +2. The following code is used to self-host the Routing Service as a console application. This initializes the Routing Service using the configuration described in the previous step, which is contained within the application configuration file. The while loop contains the code used to change the routing configuration. + + ```csharp + // Host the service within this EXE console application. + public static void Main() + { + // Create a ServiceHost for the CalculatorService type. + using (ServiceHost serviceHost = + new ServiceHost(typeof(RoutingService))) + { // Open the ServiceHost to create listeners - // and start listening for messages. - Console.WriteLine("The Routing Service configured, opening...."); - serviceHost.Open(); - Console.WriteLine("The Routing Service is now running."); - Console.WriteLine("Type 'quit' to terminate router."); - Console.WriteLine(" to change routing configuration."); - while (Console.ReadLine() != "quit") - { - .... - } - } - } - ``` - -3. To dynamically update the routing configuration, a new routing configuration must be created. This must contain all endpoints, filters and filter tables that are required for the new routing configuration, as it will completely replace the existing routing configuration. In order to use the new routing configuration, you must invoke and pass the new configuration. - - Add the following code to the while loop defined previously to allow the service to be reconfigured based on user input. - - ```csharp - Console.WriteLine("Enter 'regular' or 'rounding' to set the destination endpoint:"); - string destEndpoint = Console.ReadLine(); - // Create a new RoutingConfiguration - RoutingConfiguration rc = new RoutingConfiguration(); - // Determine the endpoint to configure for - switch (destEndpoint) - { - case "regular": - // Define the destination endpoint - ServiceEndpoint regularCalc = new ServiceEndpoint( - ContractDescription.GetContract(typeof(IRequestReplyRouter)), - new NetTcpBinding(), - new EndpointAddress("net.tcp://localhost:9090/servicemodelsamples/service/")); - // Create a MatchAll filter and add to the filter table - rc.FilterTable.Add(new MatchAllMessageFilter(), new List { regularCalc }); - // Use ApplyConfiguration to update the Routing Service - serviceHost.Extensions.Find().ApplyConfiguration(rc); - Console.WriteLine("Applied new routing configuration."); - break; - case "rounding": - // Define the destination endpoint - ServiceEndpoint roundingCalc = new ServiceEndpoint( - ContractDescription.GetContract(typeof(IRequestReplyRouter)), - new NetTcpBinding(), - new EndpointAddress("net.tcp://localhost:8080/servicemodelsamples/service/")); - // Create a MatchAll filter and add to the filter table - rc.FilterTable.Add(new MatchAllMessageFilter(), new List { roundingCalc }); - // Use ApplyConfiguration to update the Routing Service - serviceHost.Extensions.Find().ApplyConfiguration(rc); - Console.WriteLine("Applied new routing configuration."); - break; - default: - Console.WriteLine("Incorrect value entered, no change."); - break; - } - ``` - + // and start listening for messages. + Console.WriteLine("The Routing Service configured, opening...."); + serviceHost.Open(); + Console.WriteLine("The Routing Service is now running."); + Console.WriteLine("Type 'quit' to terminate router."); + Console.WriteLine(" to change routing configuration."); + while (Console.ReadLine() != "quit") + { + .... + } + } + } + ``` + +3. To dynamically update the routing configuration, a new routing configuration must be created. This must contain all endpoints, filters and filter tables that are required for the new routing configuration, as it will completely replace the existing routing configuration. In order to use the new routing configuration, you must invoke and pass the new configuration. + + Add the following code to the while loop defined previously to allow the service to be reconfigured based on user input. + + ```csharp + Console.WriteLine("Enter 'regular' or 'rounding' to set the destination endpoint:"); + string destEndpoint = Console.ReadLine(); + // Create a new RoutingConfiguration + RoutingConfiguration rc = new RoutingConfiguration(); + // Determine the endpoint to configure for + switch (destEndpoint) + { + case "regular": + // Define the destination endpoint + ServiceEndpoint regularCalc = new ServiceEndpoint( + ContractDescription.GetContract(typeof(IRequestReplyRouter)), + new NetTcpBinding(), + new EndpointAddress("net.tcp://localhost:9090/servicemodelsamples/service/")); + // Create a MatchAll filter and add to the filter table + rc.FilterTable.Add(new MatchAllMessageFilter(), new List { regularCalc }); + // Use ApplyConfiguration to update the Routing Service + serviceHost.Extensions.Find().ApplyConfiguration(rc); + Console.WriteLine("Applied new routing configuration."); + break; + case "rounding": + // Define the destination endpoint + ServiceEndpoint roundingCalc = new ServiceEndpoint( + ContractDescription.GetContract(typeof(IRequestReplyRouter)), + new NetTcpBinding(), + new EndpointAddress("net.tcp://localhost:8080/servicemodelsamples/service/")); + // Create a MatchAll filter and add to the filter table + rc.FilterTable.Add(new MatchAllMessageFilter(), new List { roundingCalc }); + // Use ApplyConfiguration to update the Routing Service + serviceHost.Extensions.Find().ApplyConfiguration(rc); + Console.WriteLine("Applied new routing configuration."); + break; + default: + Console.WriteLine("Incorrect value entered, no change."); + break; + } + ``` + > [!NOTE] > Since the method for providing a new RoutingConfiguration is contained in the RoutingExtension service extension, new RoutingConfiguration objects can be provided anywhere in the WCF extensibility model that has or can obtain a reference to the ServiceHost or ServiceExtensions (such as in another ServiceExtension). - -## Example + +## Example 1 The following is a complete listing of the console application used in this example: - + ```csharp -//----------------------------------------------------------------- -// Copyright (c) Microsoft Corporation. All Rights Reserved. -//----------------------------------------------------------------- - -using System; -using System.Collections.Generic; -using System.ServiceModel; -using System.ServiceModel.Channels; -using System.ServiceModel.Description; -using System.ServiceModel.Dispatcher; -using System.ServiceModel.Routing; - -namespace Microsoft.Samples.AdvancedFilters -{ - public class Router - { - // Host the service within this EXE console application. - public static void Main() +//----------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All Rights Reserved. +//----------------------------------------------------------------- + +using System; +using System.Collections.Generic; +using System.ServiceModel; +using System.ServiceModel.Channels; +using System.ServiceModel.Description; +using System.ServiceModel.Dispatcher; +using System.ServiceModel.Routing; + +namespace Microsoft.Samples.AdvancedFilters +{ + public class Router + { + // Host the service within this EXE console application. + public static void Main() { - // Create a ServiceHost for the CalculatorService type. - using (ServiceHost serviceHost = - new ServiceHost(typeof(RoutingService))) - { + // Create a ServiceHost for the CalculatorService type. + using (ServiceHost serviceHost = + new ServiceHost(typeof(RoutingService))) + { // Open the ServiceHost to create listeners - // and start listening for messages. - Console.WriteLine("The Routing Service configured, opening...."); - serviceHost.Open(); - Console.WriteLine("The Routing Service is now running."); - Console.WriteLine("Type 'quit' to terminate router."); - Console.WriteLine(" to change routing configuration."); - while (Console.ReadLine() != "quit") - { - Console.WriteLine("Enter 'regular' or 'rounding' to set the destination endpoint:"); - string destEndpoint = Console.ReadLine(); - // Create a new RoutingConfiguration - RoutingConfiguration rc = new RoutingConfiguration(); - // Determine the endpoint to configure for - switch (destEndpoint) - { - case "regular": - // Define the destination endpoint - ServiceEndpoint regularCalc = new ServiceEndpoint( - ContractDescription.GetContract(typeof(IRequestReplyRouter)), - new NetTcpBinding(), - new EndpointAddress("net.tcp://localhost:9090/servicemodelsamples/service/")); - // Create a MatchAll filter and add to the filter table - rc.FilterTable.Add(new MatchAllMessageFilter(), new List { regularCalc }); - // Use ApplyConfiguration to update the Routing Service - serviceHost.Extensions.Find().ApplyConfiguration(rc); - Console.WriteLine("Applied new routing configuration."); - break; - case "rounding": - // Define the destination endpoint - ServiceEndpoint roundingCalc = new ServiceEndpoint( - ContractDescription.GetContract(typeof(IRequestReplyRouter)), - new NetTcpBinding(), - new EndpointAddress("net.tcp://localhost:8080/servicemodelsamples/service/")); - // Create a MatchAll filter and add to the filter table - rc.FilterTable.Add(new MatchAllMessageFilter(), new List { roundingCalc }); - // Use ApplyConfiguration to update the Routing Service - serviceHost.Extensions.Find().ApplyConfiguration(rc); - Console.WriteLine("Applied new routing configuration."); - break; - default: - Console.WriteLine("Incorrect value entered, no change."); - break; - } - } - } - } - } -} -``` - -## Example + // and start listening for messages. + Console.WriteLine("The Routing Service configured, opening...."); + serviceHost.Open(); + Console.WriteLine("The Routing Service is now running."); + Console.WriteLine("Type 'quit' to terminate router."); + Console.WriteLine(" to change routing configuration."); + while (Console.ReadLine() != "quit") + { + Console.WriteLine("Enter 'regular' or 'rounding' to set the destination endpoint:"); + string destEndpoint = Console.ReadLine(); + // Create a new RoutingConfiguration + RoutingConfiguration rc = new RoutingConfiguration(); + // Determine the endpoint to configure for + switch (destEndpoint) + { + case "regular": + // Define the destination endpoint + ServiceEndpoint regularCalc = new ServiceEndpoint( + ContractDescription.GetContract(typeof(IRequestReplyRouter)), + new NetTcpBinding(), + new EndpointAddress("net.tcp://localhost:9090/servicemodelsamples/service/")); + // Create a MatchAll filter and add to the filter table + rc.FilterTable.Add(new MatchAllMessageFilter(), new List { regularCalc }); + // Use ApplyConfiguration to update the Routing Service + serviceHost.Extensions.Find().ApplyConfiguration(rc); + Console.WriteLine("Applied new routing configuration."); + break; + case "rounding": + // Define the destination endpoint + ServiceEndpoint roundingCalc = new ServiceEndpoint( + ContractDescription.GetContract(typeof(IRequestReplyRouter)), + new NetTcpBinding(), + new EndpointAddress("net.tcp://localhost:8080/servicemodelsamples/service/")); + // Create a MatchAll filter and add to the filter table + rc.FilterTable.Add(new MatchAllMessageFilter(), new List { roundingCalc }); + // Use ApplyConfiguration to update the Routing Service + serviceHost.Extensions.Find().ApplyConfiguration(rc); + Console.WriteLine("Applied new routing configuration."); + break; + default: + Console.WriteLine("Incorrect value entered, no change."); + break; + } + } + } + } + } +} +``` + +## Example 2 The following is a complete listing of the configuration file used in this example: - -```xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -``` - + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + ## See also - [Routing Services](../samples/routing-services.md) diff --git a/docs/framework/wcf/feature-details/how-to-service-versioning.md b/docs/framework/wcf/feature-details/how-to-service-versioning.md index 827b6ff743ee1..911049a571bd3 100644 --- a/docs/framework/wcf/feature-details/how-to-service-versioning.md +++ b/docs/framework/wcf/feature-details/how-to-service-versioning.md @@ -4,324 +4,322 @@ title: "How To: Service Versioning" ms.date: "03/30/2017" ms.assetid: 4287b6b3-b207-41cf-aebe-3b1d4363b098 --- + # How To: Service Versioning -This topic outlines the basic steps required to create a routing configuration that routes messages to different versions of the same service. In this example, messages are routed to two different versions of a calculator service, `roundingCalc` (v1) and `regularCalc` (v2). Both implementations support the same operations; however the older service, `roundingCalc`, rounds all calculations to the nearest integer value before returning. A client application must be able to indicate whether to use the newer `regularCalc` service. - +This topic outlines the basic steps required to create a routing configuration that routes messages to different versions of the same service. In this example, messages are routed to two different versions of a calculator service, `roundingCalc` (v1) and `regularCalc` (v2). Both implementations support the same operations; however the older service, `roundingCalc`, rounds all calculations to the nearest integer value before returning. A client application must be able to indicate whether to use the newer `regularCalc` service. + > [!WARNING] -> In order to route a message to a specific service version, the Routing Service must be able to determine the message destination based on the message content. In the method demonstrated below, the client will specify the version by inserting information into a message header. There are methods of service versioning that do not require clients to pass additional data. For example, a message could be routed to the most recent or most compatible version of a service or the router could use a part of the standard SOAP envelope. - - The operations exposed by both services are: - -- Add - -- Subtract - -- Multiply - -- Divide - - Because both service implementations handle the same operations, and are essentially identical other than the data that they return, the base data contained in messages sent from client applications is not unique enough to allow you to determine how to route the request. For example, Action filters cannot be used because the default actions for both services are the same. - - This can be resolved in several ways, such as exposing a specific endpoint on the router for each version of the service or adding a custom header element to the message to indicate service version. Each of these approaches allows you to uniquely route incoming messages to a specific version of the service, but utilizing unique message content is the preferred method of differentiating between requests for different service versions. - - In this example, the client application adds the ‘CalcVer’ custom header to the request message. This header will contain a value that indicates the version of the service that the message should be routed to. A value of ‘1’ indicates that the message must be processed by the roundingCalc service, while a value of ‘2’ indicates the regularCalc service. This allows the client application to directly control which version of the service will process the message. Since the custom header is a value contained within the message, you can use one endpoint to receive messages destined for both versions of the service. The following code can be used in the client application to add this custom header to the message: - -```csharp -messageHeadersElement.Add(MessageHeader.CreateHeader("CalcVer", "http://my.custom.namespace/", "2")); -``` - -### Implement Service Versioning - -1. Create the basic Routing Service configuration by specifying the service endpoint exposed by the service. The following example defines a single service endpoint, which will be used to receive messages. It also defines the client endpoints which will be used to send messages to the `roundingCalc` (v1) and the `regularCalc` (v2) services. - - ```xml - - - - - - - - - - - - - - - - - - ``` - -2. Define the filters used to route messages to the destination endpoints. For this example, the XPath filter is used to detect the value of the "CalcVer" custom header to determine which version the message should be routed to. An XPath filter is also used to detect messages that do not contain the "CalcVer" header. The following example defines the required filters and namespace table. - - ```xml - - - - - - - - - - - - +> In order to route a message to a specific service version, the Routing Service must be able to determine the message destination based on the message content. In the method demonstrated below, the client will specify the version by inserting information into a message header. There are methods of service versioning that do not require clients to pass additional data. For example, a message could be routed to the most recent or most compatible version of a service or the router could use a part of the standard SOAP envelope. + +The operations exposed by both services are: + +- Add +- Subtract +- Multiply +- Divide + +Because both service implementations handle the same operations, and are essentially identical other than the data that they return, the base data contained in messages sent from client applications is not unique enough to allow you to determine how to route the request. For example, Action filters cannot be used because the default actions for both services are the same. + +This can be resolved in several ways, such as exposing a specific endpoint on the router for each version of the service or adding a custom header element to the message to indicate service version. Each of these approaches allows you to uniquely route incoming messages to a specific version of the service, but utilizing unique message content is the preferred method of differentiating between requests for different service versions. + +In this example, the client application adds the ‘CalcVer’ custom header to the request message. This header will contain a value that indicates the version of the service that the message should be routed to. A value of ‘1’ indicates that the message must be processed by the roundingCalc service, while a value of ‘2’ indicates the regularCalc service. This allows the client application to directly control which version of the service will process the message. Since the custom header is a value contained within the message, you can use one endpoint to receive messages destined for both versions of the service. The following code can be used in the client application to add this custom header to the message: + +```csharp +messageHeadersElement.Add(MessageHeader.CreateHeader("CalcVer", "http://my.custom.namespace/", "2")); +``` + +### Implement Service Versioning + +1. Create the basic Routing Service configuration by specifying the service endpoint exposed by the service. The following example defines a single service endpoint, which will be used to receive messages. It also defines the client endpoints which will be used to send messages to the `roundingCalc` (v1) and the `regularCalc` (v2) services. + + ```xml + + + + + + + + + + + + + + + + + + ``` + +2. Define the filters used to route messages to the destination endpoints. For this example, the XPath filter is used to detect the value of the "CalcVer" custom header to determine which version the message should be routed to. An XPath filter is also used to detect messages that do not contain the "CalcVer" header. The following example defines the required filters and namespace table. + + ```xml + + + + + + + + + + + + - ``` - + ``` + > [!NOTE] > The s12 namespace prefix is defined by default in the namespace table, and represents the namespace `http://www.w3.org/2003/05/soap-envelope`. - -3. Define the filter table, which associates each filter with a client endpoint. If the message contains the "CalcVer" header with a value of 1, it will be sent to the regularCalc service. If the header contains a value of 2, it will be sent to the roundingCalc service. If no header is present, the message will be routed to the regularCalc. - - The following defines the filter table and adds the filters defined earlier. - - ```xml - - - - - - - - - - - - ``` - -4. To evaluate incoming messages against the filters contained in the filter table, you must associate the filter table with the service endpoints by using the routing behavior. The following example demonstrates associating `filterTable1` with the service endpoints: - - ```xml - - - - - - - - - ``` - -## Example - - The following is a complete listing of the configuration file. - -```xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -``` - -## Example - - The following is a complete listing of the client application. - -```csharp -using System; -using System.ServiceModel; -using System.ServiceModel.Channels; - -namespace Microsoft.Samples.AdvancedFilters -{ - //The service contract is defined in generatedClient.cs, generated from the service by the svcutil tool. - - //Client implementation code. - class Client - { - static void Main() - { - //Print out the welcome text - Console.WriteLine("This sample routes the Calculator Sample through the new WCF RoutingService"); - Console.WriteLine("Wait for all the services to indicate that they've started, then press"); - Console.WriteLine(" to start the client."); - - while (Console.ReadLine() != "quit") - { - //Offer the Address configuration for the client - Console.WriteLine(""); - Console.WriteLine("Welcome to the Calculator Client!"); - - EndpointAddress epa; - //set the default address as the general router endpoint - epa = new EndpointAddress("http://localhost/routingservice/router/calculator"); - - //set up the CalculatorClient with the EndpointAddress, the WSHttpBinding, and the ICalculator contract - //We use the WSHttpBinding so that the outgoing has a message envelope, which we'll manipulate in a minute - CalculatorClient client = new CalculatorClient(new WSHttpBinding(), epa); - //client.Endpoint.Contract = ContractDescription.GetContract(typeof(ICalculator)); - - //Ask the customer if they want to add a custom header to the outgoing message. - //The Router will look for this header, and if so ignore the endpoint the message was - //received on, and instead direct the message to the RoundingCalcService. - Console.WriteLine(""); - Console.WriteLine("Which calculator service should be used?"); - Console.WriteLine("Enter 1 for the rounding calculator, 2 for the regular calculator."); - Console.WriteLine("[1] or [2]?"); - - string header = Console.ReadLine(); - - //get the current operationContextScope from the client's inner channel - using (OperationContextScope ocs = new OperationContextScope((client.InnerChannel))) - { - //get the outgoing message headers element (collection) from the context - MessageHeaders messageHeadersElement = OperationContext.Current.OutgoingMessageHeaders; - - //if they wanted to create the header, go ahead and add it to the outgoing message - if (header != null && (header=="1" || header=="2")) - { + +3. Define the filter table, which associates each filter with a client endpoint. If the message contains the "CalcVer" header with a value of 1, it will be sent to the regularCalc service. If the header contains a value of 2, it will be sent to the roundingCalc service. If no header is present, the message will be routed to the regularCalc. + + The following defines the filter table and adds the filters defined earlier. + + ```xml + + + + + + + + + + + + ``` + +4. To evaluate incoming messages against the filters contained in the filter table, you must associate the filter table with the service endpoints by using the routing behavior. The following example demonstrates associating `filterTable1` with the service endpoints: + + ```xml + + + + + + + + + ``` + +## Example 1 + +The following is a complete listing of the configuration file. + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +## Example 2 + +The following is a complete listing of the client application. + +```csharp +using System; +using System.ServiceModel; +using System.ServiceModel.Channels; + +namespace Microsoft.Samples.AdvancedFilters +{ + //The service contract is defined in generatedClient.cs, generated from the service by the svcutil tool. + + //Client implementation code. + class Client + { + static void Main() + { + //Print out the welcome text + Console.WriteLine("This sample routes the Calculator Sample through the new WCF RoutingService"); + Console.WriteLine("Wait for all the services to indicate that they've started, then press"); + Console.WriteLine(" to start the client."); + + while (Console.ReadLine() != "quit") + { + //Offer the Address configuration for the client + Console.WriteLine(""); + Console.WriteLine("Welcome to the Calculator Client!"); + + EndpointAddress epa; + //set the default address as the general router endpoint + epa = new EndpointAddress("http://localhost/routingservice/router/calculator"); + + //Set up the CalculatorClient with the EndpointAddress, the WSHttpBinding, and the ICalculator contract. + //We use the WSHttpBinding so that the outgoing has a message envelope. + CalculatorClient client = new CalculatorClient(new WSHttpBinding(), epa); + //client.Endpoint.Contract = ContractDescription.GetContract(typeof(ICalculator)); + + //Ask the customer if they want to add a custom header to the outgoing message. + //The Router will look for this header, and if so ignore the endpoint the message was + //received on, and instead direct the message to the RoundingCalcService. + Console.WriteLine(""); + Console.WriteLine("Which calculator service should be used?"); + Console.WriteLine("Enter 1 for the rounding calculator, 2 for the regular calculator."); + Console.WriteLine("[1] or [2]?"); + + string header = Console.ReadLine(); + + //get the current operationContextScope from the client's inner channel + using (OperationContextScope ocs = new OperationContextScope((client.InnerChannel))) + { + //get the outgoing message headers element (collection) from the context + MessageHeaders messageHeadersElement = OperationContext.Current.OutgoingMessageHeaders; + + //if they wanted to create the header, go ahead and add it to the outgoing message + if (header != null && (header=="1" || header=="2")) + { //create a new header "RoundingCalculator", no specific namespace, and set the value to - //the value of header. - //the Routing Service will look for this header in order to determine if the message - //should be routed to the RoundingCalculator - messageHeadersElement.Add(MessageHeader.CreateHeader("CalcVer", "http://my.custom.namespace/", header)); - } - else //incorrect choice, no header added - { - Console.WriteLine("Incorrect value entered, not adding a header"); - } - - //call the client operations - CallClient(client); - } - - //close the client to clean it up - client.Close(); - Console.WriteLine(); - Console.WriteLine("Press to run the client again or type 'quit' to quit."); - } - } - - private static void CallClient(CalculatorClient client) - { - Console.WriteLine(""); - Console.WriteLine("Sending!"); - // Call the Add service operation. - double value1 = 100.00D; - double value2 = 15.99D; - double result = client.Add(value1, value2); - Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result); - - // Call the Subtract service operation. - value1 = 145.00D; - value2 = 76.54D; - result = client.Subtract(value1, value2); - Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result); - - // Call the Multiply service operation. - value1 = 9.00D; - value2 = 81.25D; - result = client.Multiply(value1, value2); - Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result); - - // Call the Divide service operation. - value1 = 22.00D; - value2 = 7.00D; - result = client.Divide(value1, value2); - Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result); - - } - } -} -``` - + //the value of header. + //the Routing Service will look for this header in order to determine if the message + //should be routed to the RoundingCalculator + messageHeadersElement.Add(MessageHeader.CreateHeader("CalcVer", "http://my.custom.namespace/", header)); + } + else //incorrect choice, no header added + { + Console.WriteLine("Incorrect value entered, not adding a header"); + } + + //call the client operations + CallClient(client); + } + + //close the client to clean it up + client.Close(); + Console.WriteLine(); + Console.WriteLine("Press to run the client again or type 'quit' to quit."); + } + } + + private static void CallClient(CalculatorClient client) + { + Console.WriteLine(""); + Console.WriteLine("Sending!"); + // Call the Add service operation. + double value1 = 100.00D; + double value2 = 15.99D; + double result = client.Add(value1, value2); + Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result); + + // Call the Subtract service operation. + value1 = 145.00D; + value2 = 76.54D; + result = client.Subtract(value1, value2); + Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result); + + // Call the Multiply service operation. + value1 = 9.00D; + value2 = 81.25D; + result = client.Multiply(value1, value2); + Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result); + + // Call the Divide service operation. + value1 = 22.00D; + value2 = 7.00D; + result = client.Divide(value1, value2); + Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result); + + } + } +} +``` + ## See also - [Routing Services](../samples/routing-services.md) diff --git a/docs/framework/wcf/feature-details/troubleshooting-correlation.md b/docs/framework/wcf/feature-details/troubleshooting-correlation.md index 717747c4d3d7c..f93306fd5501c 100644 --- a/docs/framework/wcf/feature-details/troubleshooting-correlation.md +++ b/docs/framework/wcf/feature-details/troubleshooting-correlation.md @@ -66,7 +66,7 @@ class CustomFactory : WorkflowServiceHostFactory ## Use Tracking to Monitor the Progress of the Workflow - Tracking provides a way to monitor the progress of a workflow. By default, tracking records are emitted for workflow life-cycle events, activity life-cycle events, fault propagation, and bookmark resumption. Additionally, custom tracking records can be emitted by custom activities. When troubleshooting correlation, the activity tracking records, the bookmark resumption records, and the fault propagation records are the most useful. The activity tracking records can be used to determine the current progress of the workflow and can help identify which messaging activity is currently waiting for messages. Bookmark resumption records are useful because they indicate that a message was received by the workflow, and fault propagation records provide a record of any faults in the workflow. To enable tracking, specify the desired in the of the . In the following example, the `ConsoleTrackingParticipant` (from the [Custom Tracking](../../windows-workflow-foundation/samples/custom-tracking.md) sample) is configured by using the default tracking profile. + Tracking provides a way to monitor the progress of a workflow. By default, tracking records are emitted for workflow life-cycle events, activity life-cycle events, fault propagation, and bookmark resumption. Additionally, custom tracking records can be emitted by custom activities. When troubleshooting correlation, the activity tracking records, the bookmark resumption records, and the fault propagation records are the most useful. The activity tracking records can be used to determine the current progress of the workflow and can help identify which messaging activity is currently waiting for messages. Bookmark resumption records are useful because they indicate that a message was received by the workflow, and fault propagation records provide a record of any faults in the workflow. To enable tracking, specify the desired in the of the . In the following example, the `ConsoleTrackingParticipant` (from the [Custom Tracking](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/custom-tracking) sample) is configured by using the default tracking profile. ```csharp host.WorkflowExtensions.Add(new ConsoleTrackingParticipant()); @@ -74,7 +74,7 @@ host.WorkflowExtensions.Add(new ConsoleTrackingParticipant()); A tracking participant such as the ConsoleTrackingParticipant is useful for self-hosted workflow services that have a console window. For a Web-hosted service, a tracking participant that logs the tracking information to a durable store should be used, such as the built-in , or a custom tracking participant that logs the information to a file. - For more information about tracking and configuring tracking for a Web-hosted workflow service, see [Workflow Tracking and Tracing](../../windows-workflow-foundation/workflow-tracking-and-tracing.md), [Configuring Tracking for a Workflow](../../windows-workflow-foundation/configuring-tracking-for-a-workflow.md), and the [Tracking [WF Samples]](../../windows-workflow-foundation/samples/tracking.md) samples. + For more information about tracking and configuring tracking for a Web-hosted workflow service, see [Workflow Tracking and Tracing](../../windows-workflow-foundation/workflow-tracking-and-tracing.md), [Configuring Tracking for a Workflow](../../windows-workflow-foundation/configuring-tracking-for-a-workflow.md), and the [Tracking [WF Samples]](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/tracking) samples. ## Use WCF Tracing diff --git a/docs/framework/wcf/feature-details/workflow-service-host-extensibility.md b/docs/framework/wcf/feature-details/workflow-service-host-extensibility.md index a18cf65346f90..7e6746b16ca4e 100644 --- a/docs/framework/wcf/feature-details/workflow-service-host-extensibility.md +++ b/docs/framework/wcf/feature-details/workflow-service-host-extensibility.md @@ -46,7 +46,7 @@ host.Description.Behaviors.Add(new WorkflowUnhandledExceptionBehavior { Action = ## Hosting Non-Service Workflows - can be used to host non-service workflows, or workflows that either do not begin with a activity or workflows that do not use the messaging activities. Workflow services normally begin with a activity. When the receives a message for a workflow service, if it is not already running (or persisted) a new workflow service instance is created. If a workflow does not begin with a Receive activity, it cannot be started by sending a message because there is no activity to receive the message. To host a non-service workflow, derive a class from and override , , and . Override if you want to provide a preferred instance ID. Override to create a custom workflow creation context or populate an instance of the existing . Override to manually extract the bookmark from the incoming message. If you override this method, you must invoke in its body so as to respond to the message sent to the WorkflowHostingEndpoint. If you do not do so, a limit may be eventually exceeded. In two-way contracts, you may be able to detect your failure to invoke because of the client’s failure to receive a response. In one-way contracts, you may not recognize the mistake of failing to call until it’s too late, after the throttle limit is exceeded. For more information, please see the [WorkflowHostingEndpoint Resume Bookmark](../../windows-workflow-foundation/samples/workflowhostingendpoint-resume-bookmark.md)To create a new instance of a non-service workflow, declare a service contract that defines an operation that creates a new instance. The creation operation should take an IDictionary\ to pass any required workflow parameters. This contract is implicitly implemented by the -derived class. When hosting the workflow, add an instance of the -derived class to the host by calling and call . To create an instance of the workflow, create a of your service contract type and call . You can then call the create operation defined in your service contract. + can be used to host non-service workflows, or workflows that either do not begin with a activity or workflows that do not use the messaging activities. Workflow services normally begin with a activity. When the receives a message for a workflow service, if it is not already running (or persisted) a new workflow service instance is created. If a workflow does not begin with a Receive activity, it cannot be started by sending a message because there is no activity to receive the message. To host a non-service workflow, derive a class from and override , , and . Override if you want to provide a preferred instance ID. Override to create a custom workflow creation context or populate an instance of the existing . Override to manually extract the bookmark from the incoming message. If you override this method, you must invoke in its body so as to respond to the message sent to the WorkflowHostingEndpoint. If you do not do so, a limit may be eventually exceeded. In two-way contracts, you may be able to detect your failure to invoke because of the client’s failure to receive a response. In one-way contracts, you may not recognize the mistake of failing to call until it’s too late, after the throttle limit is exceeded. For more information, please see the [WorkflowHostingEndpoint Resume Bookmark](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/workflowhostingendpoint-resume-bookmark)To create a new instance of a non-service workflow, declare a service contract that defines an operation that creates a new instance. The creation operation should take an IDictionary\ to pass any required workflow parameters. This contract is implicitly implemented by the -derived class. When hosting the workflow, add an instance of the -derived class to the host by calling and call . To create an instance of the workflow, create a of your service contract type and call . You can then call the create operation defined in your service contract. ## See also diff --git a/docs/framework/wcf/samples/index.md b/docs/framework/wcf/samples/index.md index 7597f497801c2..b50079f900922 100644 --- a/docs/framework/wcf/samples/index.md +++ b/docs/framework/wcf/samples/index.md @@ -11,7 +11,7 @@ You can download [Windows Communication Foundation (WCF) samples for .NET Framew > [!TIP] > The articles in this section describe some of the samples in the download package. For a complete documentation set that covers all of the samples, check the [.NET Framework 4 documentation for WCF samples](/previous-versions/dotnet/netframework-4.0/dd483346(v=vs.100)). -The Windows Workflow Foundation (WF) [application](../../windows-workflow-foundation/samples/application.md) samples also demonstrate several WCF features. +The Windows Workflow Foundation (WF) [application](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/application) samples also demonstrate several WCF features. ## In this section diff --git a/docs/framework/windows-workflow-foundation/authoring-workflows-activities-and-expressions-using-imperative-code.md b/docs/framework/windows-workflow-foundation/authoring-workflows-activities-and-expressions-using-imperative-code.md index 6b2d7da54f451..928c9b87f8f9a 100644 --- a/docs/framework/windows-workflow-foundation/authoring-workflows-activities-and-expressions-using-imperative-code.md +++ b/docs/framework/windows-workflow-foundation/authoring-workflows-activities-and-expressions-using-imperative-code.md @@ -145,7 +145,7 @@ new InvokeMethod Dynamic activities are one way to define an activity that contains arguments using code, but activities can also be created in code and compiled into types. Simple activities can be created that derive from , and asynchronous activities that derive from . These activities can have arguments, return values, and define their logic using imperative code. For examples of creating these types of activities, see [CodeActivity Base Class](workflow-activity-authoring-using-the-codeactivity-class.md) and [Creating Asynchronous Activities](creating-asynchronous-activities-in-wf.md). - Activities that derive from can define their logic using imperative code and they can also contain child activities that define the logic. They also have full access to the features of the runtime such as creating bookmarks. For examples of creating a -based activity, see [NativeActivity Base Class](nativeactivity-base-class.md), [How to: Create an Activity](how-to-create-an-activity.md), and the [Custom Composite using Native Activity](./samples/custom-composite-using-native-activity.md) sample. + Activities that derive from can define their logic using imperative code and they can also contain child activities that define the logic. They also have full access to the features of the runtime such as creating bookmarks. For examples of creating a -based activity, see [NativeActivity Base Class](nativeactivity-base-class.md), [How to: Create an Activity](how-to-create-an-activity.md), and the [Custom Composite using Native Activity](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/custom-composite-using-native-activity) sample. Activities that derive from define their logic solely through the use of child activities. These activities are typically created by using the workflow designer, but can also be defined by using code. In the following example, a `Square` activity is defined that derives from `Activity`. The `Square` activity has a single named `Value`, and defines its logic by specifying a activity using the property. The activity contains a activity and an activity. Together, these three activities implement the logic of the `Square` activity. diff --git a/docs/framework/windows-workflow-foundation/configuring-tracking-for-a-workflow.md b/docs/framework/windows-workflow-foundation/configuring-tracking-for-a-workflow.md index c63c33dfd833a..e6e7e0d18ff20 100644 --- a/docs/framework/windows-workflow-foundation/configuring-tracking-for-a-workflow.md +++ b/docs/framework/windows-workflow-foundation/configuring-tracking-for-a-workflow.md @@ -63,7 +63,7 @@ For a workflow service hosted in , Alternatively, for a workflow service hosted in , you can add the behavior extension through code. To add a custom tracking participant, create a new behavior extension and add it to the as shown in the following example code. > [!NOTE] -> If you want to view sample code that shows how to create a custom behavior element that adds a custom tracking participant, refer to the [Tracking](./samples/tracking.md) samples. +> If you want to view sample code that shows how to create a custom behavior element that adds a custom tracking participant, refer to the [Tracking](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/tracking) samples. ```csharp ServiceHost svcHost = new ServiceHost(typeof(WorkflowService), new @@ -134,7 +134,7 @@ if (null != workflowServiceHost) ### Configuring tracking using WorkflowInvoker -To configure tracking for a workflow executed using , add the tracking provider as an extension to a instance. The following code example is from the [Custom Tracking](./samples/custom-tracking.md) sample. +To configure tracking for a workflow executed using , add the tracking provider as an extension to a instance. The following code example is from the [Custom Tracking](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/custom-tracking) sample. ```csharp WorkflowInvoker invoker = new WorkflowInvoker(BuildSampleWorkflow()); diff --git a/docs/framework/windows-workflow-foundation/creating-custom-flow-control-activities.md b/docs/framework/windows-workflow-foundation/creating-custom-flow-control-activities.md index 85569cafddc96..2910cdbb6eefe 100644 --- a/docs/framework/windows-workflow-foundation/creating-custom-flow-control-activities.md +++ b/docs/framework/windows-workflow-foundation/creating-custom-flow-control-activities.md @@ -6,7 +6,7 @@ ms.assetid: 27f409f6-2d1d-4cfb-9765-93eb2ad667d5 --- # Creating custom flow control activities -The .NET Framework contains a variety of flow-control activities that function similarly to abstract programming structures (such as ) or to standard programming statements (such as ). This topic discusses the architecture of one of the sample projects, [Non-Generic ForEach](./samples/non-generic-foreach.md). +The .NET Framework contains a variety of flow-control activities that function similarly to abstract programming structures (such as ) or to standard programming statements (such as ). This topic discusses the architecture of one of the sample projects, [Non-Generic ForEach](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/non-generic-foreach). ## Creating the custom class diff --git a/docs/framework/windows-workflow-foundation/customizing-the-workflow-design-experience.md b/docs/framework/windows-workflow-foundation/customizing-the-workflow-design-experience.md index 8a4e045390404..7eefe22ef5dbb 100644 --- a/docs/framework/windows-workflow-foundation/customizing-the-workflow-design-experience.md +++ b/docs/framework/windows-workflow-foundation/customizing-the-workflow-design-experience.md @@ -31,6 +31,6 @@ The scenarios for designing custom activities and for rehosting the Windows Work ## See also - [Extending Windows Workflow Foundation](extend.md) -- [Designer](./samples/designer.md) -- [Custom Activity Designers](./samples/custom-activity-designers.md) -- [Designer ReHosting](./samples/designer-rehosting.md) +- [Designer](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/designer) +- [Custom Activity Designers](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/custom-activity-designers) +- [Designer ReHosting](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/designer-rehosting) diff --git a/docs/framework/windows-workflow-foundation/feature-specifics.md b/docs/framework/windows-workflow-foundation/feature-specifics.md index 7eb39f812b514..1273350bcbf9a 100644 --- a/docs/framework/windows-workflow-foundation/feature-specifics.md +++ b/docs/framework/windows-workflow-foundation/feature-specifics.md @@ -39,9 +39,9 @@ The is the out-of-box workflow ho - Samples for the can be found in the following sections: - - [Execution](./samples/execution.md) + - [Execution](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/execution) - - Application: [Suspended Instance Management](./samples/suspended-instance-management.md) + - Application: [Suspended Instance Management](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/suspended-instance-management) - [Hosting Workflow services overview](../wcf/feature-details/hosting-workflow-services-overview.md) @@ -159,9 +159,9 @@ Flowchart is a well-known paradigm to visually represent domain problems. It is - Samples: - - [Fault Handling in a Flowchart Activity Using TryCatch](./samples/fault-handling-in-a-flowchart-activity-using-trycatch.md) + - [Fault Handling in a Flowchart Activity Using TryCatch](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/fault-handling-in-a-flowchart-activity-using-trycatch) - - [Hiring Process](./samples/hiring-process.md) + - [Hiring Process](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/hiring-process) - Designer Documentation: @@ -193,9 +193,9 @@ Procedural activities provide a mechanism to model sequential control flow using - Samples: - - [Hiring Process](./samples/hiring-process.md) + - [Hiring Process](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/hiring-process) - - [Corporate Purchase Process](./samples/corporate-purchase-process.md) + - [Corporate Purchase Process](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/corporate-purchase-process) - Designer Documentation: @@ -233,7 +233,7 @@ The activity provides a mechanism f - In Visual Studio 2012, create a workflow console application. Add a activity in the workflow designer. -- Sample: [Fault Handling in a Flowchart Activity Using TryCatch](./samples/fault-handling-in-a-flowchart-activity-using-trycatch.md) +- Sample: [Fault Handling in a Flowchart Activity Using TryCatch](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/fault-handling-in-a-flowchart-activity-using-trycatch) - Designer Documentation: [Error Handling Activity Designers](/visualstudio/workflow-designer/error-handling-activity-designers) @@ -249,7 +249,7 @@ The Activity provides event-based contr - In Visual Studio 2012, create a workflow console application. Add a activity in the workflow designer. -- Sample: [Using the Pick Activity](./samples/using-the-pick-activity.md) +- Sample: [Using the Pick Activity](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/using-the-pick-activity) - Designer documentation: [Pick Activity Designer](/visualstudio/workflow-designer/pick-activity-designer) @@ -339,7 +339,7 @@ Workflow tracking provides insight into the execution of a workflow instance. Th 4. Observe the workflow tracking events in event viewer. -3. Samples: [Tracking](./samples/tracking.md) +3. Samples: [Tracking](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/tracking) 4. Conceptual documentation: [Workflow Tracking and Tracing](workflow-tracking-and-tracing.md) diff --git a/docs/framework/windows-workflow-foundation/guide-to-the-documentation.md b/docs/framework/windows-workflow-foundation/guide-to-the-documentation.md index d64adf1380582..1bb023726165e 100644 --- a/docs/framework/windows-workflow-foundation/guide-to-the-documentation.md +++ b/docs/framework/windows-workflow-foundation/guide-to-the-documentation.md @@ -13,7 +13,7 @@ This topic contains information about how to use the Windows Workflow Foundation ## New to Windows Workflow Foundation Programming -- If you are new to programming with Windows Workflow Foundation and you just want to see some sample applications that work, see the topics listed under [Windows Workflow Samples](./samples/index.md). +- If you are new to programming with Windows Workflow Foundation and you just want to see some sample applications that work, see the topics listed under [Windows Workflow Samples](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/index). - For a discussion of the various Windows Workflow Foundation flow-control models, see [Designing Workflows](designing-workflows.md). diff --git a/docs/framework/windows-workflow-foundation/how-to-create-a-custom-activity-designer.md b/docs/framework/windows-workflow-foundation/how-to-create-a-custom-activity-designer.md index 5dcdec8e5a2bc..6bf5cc25f514a 100644 --- a/docs/framework/windows-workflow-foundation/how-to-create-a-custom-activity-designer.md +++ b/docs/framework/windows-workflow-foundation/how-to-create-a-custom-activity-designer.md @@ -17,9 +17,9 @@ The other key part of the story that needs highlighting in the implementation of This topic outlines two procedures. -1. The first procedure describes how to create a custom activity designer with a that provides the drop zone that receives other activities. This procedure is based on the [Custom Composite Designers - Workflow Item Presenter](./samples/custom-composite-designers-workflow-item-presenter.md) sample. +1. The first procedure describes how to create a custom activity designer with a that provides the drop zone that receives other activities. This procedure is based on the [Custom Composite Designers - Workflow Item Presenter](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/custom-composite-designers-workflow-item-presenter) sample. -2. The second procedure describes how to create a custom activity designer with a that provides the functionality needed to edit of a collection of contained elements. This procedure is based on the [Custom Composite Designers - Workflow Items Presenter](./samples/custom-composite-designers-workflow-items-presenter.md) sample. +2. The second procedure describes how to create a custom activity designer with a that provides the functionality needed to edit of a collection of contained elements. This procedure is based on the [Custom Composite Designers - Workflow Items Presenter](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/custom-composite-designers-workflow-items-presenter) sample. ## To create a custom activity designer with a drop zone using WorkflowItemPresenter diff --git a/docs/framework/windows-workflow-foundation/how-to-create-a-custom-instance-store.md b/docs/framework/windows-workflow-foundation/how-to-create-a-custom-instance-store.md index 873cf2fb4d90e..483cbac86c847 100644 --- a/docs/framework/windows-workflow-foundation/how-to-create-a-custom-instance-store.md +++ b/docs/framework/windows-workflow-foundation/how-to-create-a-custom-instance-store.md @@ -7,7 +7,7 @@ ms.assetid: 593c4e9d-8a49-4e12-8257-cee5e6b4c075 # How to: Create a Custom Instance Store -[!INCLUDE[netfx_current_long](../../../includes/netfx-current-long-md.md)] contains , an instance store that uses SQL Server to persist workflow data. If your application is required to persist workflow data to another medium, such as a different database or a file system, you can implement a custom instance store. A custom instance store is created by extending the abstract class and implementing the methods that are required for the implementation. For a complete implementation of a custom instance store, see the [Corporate Purchase Process](./samples/corporate-purchase-process.md) sample. +[!INCLUDE[netfx_current_long](../../../includes/netfx-current-long-md.md)] contains , an instance store that uses SQL Server to persist workflow data. If your application is required to persist workflow data to another medium, such as a different database or a file system, you can implement a custom instance store. A custom instance store is created by extending the abstract class and implementing the methods that are required for the implementation. For a complete implementation of a custom instance store, see the [Corporate Purchase Process](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/corporate-purchase-process) sample. ## Implementing the BeginTryCommand method @@ -226,7 +226,7 @@ To implement a custom instance store, assign an instance of the instance store t ## A sample instance store -The following code sample is a complete instance store implementation, taken from the [Corporate Purchase Process](./samples/corporate-purchase-process.md) sample. This instance store persists workflow data to a file using XML. +The following code sample is a complete instance store implementation, taken from the [Corporate Purchase Process](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/corporate-purchase-process) sample. This instance store persists workflow data to a file using XML. ```csharp using System; diff --git a/docs/framework/windows-workflow-foundation/how-to-create-an-activity.md b/docs/framework/windows-workflow-foundation/how-to-create-an-activity.md index 76bf63f0ed8e8..2f0bfbdf63686 100644 --- a/docs/framework/windows-workflow-foundation/how-to-create-an-activity.md +++ b/docs/framework/windows-workflow-foundation/how-to-create-an-activity.md @@ -101,4 +101,4 @@ For instructions on how to create a workflow by using these activities, see the - [Designing and Implementing Custom Activities](designing-and-implementing-custom-activities.md) - [Getting Started Tutorial](getting-started-tutorial.md) - [How to: Create a Workflow](how-to-create-a-workflow.md) -- [Using the ExpressionTextBox in a Custom Activity Designer](./samples/using-the-expressiontextbox-in-a-custom-activity-designer.md) +- [Using the ExpressionTextBox in a Custom Activity Designer](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/using-the-expressiontextbox-in-a-custom-activity-designer) diff --git a/docs/framework/windows-workflow-foundation/index.md b/docs/framework/windows-workflow-foundation/index.md index a10de0b15845a..14616392486cb 100644 --- a/docs/framework/windows-workflow-foundation/index.md +++ b/docs/framework/windows-workflow-foundation/index.md @@ -40,5 +40,5 @@ This section describes the programming model, samples, and tools of the Windows [Windows Workflow Foundation Glossary for .NET Framework 4.5](glossary.md) Defines a list of terms that are specific to WF. - [Windows Workflow Samples](./samples/index.md) + [Windows Workflow Samples](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/index) Contains sample applications that demonstrate WF features and scenarios. diff --git a/docs/framework/windows-workflow-foundation/modeling-cancellation-behavior-in-workflows.md b/docs/framework/windows-workflow-foundation/modeling-cancellation-behavior-in-workflows.md index a373eebdc212e..cae5656348260 100644 --- a/docs/framework/windows-workflow-foundation/modeling-cancellation-behavior-in-workflows.md +++ b/docs/framework/windows-workflow-foundation/modeling-cancellation-behavior-in-workflows.md @@ -83,7 +83,7 @@ Activities can be canceled inside a workflow, for example by a derived activities can override the method to provide custom cancellation logic. If this method is not overridden, then the default workflow cancellation logic is applied. Default cancellation is the process that occurs for a that does not override the method or whose method calls the base method. When an activity is canceled, the runtime flags the activity for cancellation and automatically handles certain cleanup. If the activity only has outstanding bookmarks, the bookmarks will be removed and the activity will be marked as . Any outstanding child activities of the canceled activity will in turn be canceled. Any attempt to schedule additional child activities will result in the attempt being ignored and the activity will be marked as . If any outstanding child activity completes in the or state, then the activity will be marked as . Note that a cancellation request can be ignored. If an activity does not have any outstanding bookmarks or executing child activities and does not schedule any additional work items after being flagged for cancellation, it will complete successfully. This default cancellation suffices for many scenarios, but if additional cancellation logic is needed, then the built-in cancellation activities or custom activities can be used. - In the following example, the override of a based custom `ParallelForEach` activity is defined. When the activity is canceled, this override handles the cancellation logic for the activity. This example is part of the [Non-Generic ParallelForEach](./samples/non-generic-parallelforeach.md) sample. + In the following example, the override of a based custom `ParallelForEach` activity is defined. When the activity is canceled, this override handles the cancellation logic for the activity. This example is part of the [Non-Generic ParallelForEach](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/non-generic-parallelforeach) sample. ```csharp protected override void Cancel(NativeActivityContext context) diff --git a/docs/framework/windows-workflow-foundation/pick-activity.md b/docs/framework/windows-workflow-foundation/pick-activity.md index 7ca8b3f3bac39..14b9ce6004f92 100644 --- a/docs/framework/windows-workflow-foundation/pick-activity.md +++ b/docs/framework/windows-workflow-foundation/pick-activity.md @@ -8,7 +8,7 @@ ms.assetid: b3e49b7f-0285-4720-8c09-11ae18f0d53e The activity simplifies the modeling of a set of event triggers followed by their corresponding handlers. A activity contains a collection of activities, where each is a pairing between a activity and an activity. At execution time, the triggers for all branches are executed in parallel. When one trigger completes, then its corresponding action is executed, and all other triggers are canceled. The behavior of the [!INCLUDE[netfx_current_short](../../../includes/netfx-current-short-md.md)] activity is similar to the .NET Framework 3.5 activity. - The following screenshot from the [Using the Pick Activity](./samples/using-the-pick-activity.md) SDK sample shows a Pick activity with two branches. One branch has a trigger called **Read input**, a custom activity that reads input from the command line. The second branch has a activity trigger. If the **Read input** activity receives data before the activity finishes, Delay will be canceled and a greeting will be written to the console. Otherwise, if the **Read input** activity does not receive data in the allotted time, then it will be canceled and a timeout message will be written to the console. This is a common pattern used to add a timeout to any action. + The following screenshot from the [Using the Pick Activity](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/using-the-pick-activity) SDK sample shows a Pick activity with two branches. One branch has a trigger called **Read input**, a custom activity that reads input from the command line. The second branch has a activity trigger. If the **Read input** activity receives data before the activity finishes, Delay will be canceled and a greeting will be written to the console. Otherwise, if the **Read input** activity does not receive data in the allotted time, then it will be canceled and a timeout message will be written to the console. This is a common pattern used to add a timeout to any action. ![Pick Activity](./media/pick-activity/pick-activity-two-branches.jpg) diff --git a/docs/framework/windows-workflow-foundation/required-arguments-and-overload-groups.md b/docs/framework/windows-workflow-foundation/required-arguments-and-overload-groups.md index 5abc18490991e..ffa7280c6b6b9 100644 --- a/docs/framework/windows-workflow-foundation/required-arguments-and-overload-groups.md +++ b/docs/framework/windows-workflow-foundation/required-arguments-and-overload-groups.md @@ -103,7 +103,7 @@ class CreateLocation: Activity The objective of this activity is to specify a location in the US. To do this, the user of the activity can specify the location using one of three groups of arguments. To specify the valid combinations of arguments, three overload groups are defined. `G1` contains the `Latitude` and `Longitude` arguments. `G2` contains `Street`, `City`, and `State`. `G3` contains `Street` and `Zip`. `Name` is also a required argument, but it is not part of an overload group. For this activity to be valid, `Name` would have to be bound together with all of the arguments from one and only one overload group. - In the following example, taken from the [Database Access Activities](./samples/database-access-activities.md) sample, there are two overload groups: `ConnectionString` and `ConfigFileSectionName`. For this activity to be valid, either the `ProviderName` and `ConnectionString` arguments must be bound, or the `ConfigName` argument, but not both. + In the following example, taken from the [Database Access Activities](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/database-access-activities) sample, there are two overload groups: `ConnectionString` and `ConfigFileSectionName`. For this activity to be valid, either the `ProviderName` and `ConnectionString` arguments must be bound, or the `ConfigName` argument, but not both. ```csharp public class DbUpdate: AsyncCodeActivity diff --git a/docs/framework/windows-workflow-foundation/samples/accessing-operationcontext.md b/docs/framework/windows-workflow-foundation/samples/accessing-operationcontext.md deleted file mode 100644 index da9212c231efe..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/accessing-operationcontext.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -description: "Learn more about: Accessing OperationContext" -title: "Accessing OperationContext" -ms.date: "03/30/2017" -ms.assetid: 4e92efe8-7e79-41f3-b50e-bdc38b9f41f8 ---- -# Accessing OperationContext - -This sample demonstrates how the messaging activities ( and ) can be used with a custom scope activity to access and attach or retrieve a custom message header within an outgoing or incoming message. - -## Demonstrates - - Messaging Activities, , . - -## Discussion - - This sample shows how to use extensibility points () ) in the messaging activities to access . The callbacks are registered within the workflow runtime as an implementation of that is picked up by the messaging activities upon execution. Any messaging activity in the same scope as that implementation is affected. In particular, this sample uses a custom scope activity to enforce the callback behavior. The is used in the client workflow to include the workflow’s as an outgoing . This header is then picked up in the service using the and the value of the header is printed out to the console. - -#### To set up, build, and run the sample - -1. This sample exposes a workflow service using HTTP endpoints. To run this sample, proper URL ACLs must be added (see [Configuring HTTP and HTTPS](../../wcf/feature-details/configuring-http-and-https.md) for details), either by running Visual Studio as Administrator or by executing the following command at an elevated prompt to add the appropriate ACLs. Ensure that your Domain and Username are substituted. - - ```console - netsh http add urlacl url=http://+:8000/ user=%DOMAIN%\%UserName% - ``` - -2. Once the URL ACLs are added, use the following steps. - - 1. Build the solution. - - 2. Set multiple start-up projects by right-clicking the solution and selecting **Set Startup Projects**. - - 3. Add **Service** and **Client** (in that order) as multiple start-up projects. - - 4. Run the application. The client console shows a workflow running twice and the Service window shows the instance ID of those workflows. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Scenario\Services\Accessing Operation Context` diff --git a/docs/framework/windows-workflow-foundation/samples/activity-library.md b/docs/framework/windows-workflow-foundation/samples/activity-library.md deleted file mode 100644 index bf69dde5bd2ce..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/activity-library.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -description: "Learn more about: Activity Library" -title: "Activity Library" -ms.date: "03/30/2017" -ms.assetid: 5323e9d4-71d6-47eb-bfa6-31feac62044d ---- -# Activity Library - -This section contains samples that demonstrate advanced custom activities in Windows Workflow Foundation (WF). - -## In This Section - - [SendMail Custom Activity](sendmail-custom-activity.md) - Demonstrates how to create a custom activity that derives from to send mail using SMTP for use within a workflow application. - - [Throttled Parallel ForEach](throttled-parallel-foreach.md) - Demonstrates how the `ThrottleParallelForEach` activity is similar to the activity with the one exception that it allows setting a concurrency factor to restrict the number of simultaneous branches to execute. - - [Database Access Activities](database-access-activities.md) - Demonstrates how to create activities that allow accessing databases to retrieve or modify information and use [ADO.NET](../../data/adonet/index.md) to access the database. - - [Externalized Policy Activity in .NET Framework 4.5](externalized-policy-activity-in-net-framework-4-5.md) - Demonstrates how the ExternalizedPolicy4 activity allows executing existing Windows Workflow Foundation in .NET Framework 3.5 (WF 3.5) objects in Windows Workflow Foundation in [!INCLUDE[netfx_current_long](../../../../includes/netfx-current-long-md.md)] (WF 4.5) directly by using the rules engine that is shipped in WF 3.5. - - [Non-Generic ForEach](non-generic-foreach.md) - Demonstrates how to create a non-generic version of the activity. - - [Non-Generic ParallelForEach](non-generic-parallelforeach.md) - Demonstrates how to create a non-generic version of the activity. - - [Get WorkflowInstanceId](get-workflowinstanceid.md) - Demonstrates how to use the custom activity, `GetWorkflowInstanceId`, to return the workflow instance ID. diff --git a/docs/framework/windows-workflow-foundation/samples/application.md b/docs/framework/windows-workflow-foundation/samples/application.md deleted file mode 100644 index c95f8ec26a26f..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/application.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -title: "Application" -description: This article refers to samples with detailed procedures for workflow applications in Windows Workflow Foundation. -ms.date: "03/30/2017" -ms.assetid: 22d27e12-ab04-432b-9695-9f74e098cff3 ---- -# Application - -This section contains samples related to workflow applications in Windows Workflow Foundation (WF). - -## In This Section - - [Document Approval Process](document-approval-process.md) - Demonstrates using a workflow in a line-of-business application. - - [Corporate Purchase Process](corporate-purchase-process.md) - Demonstrates using a workflow in a window- and Web-hosted application. - - [Hiring Process](hiring-process.md) - Demonstrates how to implement a business process using messaging activities and two workflows hosted as workflow services. - - [Visual Workflow Tracking](visual-workflow-tracking.md) - Demonstrates how to implement a business process using messaging activities and two workflows hosted as workflow services. - - [Suspended Instance Management](suspended-instance-management.md) - Demonstrates how to manage workflow instances that have been suspended. diff --git a/docs/framework/windows-workflow-foundation/samples/asynchronous-communication.md b/docs/framework/windows-workflow-foundation/samples/asynchronous-communication.md deleted file mode 100644 index dbc1251787052..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/asynchronous-communication.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -description: "Learn more about: Asynchronous Communication" -title: "Asynchronous Communication" -ms.date: "03/30/2017" -ms.assetid: 128dc092-9eb2-4e33-9470-9a7f62b60df6 ---- -# Asynchronous Communication - -This sample demonstrates how the communication between two different Windows Workflow Foundation (WF) services is done asynchronously by default. - -## Demonstrates - - Asynchronous communication between [!INCLUDE[wf1](../../../../includes/wf1-md.md)] services. - -## Discussion - - This sample shows how the communication between [!INCLUDE[wf1](../../../../includes/wf1-md.md)] applications is done asynchronously by using the messaging activities provided by .NET Framework. - - This sample consists of the following three projects. - - CreditCheckService - This service receives the credit score of a particular person or the value of the item to acquire, and then decides whether the credit is given to the person. - - RentalApprovalService - This service receives an application from a person who is in need of some credit. This service communicates asynchronously with the `CreditCheckService` to decide whether the credit application is valid. - - Client - The client communicates synchronously with the `RentalApprovalService` to know whether the credit is approved. - -#### To set up, build, and run the sample - -1. Right-click the **AsynchronousCommunication** solution and select **Properties**. - -2. In **Common Properties**, select **Startup Project**, and select **Multiple Startup Projects**. - -3. Move **RentalApprovalService** to the first position in the list, followed by **CreditCheckService**, followed by **Client**. Set the **Start** action on all three projects. - -4. Click **OK**, and press F5 to run the sample. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Scenario\Services\AsynchronousCommunication` diff --git a/docs/framework/windows-workflow-foundation/samples/basic.md b/docs/framework/windows-workflow-foundation/samples/basic.md deleted file mode 100644 index a00f380940a6e..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/basic.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: "Basic - WF" -description: This article refers to samples that demonstrate basic Windows Workflow Foundation functionality, such as built-in and custom activities. -ms.date: "03/30/2017" -ms.assetid: 84a315b6-3f96-4959-8306-49be37936a23 ---- -# Basic - -This section provides samples that demonstrate basic Windows Workflow Foundation (WF) functionality. - -## In This Section - - [Built-in Activities](built-in-activities.md) - Contains samples that use the built-in activity library. - - [Custom Activities](custom-activities.md) - Contains samples that demonstrate creating custom activities. - - [Designer](designer.md) - Contains samples that demonstrate how to use Windows Workflow Designer. - - [Designer ReHosting](designer-rehosting.md) - Contains samples that demonstrate re-hosting the activity designer. - - [Execution](execution.md) - Contains samples that demonstrate executing workflows. - - [Tracking](tracking.md) - Contains samples that demonstrate workflow tracking. diff --git a/docs/framework/windows-workflow-foundation/samples/bookmark-resolver-for-workflowhostingendpoint.md b/docs/framework/windows-workflow-foundation/samples/bookmark-resolver-for-workflowhostingendpoint.md deleted file mode 100644 index ae855c09a79c1..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/bookmark-resolver-for-workflowhostingendpoint.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -description: "Learn more about: Bookmark Resolver for WorkflowHostingEndpoint" -title: "Bookmark Resolver for WorkflowHostingEndpoint" -ms.date: "03/30/2017" -ms.assetid: 97fd5816-935e-4625-ad04-e6f6befa07de ---- -# Bookmark Resolver for WorkflowHostingEndpoint - -This sample demonstrates how the can be used with to create workflow instances. - -## Demonstrates - - , - -## Discussion - - This sample uses the to create workflow instances hosted using . is an extensibility point for that can be used in the following scenarios: - -- Creating new workflow instances. - -- Resuming bookmarks on workflow instance hosted in a . - - The sample endpoint that is included exposes a contract that provides operations to create a workflow and returns the instance ID or creates an instance with a specific ID. The sample console application creates a instance with a workflow definition and adds a `CreationEndpoint` to the host. It then calls the `Create` operation on the endpoint to create a new workflow instance. - -#### To set up, build, and run the sample - -1. Build the solution. - -2. Run the application. The `CreationEndpoint` console shows a message that includes the instance ID when the workflow instance is created. The message "Hello World!" is printed by the workflow instance. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Basic\Execution\CreationEndpoint` diff --git a/docs/framework/windows-workflow-foundation/samples/built-in-activities.md b/docs/framework/windows-workflow-foundation/samples/built-in-activities.md deleted file mode 100644 index 631122f9c79fc..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/built-in-activities.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -description: "Learn more about: Built-in Activities" -title: "Built-in Activities" -ms.date: "03/30/2017" -ms.assetid: 31e1b8c2-7f74-458a-b2e2-fddc5b10eac1 ---- -# Built-in Activities - -This section contains samples that demonstrate built-in Windows Workflow Foundation (WF) activities. - -## In This Section - -[Fault Handling in a Flowchart Activity Using TryCatch](fault-handling-in-a-flowchart-activity-using-trycatch.md)\ -Demonstrates how the activity can be used within a complex control flow activity. - -[Load From XAML](load-from-xaml.md)\ -Demonstrates how to dynamically load a XAML workflow without having to run the XamlBuildTask tool. - -[Using the Pick Activity](using-the-pick-activity.md)\ -Demonstrates how to use the activity. diff --git a/docs/framework/windows-workflow-foundation/samples/code-bodied.md b/docs/framework/windows-workflow-foundation/samples/code-bodied.md deleted file mode 100644 index 5036ac8b89d46..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/code-bodied.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -description: "Learn more about: Code-Bodied" -title: "Code-Bodied" -ms.date: "03/30/2017" -ms.assetid: 5bfb2d95-9092-4551-9c59-bd8f0a37225e ---- -# Code-Bodied - -This section contains custom activity samples created declaratively in code. - -## In This Section - - [Custom Composite using Native Activity](custom-composite-using-native-activity.md) - This sample demonstrates how to write a that schedules other objects to control the flow of a workflow’s execution. diff --git a/docs/framework/windows-workflow-foundation/samples/corporate-purchase-process.md b/docs/framework/windows-workflow-foundation/samples/corporate-purchase-process.md deleted file mode 100644 index b56652ab8584b..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/corporate-purchase-process.md +++ /dev/null @@ -1,178 +0,0 @@ ---- -description: "Learn more about: Corporate Purchase Process" -title: "Corporate Purchase Process" -ms.date: "03/30/2017" -ms.assetid: a5e57336-4290-41ea-936d-435593d97055 ---- -# Corporate Purchase Process - -This sample shows how to create a very basic Request for Proposals (RFP) based purchase process with automatic best proposal selection. It combines , , and and a custom activity to create a workflow that represents the process. - - This sample contains an ASP.NET client application that allows interacting with the process as different participants (as the original requester or a particular vendor). - -## Requirements - -- Visual Studio 2012. - -- [!INCLUDE[netfx_current_long](../../../../includes/netfx-current-long-md.md)]. - -## Demonstrates - -- Custom activities. - -- Composition of activities. - -- Bookmarks. - -- Persistence. - -- Schematized persistence. - -- Tracing. - -- Tracking. - -- Hosting [!INCLUDE[wf1](../../../../includes/wf1-md.md)] in different clients (ASP.NET Web applications and WinForms applications). - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Application\PurchaseProcess` - -## Description of the Process - - This sample shows an implementation of a Windows Workflow Foundation (WF) program to gather proposals from vendors for a generic company. - -1. An employee of Company X creates a Request for Proposal (RFP). - - 1. The employee types in the RFP title and description. - - 2. The employee selects the vendors that they want to invite to submit proposals. - -2. The employee submits the proposal. - - 1. An instance of the workflow is created. - - 2. The workflow is waiting for all vendors to submit their proposals. - -3. After all proposals are received, the workflow iterates through all the received proposals and selects the best one. - - 1. Each vendor has a reputation (this sample stores the reputation list in VendorRepository.cs). - - 2. The total value of the proposal is determined by (The value typed in by the vendor) * (The vendor's recorded reputation) / 100. - -4. The original requester can see all the submitted proposals. The best proposal is presented in a special section in the report. - -## Process Definition - - The core logic of the sample uses a activity that waits for the offers from each vendor (using a custom activity that creates a bookmark), and registers the vendor proposal as an RFP (using an activity). - - The sample then iterates through all of the received proposals stored in the `RfpRepository`, calculating the adjusted value (using an activity and activities), and if the adjusted value is better than the previous best offer, assigns the new value as the best offer (using and activities). - -## Projects in this Sample - - This sample contains the following projects. - -|Project|Description| -|-------------|-----------------| -|Common|The entity objects used within the process (Request for Proposal, Vendor, and Vendor Proposal).| -|WfDefinition|The definition of the process (as a [!INCLUDE[wf1](../../../../includes/wf1-md.md)] program) and host (`PurchaseProcessHost`) used by client applications for creating and using instances of the purchase process workflow.| -|WebClient|An ASP.NET client application that allows the users to create and participate in instances of the purchase process. It uses a custom-created host to interact with the workflow engine.| -|WinFormsClient|A Windows Forms client application that allows the users to create and participate in instances of the purchase process. It uses a custom-created host to interact with the workflow engine.| - -### WfDefinition - - The following table contains a description of the most important files in the WfDefinition project. - -|File|Description| -|----------|-----------------| -|IPurchaseProcessHost.cs|Interface for the host of the workflow.| -|PurchaseProcessHost.cs|Implementation of a host for the workflow. The host abstracts the details of the workflow runtime and is used in all the client applications to load, run, and interact with `PurchaseProcess` workflow instances.| -|PurchaseProcessWorkflow.cs|An activity that contains the definition of the Purchase Process workflow (derives from ).

Activities that derive from compose functionality by assembling existing custom activities and activities from the [!INCLUDE[netfx_current_long](../../../../includes/netfx-current-long-md.md)] activity library. Assembling these activities is the most basic way to create custom functionality.| -|WaitForVendorProposal.cs|This custom activity derives from and creates a named bookmark that must be resumed later by a vendor when submitting the proposal.

Activities that derive from , like those that derive from , create imperative functionality by overriding , but also have access to all of the functionality of the workflow runtime through the that gets passed into the `Execute` method. This context has support for scheduling and canceling child activities, setting up no-persist zones (execution blocks during which the runtime does not persist the workflow's data, such as within atomic transactions), and objects (handles for resuming paused workflows).| -|TrackingParticipant.cs|A that receives all tracking events and saves them to a text file.

Tracking participants are added to workflow instance as Extensions.| -|XmlWorkflowInstanceStore.cs|A custom that saves workflow applications to XML files.| -|XmlPersistenceParticipant.cs|A custom that saves an instance of request for proposal to an XML file.| -|AsyncResult.cs / CompletedAsyncResult.cs|Helper classes for implementing the asynchronous pattern in the persistence components.| - -### Common - - The following table contains a description of the most important classes in the Common project. - -|Class|Description| -|-----------|-----------------| -|Vendor|A vendor that submits proposals in a Request for Proposals.| -|RequestForProposal|A request for proposals (RFP) is an invitation for vendors to submit proposals on a specific commodity or service.| -|VendorProposal|A proposal submitted by a vendor to a concrete RFP.| -|VendorRepository|The repository of Vendors. This implementation contains an in-memory collection of instances of Vendor and methods for exposing those instances.| -|RfpRepository|The repository of Requests for Proposals. This implementation contains uses Linq to XML to query the XML file of Requests for Proposal generated by the schematized persistence. | -|IOHelper|This class handles all I/O-related issues (folders, paths, and so on.)| - -### Web Client - - The following table contains a description of the most important Web pages in the Web Client project. - -|File|Description| -|-|-| -|CreateRfp.aspx|Creates and submits a new Request for Proposals.| -|Default.aspx|Shows all active and completed Requests for Proposals.| -|GetVendorProposal.aspx|Gets a proposal from a vendor in a concrete Request for Proposals. This page is used only by vendors.| -|ShowRfp.aspx|Show all the information about a Request for Proposals (received proposals, dates, values, and other information). This page is only used by the creator of the Request for Proposal.| - -### WinForms Client - - The following table contains a description of the most important forms in the Win Forms project. - -|Form|Description| -|-|-| -|NewRfp|Creates and submits a new Request for Proposals.| -|ShowProposals|Show all active and finished Requests for Proposals. **Note:** You may need to click the **Refresh** button in the UI to see changes in that screen after you create or modify a Request for Proposal.| -|SubmitProposal|Get a proposal from a vendor in a concrete Request for Proposals. This window is used only by vendors.| -|ViewRfp|Show all the information about a Request for Proposals (received proposals, dates, values, and other information). This window is only used by the creator of the Request for Proposals.| - -### Persistence Files - - The following table shows the files generated by the persistence provider (`XmlPersistenceProvider`) are located in the path of the current system's temporary folder (using ). The tracing file is created in the current execution path. - -|File Name|Description|Path| -|-|-|-| -|rfps.xml|The XML file with all the active and finished Requests for Proposals.|| -|[instanceid]|This file contains all the information about a workflow instance.

This file is generated by the schematized persistence implementation (PersistenceParticipant in XmlPersistenceProvider).|| -|[instanceId].tracking|A text file with all the events that occurred within a concrete instance.

This file is generated by TrackingParticipant.|| -|PurchaseProcess.Tracing.TraceLog.txt|The tracing file generated by the workflow based on the configuration parameters in the App.config or Web.config files.|Current execution path| - -#### To use this sample - -1. Using Visual Studio 2010, open the PurchaseProcess.sln solution file. - -2. To execute the Web Client project, open **Solution Explorer** and right-click the **Web Client** project. Select **Set as Startup Project**. - -3. To execute the WinForms Client project, open **Solution Explorer** and right-click the **WinForms Client** project. Select **Set as Startup Project**. - -4. To build the solution, press CTRL+SHIFT+B. - -5. To run the solution, press CTRL+F5. - -### Web Client Options - -- **Create a new RFP**: Creates a new Request for Proposals (RFP) and starts a Purchase Process workflow. - -- **Refresh**: Refreshes the list of Active and Finished RFPs in the main window. - -- **View**: Shows the content of an existing RFP. Vendors can submit their proposals (if invited or the RFP is not finished). - -- View As: The user can access the RFP using different identities by selecting the desired participant in the **View as** combo box in the active RFPs grid. - -### WinForms Client Options - -- **Create RFP**: Creates a new Request for Proposals (RFP) and starts a Purchase Process workflow. - -- **Refresh**: Refreshes the list of Active and Finished RFPs in the main window. - -- **View RFP**: Shows the content of an existing RFP. Vendors can submit their proposals (if invited or the RFP is not finished) - -- **Connect As**: The user can access the RFP using different identities by selecting the desired participant in the **View as** combo box in the active RFPs grid. diff --git a/docs/framework/windows-workflow-foundation/samples/creating-and-running-a-workflow-instance.md b/docs/framework/windows-workflow-foundation/samples/creating-and-running-a-workflow-instance.md deleted file mode 100644 index 2584474d70e3e..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/creating-and-running-a-workflow-instance.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -description: "Learn more about: Creating and Running a Workflow Instance" -title: "Creating and Running a Workflow Instance" -ms.date: "03/30/2017" -ms.assetid: 19d27f47-0491-4569-8f53-51bc1d940e80 ---- -# Creating and Running a Workflow Instance - -This sample shows how to run a workflow instance. It shows how to execute it synchronously and asynchronously. - -## Demonstrates - -, . - -## Discussion - -The first part of the sample uses . This is the most basic way to execute a workflow. Workflows executed with are executed synchronously. - -The second part of the sample uses the class. enables you to have more control over each instance, including the ability to interact with the running workflow and to run the workflow asynchronously. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Basic\Execution\CreatingWorkflowInstances` - -## See also - -- [Using WorkflowInvoker and WorkflowApplication](../using-workflowinvoker-and-workflowapplication.md) diff --git a/docs/framework/windows-workflow-foundation/samples/custom-activities.md b/docs/framework/windows-workflow-foundation/samples/custom-activities.md deleted file mode 100644 index 25d48f0b51eaf..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/custom-activities.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -description: "Learn more about: Custom Activities" -title: "Custom Activities" -ms.date: "03/30/2017" -ms.assetid: 5cde06b3-51b2-4e46-900d-11140bae77f4 ---- -# Custom Activities - -This section contains samples that demonstrate how to create custom activities in Windows Workflow Foundation (WF). - -## In This Section - - [Code-Bodied](code-bodied.md) - Contains custom activity samples created declaratively in code. - - [Custom Activity Designers](custom-activity-designers.md) - Contains activity samples that use custom designers for display in the workflow designer. diff --git a/docs/framework/windows-workflow-foundation/samples/custom-activity-designers.md b/docs/framework/windows-workflow-foundation/samples/custom-activity-designers.md deleted file mode 100644 index 11bfa5bc33b07..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/custom-activity-designers.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -description: "Learn more about: Custom Activity Designers" -title: "Custom Activity Designers" -ms.date: "03/30/2017" -ms.assetid: dcf14dca-ce6d-4278-96ba-062f0a679075 ---- -# Custom Activity Designers - -This section contains activity samples that use custom designers for display in the workflow designer. - -## In This Section - - [Custom Composite Designers - Workflow Item Presenter](custom-composite-designers-workflow-item-presenter.md) - This sample shows how to build an activity designer that surfaces such a "drop zone." - - [Custom Composite Designers - Workflow Items Presenter](custom-composite-designers-workflow-items-presenter.md) - This sample shows how to build an activity designer that surfaces such an editable collection. - - [Using the ExpressionTextBox in a Custom Activity Designer](using-the-expressiontextbox-in-a-custom-activity-designer.md) - This sample shows how to use the in a custom activity designer. - - [Using Editing Scope](using-editing-scope.md) - This sample demonstrates how to batch a set of changes so that they can be undone in a single atomic unit. By default, the actions taken by an activity designer author are automatically integrated into the Undo/Redo system. diff --git a/docs/framework/windows-workflow-foundation/samples/custom-composite-designers-workflow-item-presenter.md b/docs/framework/windows-workflow-foundation/samples/custom-composite-designers-workflow-item-presenter.md deleted file mode 100644 index 00f4f84c71a12..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/custom-composite-designers-workflow-item-presenter.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -description: "Learn more about: Custom Composite Designers - Workflow Item Presenter" -title: "Custom Composite Designers - Workflow Item Presenter" -ms.date: "03/30/2017" -ms.assetid: f85224cf-9e30-44a5-9a81-3bc438a34364 ---- -# Custom Composite Designers - Workflow Item Presenter - -The is a key type in the WF designer programming model that allows for the creation of a "drop zone" where an arbitrary activity can be placed. This sample shows how to build an activity designer that surfaces such a "drop zone." - -This sample demonstrates: - -- Creating a custom activity designer with a . - -- Registering the custom designer using the metadata store. - -- Programming the rehosted toolbox declaratively and imperatively. - -## Sample Details - -The code for this sample shows: - -- The custom activity designer is built for the `SimpleNativeActivity` class. - -- The creation of a custom activity designer with a . - -```xaml - - - - - This is the collapsed view - - - - - Custom Text - - - - - - - - - -``` - - Note the use of WPF data binding to bind to `ModelItem.Body`. `ModelItem` is the property on that refers to the underlying object the designer is being used for, in this case, **SimpleNativeActivity**. - -## Set up, build, and run the sample - -1. Open the solution in Visual Studio. - -2. Press **F5** to compile and run the application. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Basic\CustomActivities\CustomActivityDesigners\WorkflowItemPresenter` - -## See also - -- -- [Developing Applications with the Workflow Designer](/visualstudio/workflow-designer/developing-applications-with-the-workflow-designer) diff --git a/docs/framework/windows-workflow-foundation/samples/custom-composite-designers-workflow-items-presenter.md b/docs/framework/windows-workflow-foundation/samples/custom-composite-designers-workflow-items-presenter.md deleted file mode 100644 index 561cb685a1e95..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/custom-composite-designers-workflow-items-presenter.md +++ /dev/null @@ -1,162 +0,0 @@ ---- -description: "Learn more about: Custom Composite Designers - Workflow Items Presenter" -title: "Custom Composite Designers - Workflow Items Presenter" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -ms.assetid: 70055c4b-1173-47a3-be80-b5bce6f59e9a ---- -# Custom Composite Designers - Workflow Items Presenter - -The is a key type in the WF designer programming model that allows for the editing of a collection of contained elements. This sample shows how to build an activity designer that surfaces such an editable collection. - -This sample demonstrates: - -- Creating a custom activity designer with a . - -- Creating an activity designer with a "collapsed" and "expanded" view. - -- Overriding a default designer in a rehosted application. - -## Set up, build, and run the sample - -1. Open the **UsingWorkflowItemsPresenter.sln** sample solution for C# or for Visual Basic in Visual Studio 2010. - -2. Build and run the solution. - - A rehosted workflow designer application opens, and you can drag activities onto the canvas. - -## Sample Highlights - -The code for this sample shows the following: - -- The activity a designer is built for: `Parallel` - -- The creation of a custom activity designer with a . A few things to point out: - - - Note the use of WPF data binding to bind to `ModelItem.Branches`. `ModelItem` is the property on `WorkflowElementDesigner` that refers to the underlying object the designer is being used for, in this case, our `Parallel`. - - - The can be used to put a visual to display between the individual items in the collection. - - - is a template that can be provided to determine the layout of the items in the collection. In this case, a horizontal stack panel is used. - - This following example code shows this. - - ```xaml - - - - - - - - - - - - - ``` - -- Perform an association of the `DesignerAttribute` to the `Parallel` type and then output the attributes reported. - - - First, register all of the default designers. - - The following is the code example. - - ```csharp - // register metadata - (new DesignerMetadata()).Register(); - RegisterCustomMetadata(); - ``` - - ```vb - ' register metadata - Dim metadata = New DesignerMetadata() - metadata.Register() - ' register custom metadata - RegisterCustomMetadata() - ``` - - - Then, override the parallel in `RegisterCustomMetadata` method. - - The following code shows this in C# and Visual Basic. - - ```csharp - void RegisterCustomMetadata() - { - AttributeTableBuilder builder = new AttributeTableBuilder(); - builder.AddCustomAttributes(typeof(Parallel), new DesignerAttribute(typeof(CustomParallelDesigner))); - MetadataStore.AddAttributeTable(builder.CreateTable()); - } - ``` - - ```vb - Sub RegisterCustomMetadata() - Dim builder As New AttributeTableBuilder() - builder.AddCustomAttributes(GetType(Parallel), New DesignerAttribute(GetType(CustomParallelDesigner))) - MetadataStore.AddAttributeTable(builder.CreateTable()) - End Sub - ``` - -- Finally, note the use of differing data templates and triggers to select the appropriate template based on the `IsRootDesigner` property. - - The following is the code example. - - ```xaml - - - - - This is the Expanded View - - - - - - - - - - - - - - - - This is the Collapsed View - - - - - - - - ``` - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Basic\CustomActivities\CustomActivityDesigners\WorkflowItemsPresenter` - -## See also - -- -- [Developing Applications with the Workflow Designer](/visualstudio/workflow-designer/developing-applications-with-the-workflow-designer) diff --git a/docs/framework/windows-workflow-foundation/samples/custom-composite-using-native-activity.md b/docs/framework/windows-workflow-foundation/samples/custom-composite-using-native-activity.md deleted file mode 100644 index caf7a6e4105d2..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/custom-composite-using-native-activity.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -description: "Learn more about: Custom Composite using Native Activity" -title: "Custom Composite using Native Activity" -ms.date: "03/30/2017" -ms.assetid: ef9e739c-8a8a-4d11-9e25-cb42c62e3c76 ---- -# Custom Composite using Native Activity - -This sample demonstrates how to write a that schedules other objects to control the flow of a workflow’s execution. This sample uses two common control flows, Sequence and While, to demonstrate how to do this. - -## Sample Details - - Starting with `MySequence`, the first thing to notice is that it derives from . is the object that exposes the full breadth of the workflow runtime through the passed to the `Execute` method. - - `MySequence` exposes a public collection of objects that gets populated by the workflow author. Before the workflow is executed, the workflow runtime calls the method on each activity in a workflow. During this process, the runtime establishes parent-child relationships for data scoping and lifetime management. The default implementation of the method uses the instance class for the `MySequence` activity to add any public property of type or \<> as children of the `MySequence` activity. - - Whenever an activity exposes a public collection of child activities, it is likely those child activities share state. It is a best practice for the parent activity, in this case `MySequence`, to also expose a collection of variables through which the child activities can accomplish this. Like child activities, the method adds public properties of type or \<> as variables associated with the `MySequence` activity. - - Besides the public variables, which are manipulated by the children of `MySequence`, `MySequence` must also keep track of where it is in the execution of its children. It uses a private variable, `currentIndex`, to accomplish this. This variable is registered as part of the `MySequence` environment by adding a call to the method within the `MySequence` activity’s method. The objects added to the `MySequence` `Activities` collection cannot access variables added this way. - - When `MySequence` is executed by the runtime, the runtime calls its method, passing in an . The is the activity’s proxy back into the runtime for dereferencing arguments and variables as well as scheduling other objects, or `ActivityDelegates`. `MySequence` uses an `InternalExecute` method to encapsulate the logic of scheduling the first child and all subsequent children in a single method. It starts by dereferencing the `currentIndex`. If it is equal to the count in the `Activities` collection, then the sequence is finished, the activity returns without scheduling any work and the runtime moves it into the state. If the `currentIndex` is less than the count of activities, the next child is obtained from the `Activities` collection and `MySequence` calls , passing in the child to be scheduled and a that points at the `InternalExecute` method. Finally, the `currentIndex` is incremented and control is yielded back to the runtime. As long as an instance of `MySequence` has a child object scheduled, the runtime considers it to be in the Executing state. - - When the child activity completes, the is executed. The loop continues from the top. Like `Execute`, a takes an , giving the implementer access to the runtime. - - `MyWhile` differs from `MySequence` in that it schedules a single object repeatedly, and in that it uses a named `Condition` to determine whether this scheduling should occur. Like `MySequence`, `MyWhile` uses an `InternalExecute` method to centralize its scheduling logic. It schedules the `Condition` with a \ named `OnEvaluationCompleted`. When the execution of `Condition` is completed, its result becomes available through this in a strongly typed parameter named `result`. If `true`, `MyWhile` calls , passing in the `Body` object and `InternalExecute` as the . When the execution of `Body` completes, `Condition` gets scheduled again in `InternalExecute`, starting the loop over again. When the `Condition` returns `false`, an instance of `MyWhile` gives control back to the runtime without scheduling the `Body` and the runtime moves it to the state. - -#### To set up, build, and run the sample - -1. Open the Composite.sln sample solution in Visual Studio 2010. - -2. Build and run the solution. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Basic\CustomActivities\Code-Bodied\CustomCompositeNativeActivity` diff --git a/docs/framework/windows-workflow-foundation/samples/custom-tracking.md b/docs/framework/windows-workflow-foundation/samples/custom-tracking.md deleted file mode 100644 index 14cd97c6c99cd..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/custom-tracking.md +++ /dev/null @@ -1,152 +0,0 @@ ---- -description: "Learn more about: Custom Tracking" -title: "Custom Tracking" -ms.date: "03/30/2017" -ms.assetid: 2d191c9f-62f4-4c63-92dd-cda917fcf254 ---- -# Custom Tracking - -This sample demonstrates how to create a custom tracking participant and write the contents of the tracking data to console. In addition, the sample demonstrates how to emit objects populated with user defined data. The console-based tracking participant filters the objects emitted by the workflow using a tracking profile object created in code. - -## Sample Details - - Windows Workflow Foundation (WF) provides a tracking infrastructure to track execution of a workflow instance. The tracking runtime implements a workflow instance to emit events related to the workflow lifecycle, events from workflow activities and custom tracking events. The following table details the primary components of the tracking infrastructure. - -|Component|Description| -|---------------|-----------------| -|Tracking runtime|Provides the infrastructure to emit tracking records.| -|Tracking participants|Consumes the tracking records. .NET Framework 4 ships with a tracking participant that writes tracking records as Event Tracing for Windows (ETW) events.| -|Tracking profile|A filtering mechanism that allows a tracking participant to subscribe for a subset of the tracking records emitted from a workflow instance.| - - The following table details the tracking records that the workflow runtime emits. - -|Tracking Record|Description| -|---------------------|-----------------| -|Workflow instance tracking records.|Describes the life cycle of the workflow instance. For example, an instance record is emitted when the workflow starts or completes.| -|Activity state Tracking Records.|Details activity execution. These records indicate the state of a workflow activity such as when an activity is scheduled or when the activity completes or when a fault is thrown.| -|Bookmark resumption record.|Emitted whenever a bookmark within a workflow instance is resumed.| -|Custom Tracking Records.|A workflow author can create Custom Tracking Records and emit them within the custom activity.| - - The tracking participant subscribes for a subset of the emitted objects using tracking profiles. A tracking profile contains tracking queries that allow subscribing for a particular tracking record type. Tracking profiles can be specified in code or in configuration. - -### Custom Tracking Participant - - The tracking participant API allows extension of the tracking runtime with a user provided tracking participant that can include custom logic to handle objects emitted by the workflow runtime. - - To write a tracking participant the user must implement . Specifically, the method has to be implemented by the custom participant. This method is called when a is emitted by the workflow runtime. - -```csharp -public abstract class TrackingParticipant -{ - protected TrackingParticipant(); - - public virtual TrackingProfile TrackingProfile { get; set; } - public abstract void Track(TrackingRecord record, TimeSpan timeout); -} -``` - - The complete tracking participant is implemented in the ConsoleTrackingParticipant.cs file. The following code example is the method for the custom tracking participant. - -```csharp -protected override void Track(TrackingRecord record, TimeSpan timeout) -{ - ... - WorkflowInstanceRecord workflowInstanceRecord = record as WorkflowInstanceRecord; - if (workflowInstanceRecord != null) - { - Console.WriteLine(String.Format(CultureInfo.InvariantCulture, - " Workflow InstanceID: {0} Workflow instance state: {1}", - record.InstanceId, workflowInstanceRecord.State)); - } - - ActivityStateRecord activityStateRecord = record as ActivityStateRecord; - if (activityStateRecord != null) - { - IDictionary variables = activityStateRecord.Variables; - StringBuilder vars = new StringBuilder(); - - if (variables.Count > 0) - { - vars.AppendLine("\n\tVariables:"); - foreach (KeyValuePair variable in variables) - { - vars.AppendLine(String.Format( - "\t\tName: {0} Value: {1}", variable.Key, variable.Value)); - } - } - Console.WriteLine(String.Format(CultureInfo.InvariantCulture, - " :Activity DisplayName: {0} :ActivityInstanceState: {1} {2}", - activityStateRecord.Activity.Name, activityStateRecord.State, - ((variables.Count > 0) ? vars.ToString() : String.Empty))); - } - - CustomTrackingRecord customTrackingRecord = record as CustomTrackingRecord; - - if ((customTrackingRecord != null) && (customTrackingRecord.Data.Count > 0)) - { - ... - } - Console.WriteLine(); - -} -``` - - The following code example adds the console participant to the workflow invoker. - -```csharp -ConsoleTrackingParticipant customTrackingParticipant = new ConsoleTrackingParticipant() -{ - ... - // The tracking profile is set here, refer to Program.CS -... -} - -WorkflowInvoker invoker = new WorkflowInvoker(BuildSampleWorkflow()); -invoker.Extensions.Add(customTrackingParticipant); -``` - -### Emitting Custom Tracking Records - - This sample also demonstrates the ability to emit objects from a custom workflow activity: - -- The objects are created and populated with user-defined data that is desired to be emitted with the record. - -- The is emitted by calling the track method of the . - - The following example demonstrates how to emit objects within a custom activity. - -```csharp -// Create the Custom Tracking Record -CustomTrackingRecord customRecord = new CustomTrackingRecord("OrderIn") -{ - Data = - { - {"OrderId", 200}, - {"OrderDate", "20 Aug 2001"} - } -}; - -// Emit custom tracking record -context.Track(customRecord); -``` - -#### To use this sample - -1. Using Visual Studio 2010, open the CustomTrackingSample.sln solution file. - -2. To build the solution, press CTRL+SHIFT+B. - -3. To run the solution, press CTRL+F5. - -> [!IMPORTANT] -> The samples may already be installed on your computer. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Basic\Tracking\CustomTracking` - -## See also - -- [AppFabric Monitoring Samples](/previous-versions/appfabric/ff383407(v=azure.10)) diff --git a/docs/framework/windows-workflow-foundation/samples/database-access-activities.md b/docs/framework/windows-workflow-foundation/samples/database-access-activities.md deleted file mode 100644 index 0abd6ace5bc57..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/database-access-activities.md +++ /dev/null @@ -1,333 +0,0 @@ ---- -description: "Learn more about: Database Access Activities" -title: "Database Access Activities" -ms.date: "03/30/2017" -ms.assetid: 174a381e-1343-46a8-a62c-7c2ae2c4f0b2 ---- -# Database Access Activities - -Database access activities allow you to access a database within a workflow. These activities allow accessing databases to retrieve or modify information and use [ADO.NET](../../data/adonet/index.md) to access the database. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to (download page) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Scenario\ActivityLibrary\DbActivities` - -## Database Activities - -The following sections detail the list of activities included in this sample. - -## DbUpdate - -Executes a SQL query that produces a modification in the database (insert, update, delete, and other modifications). - -This class performs its work asynchronously (it derives from and uses its asynchronous capabilities). - -The connection information can be configured by setting a provider invariant name (`ProviderName`) and the connection string (`ConnectionString`) or just using a connection string configuration name (`ConfigFileSectionName`) from the application configuration file. - -The query to be executed is configured in its `Sql` property and the parameters are passed through the `Parameters` collection. - -After `DbUpdate` is executed, the number of affected records is returned in the `AffectedRecords` property. - -```csharp -Public class DbUpdate: AsyncCodeActivity -{ - [RequiredArgument] - [OverloadGroup("ConnectionString")] - [DefaultValue(null)] - public InArgument ProviderName { get; set; } - - [RequiredArgument] - [OverloadGroup("ConnectionString")] - [DependsOn("ProviderName")] - [DefaultValue(null)] - public InArgument ConnectionString { get; set; } - - [RequiredArgument] - [OverloadGroup("ConfigFileSectionName")] - [DefaultValue(null)] - public InArgument ConfigName { get; set; } - - [DefaultValue(null)] - public CommandType CommandType { get; set; } - - [RequiredArgument] - public InArgument Sql { get; set; } - - [DependsOn("Sql")] - [DefaultValue(null)] - public IDictionary Parameters { get; } - - [DependsOn("Parameters")] - public OutArgument AffectedRecords { get; set; } -} -``` - -|Argument|Description| -|-|-| -|ProviderName|ADO.NET provider invariant name. If this argument is set, then the `ConnectionString` must also be set.| -|ConnectionString|Connection string to connect to the database. If this argument is set, then `ProviderName` must also be set.| -|ConfigName|Name of the configuration file section where the connection information is stored. When this argument is set `ProviderName` and `ConnectionString` are not required.| -|CommandType|Type of the to be executed.| -|Sql|The SQL command to be executed.| -|Parameters|Collection of the parameters of the SQL query.| -|AffectedRecords|Number of records affected by the last operation.| - -## DbQueryScalar - -Executes a query that retrieves a single value from the database. - -This class performs its work asynchronously (it derives from and uses its asynchronous capabilities). - -The connection information can be configured by setting a provider invariant name (`ProviderName`) and the connection string (`ConnectionString`) or just using a connection string configuration name (`ConfigFileSectionName`) from the application configuration file. - -The query to be executed is configured in its `Sql` property and the parameters are passed through the `Parameters` collection. - -After `DbQueryScalar` is executed, the scalar is returned in the `Result out` argument (of type `TResult`, that is defined in the base class ). - -```csharp -public class DbQueryScalar : AsyncCodeActivity -{ - // public arguments - [RequiredArgument] - [OverloadGroup("ConnectionString")] - [DefaultValue(null)] - public InArgument ProviderName { get; set; } - - [RequiredArgument] - [OverloadGroup("ConnectionString")] - [DependsOn("ProviderName")] - [DefaultValue(null)] - public InArgument ConnectionString { get; set; } - - [RequiredArgument] - [OverloadGroup("ConfigFileSectionName")] - [DefaultValue(null)] - public InArgument ConfigName { get; set; } - - [DefaultValue(null)] - public CommandType CommandType { get; set; } - - [RequiredArgument] - public InArgument Sql { get; set; } - - [DependsOn("Sql")] - [DefaultValue(null)] - public IDictionary Parameters { get; } -} -``` - -|Argument|Description| -|-|-| -|ProviderName|ADO.NET provider invariant name. If this argument is set, then the `ConnectionString` must also be set.| -|ConnectionString|Connection string to connect to the database. If this argument is set, then `ProviderName` must also be set.| -|ConfigName|Name of the configuration file section where the connection information is stored. When this argument is set `ProviderName` and `ConnectionString` are not required.| -|CommandType|Type of the to be executed.| -|Sql|The SQL command to be executed.| -|Parameters|Collection of the parameters of the SQL query.| -|Result|Scalar that is obtained after the query is executed. This argument is of type `TResult`.| - -## DbQuery - -Executes a query that retrieves a list of objects. After the query is executed, a mapping function is executed (it can be <`DbDataReader`, `TResult`> or an <`DbDataReader`, `TResult`>). This mapping function gets a record in a `DbDataReader` and maps it to the object to be returned. - -The connection information can be configured by setting a provider invariant name (`ProviderName`) and the connection string (`ConnectionString`) or just using a connection string configuration name (`ConfigFileSectionName`) from the application configuration file. - -The query to be executed is configured in its `Sql` property and the parameters are passed through the `Parameters` collection. - -The results of the SQL query are retrieved using a `DbDataReader`. The activity iterates through the `DbDataReader` and maps the rows in the `DbDataReader` to an instance of `TResult`. The user of `DbQuery` has to provide the mapping code and this can be done in two ways: using a <`DbDataReader`, `TResult`> or an <`DbDataReader`, `TResult`>. In the first case, the map is done in a single pulse of execution. Therefore, it is faster, but this cannot be serialized to XAML. In the last case, the map is performed in multiple pulses. Therefore, it might be slower but can be serialized to XAML and authored declaratively (any existing activity can participate in the mapping). - -```csharp -public class DbQuery : AsyncCodeActivity> where TResult : class -{ - // public arguments - [RequiredArgument] - [OverloadGroup("ConnectionString")] - [DefaultValue(null)] - public InArgument ProviderName { get; set; } - - [RequiredArgument] - [OverloadGroup("ConnectionString")] - [DependsOn("ProviderName")] - [DefaultValue(null)] - public InArgument ConnectionString { get; set; } - - [RequiredArgument] - [OverloadGroup("ConfigFileSectionName")] - [DefaultValue(null)] - public InArgument ConfigName { get; set; } - - [DefaultValue(null)] - public CommandType CommandType { get; set; } - - [RequiredArgument] - public InArgument Sql { get; set; } - - [DependsOn("Sql")] - [DefaultValue(null)] - public IDictionary Parameters { get; } - - [OverloadGroup("DirectMapping")] - [DefaultValue(null)] - public Func Mapper { get; set; } - - [OverloadGroup("MultiplePulseMapping")] - [DefaultValue(null)] - public ActivityFunc MapperFunc { get; set; } -} -``` - -|Argument|Description| -|-|-| -|ProviderName|ADO.NET provider invariant name. If this argument is set, then the `ConnectionString` must also be set.| -|ConnectionString|Connection string to connect to the database. If this argument is set, then `ProviderName` must also be set.| -|ConfigName|Name of the configuration file section where the connection information is stored. When this argument is set `ProviderName` and `ConnectionString` are not required.| -|CommandType|Type of the to be executed.| -|Sql|The SQL command to be executed.| -|Parameters|Collection of the parameters of the SQL query.| -|Mapper|Mapping function (<`DbDataReader`, `TResult`>) that takes a record in the `DataReader` obtained as result of executing the query and returns an instance of an object of type `TResult` to be added to the `Result` collection.

In this case, mapping is done in a single pulse of execution, but it cannot be authored declaratively using the designer.| -|MapperFunc|Mapping function (<`DbDataReader`, `TResult`>) that takes a record in the `DataReader` obtained as result of executing the query and returns an instance of an object of type `TResult` to be added to the `Result` collection.

In this case, the mapping is done in multiple pulses of execution. This function can be serialized to XAML and authored declaratively (any existing activity can participate in the mapping).| -|Result|List of objects obtained as result of executing the query and executing the mapping function for each record in the `DataReader`.| - -## DbQueryDataSet - -Executes a query that returns a . This class performs its work asynchronously. It derives from <`TResult`> and uses its asynchronous capabilities. - -The connection information can be configured by setting a provider invariant name (`ProviderName`) and the connection string (`ConnectionString`) or just using a connection string configuration name (`ConfigFileSectionName`) from the application configuration file. - -The query to be executed is configured in its `Sql` property and the parameters are passed through the `Parameters` collection. - -After the `DbQueryDataSet` is executed the `DataSet` is returned in the `Result out` argument (of type `TResult`, that is defined in the base class ). - -```csharp -public class DbQueryDataSet : AsyncCodeActivity -{ - // public arguments - [RequiredArgument] - [OverloadGroup("ConnectionString")] - [DefaultValue(null)] - public InArgument ProviderName { get; set; } - - [RequiredArgument] - [OverloadGroup("ConnectionString")] - [DependsOn("ProviderName")] - [DefaultValue(null)] - public InArgument ConnectionString { get; set; } - - [RequiredArgument] - [OverloadGroup("ConfigFileSectionName")] - [DefaultValue(null)] - public InArgument ConfigName { get; set; } - - [DefaultValue(null)] - public CommandType CommandType { get; set; } - - [RequiredArgument] - public InArgument Sql { get; set; } - - [DependsOn("Sql")] - [DefaultValue(null)] - public IDictionary Parameters { get; } -} -``` - -|Argument|Description| -|-|-| -|ProviderName|ADO.NET provider invariant name. If this argument is set, then the `ConnectionString` must also be set.| -|ConnectionString|Connection string to connect to the database. If this argument is set, then `ProviderName` must also be set.| -|ConfigName|Name of the configuration file section where the connection information is stored. When this argument is set `ProviderName` and `ConnectionString` are not required.| -|CommandType|Type of the to be executed.| -|Sql|The SQL command to be executed.| -|Parameters|Collection of the parameters of the SQL query.| -|Result| that is obtained after the query is executed.| - -## Configuring Connection Information - -All DbActivities share the same configuration parameters. They can be configured in two ways: - -- `ConnectionString + InvariantName`: Set the ADO.NET provider invariant name and connection string. - - ```csharp - Activity dbSelectCount = new DbQueryScalar() - { - ProviderName = "System.Data.SqlClient", - ConnectionString = @"Data Source=.\SQLExpress; - Initial Catalog=DbActivitiesSample; - Integrated Security=True", - Sql = "SELECT GetDate()" - }; - ``` - -- `ConfigName`: Set the name of the configuration section that contains the connection information. - - ```xml - - - - ``` - -- In the activity: - - ```csharp - Activity dbSelectCount = new DbQueryScalar() - { - ConfigName = "DbActivitiesSample", - Sql = "SELECT COUNT(*) FROM Roles" - }; - ``` - -## Running this sample - -### Setup instructions - -This sample uses a database. A set-up and load script (Setup.cmd) is provided with the sample. You must execute that file using the command prompt. - -The Setup.cmd script invokes the CreateDb.sql script file, which contains SQL commands that do the following: - -- Creates a database called DbActivitiesSample. - -- Creates the Roles table. - -- Creates Employees table. - -- Inserts three records into the Roles table. - -- Inserts twelve records into the Employees table. - -##### To run Setup.cmd - -1. Open a command prompt. - -2. Go to the DbActivities sample folder. - -3. Type "setup.cmd" and press ENTER. - - > [!NOTE] - > Setup.cmd attempts to install the sample in your local machine SqlExpress instance. If you want to install it in other SQL server instance, edit Setup.cmd with the new instance name. - -##### To uninstall the sample database - -1. Run Cleanup.cmd from the sample folder in a command prompt. - -##### To run the sample - -1. Open the solution in Visual Studio 2010 - -2. To compile the solution, press CTRL+SHIFT+B. - -3. To run the sample without debugging, press CTRL+F5. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Scenario\ActivityLibrary\DbActivities` diff --git a/docs/framework/windows-workflow-foundation/samples/designer-rehosting.md b/docs/framework/windows-workflow-foundation/samples/designer-rehosting.md deleted file mode 100644 index a04d18cfd471f..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/designer-rehosting.md +++ /dev/null @@ -1,128 +0,0 @@ ---- -description: "Learn more about: Designer Rehosting" -title: "Designer ReHosting" -ms.date: "03/30/2017" -ms.assetid: b676ad31-5f64-4d84-9a36-b4d7113a2f4d ---- -# Designer Rehosting - -Designer rehosting is a common scenario that refers to hosting the workflow design canvas inside of a custom application. The hosting application most people are familiar with is Visual Studio, however there are a number of scenarios where showing the workflow designer in an application may be useful: - -- Monitoring applications (allowing an end user to visualize the process, as well as runtime data about the process such as the currently active state, aggregate execution time data, or other information about an instance of the workflow). - -- Applications that allow a user to customize the process with a limited set of activities. - - To support these types of applications, the workflow designer ships inside the .NET Framework, and can be hosted inside a WPF application, or in a WinForms application with the appropriate WPF hosting code. This sample demonstrates: - -- Rehosting the WF designer. - -- Using the rehosted toolbox and property grid as well. - -## Rehosting the designer - - This sample shows how to create the WPF layout to contain the designer, seen in the following grid layout (Toolbox code omitted for space concerns). Note the naming of the borders which contain the designer and property grid. - -```xaml - - - - - - - - ... - - - - -``` - - Next the sample creates the designer, and associates its primary and with the appropriate container in the user interface. There are a few additional lines of code in the following example that merit some explanation. The call is required to associate the default activity designers for the activities shipped with .NET Framework. is called to pass in the WF item to be edited. Finally, the (primary canvas) and (property grid) are placed onto the user interface surface. - -```csharp -protected override void OnInitialized(EventArgs e) -{ - base.OnInitialized(e); - // register metadata - (new DesignerMetadata()).Register(); - - // create the workflow designer - WorkflowDesigner wd = new WorkflowDesigner(); - wd.Load(new Sequence()); - DesignerBorder.Child = wd.View; - PropertyBorder.Child = wd.PropertyInspectorView; -} -``` - -## Using the rehosted toolbox - - This sample uses the rehosted toolbox control declaratively in XAML. Note that in code, one can pass a type to the constructor. - -```xaml - - - - System.Activities, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 - - - - - - - - - - - - - System.Activities.Statements.Sequence - - - - - System.Activities.Statements.WriteLine - - - - - - System.Activities.Statements.If - - - - - - System.Activities.Statements.While - - - - - - - - - - -``` - -#### Using the sample - -1. Open the DesignerRehosting.sln solution in Visual Studio 2010. - -2. Press F5 to compile and run the application. - -3. A WPF application starts with a rehosted designer. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Basic\DesignerRehosting\Basic` diff --git a/docs/framework/windows-workflow-foundation/samples/designer.md b/docs/framework/windows-workflow-foundation/samples/designer.md deleted file mode 100644 index d64bdb550c7a7..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/designer.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -description: "Learn more about: Designer" -title: "Designer" -ms.date: "03/30/2017" -ms.assetid: bf28aae3-ddfb-4a86-b55d-1957f08c4e10 ---- -# Designer - -This section contains samples that demonstrate how to use Windows Workflow Designer. - -## In This Section - - [Removing the View State the Designer Adds to an XAML File](removing-the-view-state-the-designer-adds-to-an-xaml-file.md) - Demonstrates how to create a class that derives from and removes view state from a XAML file. - - [Programming Model Item Tree](programming-model-item-tree.md) - Demonstrates how to navigate the tree using declarative data binding from the Windows Presentation Foundation (WPF) Tree View. - - [Property Grid Extensibility](property-grid-extensibility.md) - Demonstrates how to customize the property grid that is displayed when a given activity is selected within the designer. diff --git a/docs/framework/windows-workflow-foundation/samples/document-approval-process.md b/docs/framework/windows-workflow-foundation/samples/document-approval-process.md deleted file mode 100644 index 7fccac34e047c..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/document-approval-process.md +++ /dev/null @@ -1,146 +0,0 @@ ---- -title: "Document Approval Process" -description: This sample demonstrates many Windows Workflow Foundation and Windows Communication Foundation features in a document-approval process scenario. -ms.date: "03/30/2017" -ms.assetid: 9b240937-76a7-45cd-8823-7f82c34d03bd ---- -# Document Approval Process - -This sample demonstrates the use of many Windows Workflow Foundation (WF) and Windows Communication Foundation (WCF) features together. Together they implement a document approval process scenario. A client application can submit documents for approval and approve documents. An approval manager application exists to facilitate communications between clients and to enforce the rules of the approval process. The approval process is a workflow that can execute several types of approval. Activities exist to get a single approval, a quorum approval (a percentage of set of approvers), and a complex approval process that consists of a quorum and single approval in a sequence. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Application\DocumentApprovalProcess` - -## Sample Details - -The following graphic demonstrates the document approval process workflow: - -![A document approval process workflow](./media/document-approval-process/document-approval-process.jpg) - -From the client's perspective, the approval process functions as follows: - -1. A client subscribes to be a user in the approval process system. - -2. A WCF client sends to a WCF service hosted by the approval manager application. - -3. A unique user ID is returned to the client. The client can now participate in approval processes. - -4. Once joined, a client can send a document for approval using single, quorum or complex approval processes. - -5. A button in the client’s interface is clicked, starting a workflow instance in a client Workflow Service Host. - -6. The workflow sends an approval request to the approval manager application. - -7. The workflow manager starts a workflow on its own side to represent an approval process. - -8. Once the manager approval workflow executes, the results are sent back to the client. - -9. The client displays the results. - -10. A client may receive an approval request and respond to the request at any point in time. - -11. A WCF service hosted on the client can receive an approval request from the approval manager application. - -12. The document information is presented on the client for review. - -13. The user can approve or reject the document. - -14. A WCF client is used to send an approval response back to the approval manager application. - -From the approval manager application’s point of view, the approval process functions as follows: - -1. A client requests to participate to the approval process system. - -2. A WCF service on the approval manager receives a request to be part of the approval process system. - -3. A unique ID is generated for the client. The user information is stored in a database. - -4. The unique ID is sent back to the user. - -5. An approval request is receive. The approval manager executes an approval process. - -6. An approval request is received by the approval manager, starting a new workflow. - -7. Depending on the type of request (simple, quorum, or complex) a different activity is executed. - -8. Send and Receive activities with correlation are used to send the approval request to the client for review and receive the response. - -9. The result of the approval process workflow is sent to the client. - -## Using the Sample - -##### To set up the database - -1. From a Visual Studio 2010 command prompt opened with Administrator privileges, navigate to this DocumentApprovalProcess folder and run Setup.cmd. - -##### To set up the application - -1. Using Visual Studio 2010, open the DocumentApprovalProcess.sln solution file. - -2. To build the solution, press CTRL+SHIFT+B. - -3. To run the solution, launch the Approval Manager Application by right-clicking the ApprovalManager project in the **Solution Explorer** and clicking **Debug**->**Start** new instance from the right-click menu. - - Wait for the manager’s output to let you know that it is ready. - -##### To run the single approval scenario - -1. Open a command prompt with administrator permission. - -2. Navigate to the directory that contains the solution. - -3. Navigate to the ApprovalClient\Bin\Debug folder and execute two instances of ApprovalClient.exe. - -4. Click **discover**, wait until the **subscribe** button is enabled. - -5. Type any user name and click **subscribe**. For one client, use `UserType1` and the other type `UserType2`. - -6. In the `UserType1` client, select the single approval type from the drop down menu and type a document name and content. Click **Request Approval**. - -7. In the `UserType2` client, a document awaiting approval appears. Select it and press **approve** or **reject**. The results should show in the `UserType1` client. - -##### To run the quorum approval scenario - -1. Open a command prompt with administrator permission. - -2. Navigate to the directory that contains the solution. - -3. Navigate to the ApprovalClient\Bin\Debug folder and execute three instances of ApprovalClient.exe. - -4. Click **discover**, wait until the **subscribe** button is enabled. - -5. Type any user name and click **subscribe**. For one client use `UserType1` and the other two type `UserType2`. - -6. In the `UserType1` client, select the quorum approval type from the drop down menu and type a document name and content. Click **Request Approval**. This requests that the two `UserType2` clients approve or reject the document. While both `UserType2` clients must respond, only one client must approve the document for it to be approved. - -7. In the `UserType2` clients, a document awaiting approval appears. Select it and press **approve** or **reject**. The results should show in the `UserType1` client. - -##### To run the complex approval scenario - -1. Open a command prompt with administrator permission. - -2. Navigate to the directory that contains the solution. - -3. Navigate to the ApprovalClient\Bin\Debug folder and execute four instances of ApprovalClient.exe. - -4. Click **discover**, wait until the **subscribe** button is enabled. - -5. Type any user name and click **subscribe**. For one client use `UserType1`, in two uses type `UserType2`, and in the last use `UserType3`. - -6. In the `UserType1` client, select the single approval type from the drop down menu and type a document name and content. Click **Request Approval**. - -7. In the `UserType2` clients, a document awaiting approval appears. Select it and press **approve**, the document is passed to the `UserType3` client. - - If the document is approved by the first `UserType2` quorum, the document is passed to the `UserType3` client. - -8. Approve or reject the document from the `UserType3` client. The results should show in the `UserType1` client. - -##### To clean up - -1. From a Visual Studio 2010 command prompt, navigate to the DocumentApprovalProcess folder and run Cleanup.cmd. diff --git a/docs/framework/windows-workflow-foundation/samples/execution.md b/docs/framework/windows-workflow-foundation/samples/execution.md deleted file mode 100644 index a86b4226cc169..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/execution.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -description: "Learn more about: Execution" -title: "Execution" -ms.date: "03/30/2017" -ms.assetid: a9dcedcc-9f4c-45c2-8222-6bcbf48f3534 ---- -# Execution - -This section contains samples that demonstrate executing workflows in Windows Workflow Foundation (WF). - -## In This Section - - [Creating and Running a Workflow Instance](creating-and-running-a-workflow-instance.md) - Demonstrates how to run a workflow instance. It shows how to execute it synchronously and asynchronously. - - [WorkflowHostingEndpoint Resume Bookmark](workflowhostingendpoint-resume-bookmark.md) - Demonstrates how the can be used with to create workflow instances. - - [Bookmark Resolver for WorkflowHostingEndpoint](bookmark-resolver-for-workflowhostingendpoint.md) - Demonstrates how the can be used with to resume custom bookmarks on workflow instances. diff --git a/docs/framework/windows-workflow-foundation/samples/external-ruleset-toolkit.md b/docs/framework/windows-workflow-foundation/samples/external-ruleset-toolkit.md deleted file mode 100644 index b489243405014..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/external-ruleset-toolkit.md +++ /dev/null @@ -1,127 +0,0 @@ ---- -description: "Learn more about: External Ruleset Toolkit" -title: "External Ruleset Toolkit" -ms.date: "03/30/2017" -ms.assetid: a306d283-a031-475e-aa01-9ae86e7adcb0 ---- - -# External Ruleset Toolkit - -Normally when rules are used within a workflow application, the rules are part of the assembly. In some scenarios, you may want to maintain the RuleSets separately from the assembly so that they can be updated without rebuilding and deploying the workflow assembly. This sample allows you to manage and edit RuleSets in a database and access those RuleSets from a workflow at runtime. This enables running workflow instances to automatically incorporate RuleSet changes. - -The External RuleSet Toolkit sample contains a Windows Forms-based tool that you can use to manage and edit RuleSet versions in a database. It also includes an activity and a host service for executing those rules. - -> [!NOTE] -> This sample requires [Microsoft SQL Server](/sql). - -Visual Studio provides a RuleSet editor as part of the Windows Workflow Foundation (WF). You can start this editor by double-clicking the `Policy` activity in a workflow; it serializes the defined RuleSet object to the .rules file associated with the workflow (a `Policy` activity runs a RuleSet instance against the workflow). The .rules file is compiled into the assembly as a resource when you build the workflow project. - -The components of this sample include: - -- A RuleSet graphical user interface tool that you can use to edit and manage RuleSet versions in the database. - -- A RuleSet service that is configured on the host application and accesses RuleSets from the database. - -- An `ExternalPolicy` activity that requests a RuleSet from the RuleSet service and runs the RuleSet against the workflow. - -The interaction of the components is shown in the following image. The sections that follow describe each component. - -![Diagram showing the External RuleSet Toolkit sample overview.](./media/external-ruleset-toolkit/ruleset-toolkit-overview.gif) - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Scenario\ExternalRuleSetToolKit` - -## RuleSet Tool - -The following image is a screenshot of the RuleSet tool. From the **Rule Store** menu, you can load the available RuleSets from the database and save modified RuleSets back to the store. An application configuration file provides a database connection string for the RuleSet database. When you start the tool, it automatically loads the RuleSets from the configured database. - -![Screenshot showing the RuleSet Browser.](./media/external-ruleset-toolkit/ruleset-browser-dialog.gif) - -The RuleSet tool applies major and minor version numbers to the RuleSets, allowing you to simultaneously maintain and store multiple versions (the tool provides no locking or other configuration management features in addition to the versioning capability). Using the tool, you can create new RuleSet versions or delete existing versions. When you click **New**, the tool creates a new RuleSet name and applies version 1.0. When you copy a version, the tool creates a copy of the selected RuleSet version, including the contained rules, and assigns new, unique version numbers. These version numbers are based on the version numbers of existing RuleSets. You can change the RuleSet name and version numbers using the associated fields on the form. - -When you click **Edit Rules**, the RuleSet editor starts, as shown in the following image: - -![Screenshot showing the RuleSet Editor.](./media/external-ruleset-toolkit/ruleset-editor-dialog.gif) - -This is a re-hosting of the editor dialog that is part of the Windows Workflow Foundation Visual Studio add-in. It provides the same functionality, including Intellisense support. The rules are authored against a target type (such as a workflow) that is associated with the RuleSet in the tool; when you click **Browse** in the main tool dialog, the **Workflow/Type Selector** dialog appears, as shown in Figure 4. - -![Workflow /Type Selection](./media/71f08d57-e8f2-499e-8151-ece2cbdcabfd.gif "71f08d57-e8f2-499e-8151-ece2cbdcabfd") - -Figure 4: Workflow/Type Selector - -You can use the **Workflow/Type Selector** dialog to specify an assembly and a specific type within that assembly. This type is the target type against which the rules are authored (and run). In many cases, the target type is a workflow or some other activity type. However, you can run a RuleSet against any .NET type. - -The path to the assembly file and the type `name are stored with the` RuleSet in the database, so that when the RuleSet is retrieved from the database, the tool attempts to automatically load the target type. - -When you click **OK** in the **Workflow/Type Selector** dialog, it validates the selected type against the RuleSet, to ensure that the target type has all the members referenced by the rules. Errors are shown in a **Validation Errors** dialog. You can choose to continue with the change despite the errors, or click **Cancel**. From the **Tools** menu in the main tool dialog, you can click **Validate** to re-validate the RuleSet version against the target activity. - -![Screenshot showing the Validation Errors dialog.](./media/external-ruleset-toolkit/validation-errors-dialog.png) - -From the **Data** menu in the tool, you can import and export RuleSets. When you click **Import**, a file-chooser dialog appears, from which you can select a .rules file. This may or may not be a file initially created in Visual Studio. The .rules file should contain a serialized `RuleDefinitions` instance that contains a collection of conditions and a collection of RuleSets. The tool does not use the conditions collection, but it does use the `RuleDefinitions` .rules format to allow interaction with the Visual Studio environment. - -After selecting a .rules file, a **RuleSet Selector** dialog appears. You can use the dialog to select the RuleSets from the file that you want to import (the default specifies all RuleSets). RuleSets in the .rules file do not have version numbers, because their versioning within a WF project is the same as the version of the assembly. During the importing process, the tool automatically assigns the next available major version number (which you can change after importing); you can see the assigned version numbers in the **RuleSet Selector** list. - -For each RuleSet it imports, the tool attempts to locate the associated type from the bin\Debug folder under the location of the .rules file (if it exists), based on the members used in the RuleSet. If the tool finds multiple matching types, it attempts to choose a type based on a match between the .rules file name and the type name (for example, the `Workflow1` type corresponds to Workflow1.rules). If multiple matches exist, you are prompted to select the type. If this auto-identification mechanism fails to locate a matching assembly or type, then after importing you can click **Browse** on the main tool dialog to navigate to the associated type. The following image shows the RuleSet Selector: - -![Screenshot showing the RuleSet Selector dialog.](./media/external-ruleset-toolkit/ruleset-selector-dialog.gif) - -When you click **Data-Export** from the main tool menu, the **RuleSet Selector** dialog appears again, from which you can determine the RuleSets from the database that should be exported. When you click **OK**, a **Save File** dialog appears, in which you can specify the name and location of the resulting .rules file. Because the .rules file does not contain version information, you can only select one RuleSet version with a given RuleSet name. - -## PolicyFromService Activity - -The code for the `PolicyFromService` activity is straightforward. It works much like the `Policy` activity provided with WF, but instead of retrieving the target RuleSet from the .rules file, it calls a host service to obtain the RuleSet instance. It then runs the RuleSet against the root workflow activity instance. - -To use the activity in a workflow, add a reference to the `PolicyActivities` and `RuleSetService` assemblies from your workflow project. See the procedure at the end of this topic for a discussion of how to add the activity to the toolbox. - -After placing the activity in your workflow, you must provide the name of the RuleSet to be run. You can enter the name as a literal value, or bind to a workflow variable or property of another activity. Optionally, you can enter version numbers for the specific RuleSet that should be run. If you leave the default value of 0 for the major and minor version numbers, the latest version number in the database is automatically provided for the activity. - -## RuleSet Service - -The service is responsible for retrieving the specified RuleSet version from the database and returning it to the calling activity. As previously discussed, if the major and minor version values passed in the `GetRuleSet` call are both 0, the service retrieves the latest version. At this point, there is no caching of RuleSet definitions or instances; similarly, there are no features for marking RuleSet versions as "deployed" to differentiate them from in-progress RuleSets. - -The database to be accessed by the service should be configured on the host using an application configuration file. - -#### To run the tool - -1. The folder that sets up the RuleSet table used by the tool and the service contains a Setup.sql file. You can run the Setup.cmd batch file to create the Rules database on SQL Express and to set up the RuleSet table. - -2. If you edit the batch file or Setup.sql and specify not to use SQL Express or to place the table in a database named something other than `Rules`, the application configuration files in the RuleSet tool and `UsageSample` projects should be edited with the same information. - -3. After you run the Setup.sql script, you can build the `ExternalRuleSetToolkit` solution and then launch the RuleSet tool from the ExternalRuleSetTool project. - -4. The `RuleSetToolkitUsageSample` Sequential Workflow Console Application solution includes a sample workflow. The workflow consists of a `PolicyFromService` activity and two variables, `orderValue` and `discount`, against which the target RuleSet runs. - -5. To use the sample, build the `RuleSetToolkitUsageSample` solution. Then from the RuleSet tool main menu, click **Data-Import** and point to the DiscountRuleSet.rules file in the RuleSetToolkitUsageSample folder. Click the **Rule Store-Save** menu option to save the imported RuleSet to the database. - -6. Because the `PolicyActivities` assembly is referenced from the sample workflow project, the `PolicyFromService` activity appears in the workflow. It does not, however, appear in the toolbox by default. To add it to the toolbox, do the following: - - - Right-click the toolbox and select **Choose Items** (this may take a while). - - - When the **Choose Toolbox Items** dialog appears, click the **Activities** tab. - - - Browse to the `PolicyActivities` assembly in the `ExternalRuleSetToolkit` solution and click **Open**. - - - Ensure that the `PolicyFromService` activity is selected in the **Choose Toolbox Items** dialog and then click **OK**. - - - The activity should now appear in the toolbox in the **RuleSetToolkitUsageSample Components** category. - -7. The RuleSet service is already configured on the console application host using the following statement in Program.cs. - - ```csharp - workflowRuntime.AddService(new RuleSetService()); - ``` - -8. You can also configure the service on the host using a configuration file; see the SDK documentation for details. - -9. An application configuration file is added to the workflow project to specify the connection string for the database to be used by the service. This should be the same connection string used by the RuleSet tool, which points to the database that contains the RuleSet table. - -10. You can now run the `RuleSetToolkitUsageSample` project as you would any other workflow console application. Press F5 or Ctrl+F5 within Visual Studio or run the RuleSetToolkitUsageSample.exe file directly. - - > [!NOTE] - > You must close the RuleSet tool to recompile the usage sample, because the tool loads the usage sample assembly. diff --git a/docs/framework/windows-workflow-foundation/samples/externalized-policy-activity-in-net-framework-4-5.md b/docs/framework/windows-workflow-foundation/samples/externalized-policy-activity-in-net-framework-4-5.md deleted file mode 100644 index a8451665d3290..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/externalized-policy-activity-in-net-framework-4-5.md +++ /dev/null @@ -1,89 +0,0 @@ ---- -description: "Learn more about: Externalized Policy Activity in .NET Framework 4.5" -title: "Externalized Policy Activity in .NET Framework 4.5" -ms.date: "03/30/2017" -ms.assetid: 92fd6f92-23a1-4adf-b96a-2754ea93ad3e ---- -# Externalized Policy Activity in .NET Framework 4.5 - -This sample demonstrates how the ExternalizedPolicy4 activity allows executing existing .NET Framework 3.5 Windows Workflow Foundation (WF 3.5) objects in [!INCLUDE[netfx_current_long](../../../../includes/netfx-current-long-md.md)] Windows Workflow Foundation (WF 4.5) directly by using the rules engine that is shipped in WF 3.5. By using this activity, you can open and execute any existing WF 3.5 . For more information about WF 3.5 Rules Engine included as part of Windows Workflow Foundation, please read [Introduction to the Windows Workflow Foundation Rules Engine](/previous-versions/dotnet/articles/aa480193(v=msdn.10)). For more information about migrating rules to [!INCLUDE[wf1](../../../../includes/wf1-md.md)] in [!INCLUDE[netfx_current_short](../../../../includes/netfx-current-short-md.md)], see the [Migration Guidance](../migration-guidance.md). - -## Projects in this Sample - -|Project Name|Description|Main Files| -|-|-|-| -|ExternalizedPolicy4|Contains the ExternalizedPolicy4 activity and its WF 4.5 designer.|**ExternalizedPolicy4.cs**: activity definition.

**ExternalizedPolicy4Designer.xaml**: Custom designer for ExternalizedPolicy4 activity. It uses the Rules editor () from WF 3.5 Rules Engine.| -|ImperativeCodeClientSample|Sample client application that configures and runs a workflow using an ExternalizedPolicy4 application using imperative C# code (no designer used).|**ApplyDiscount.rules**: File with [!INCLUDE[wf1](../../../../includes/wf1-md.md)] rule definitions.

**Order.cs**: Type that represents a customer order. Rules are applied to objects of this type.

**Program.cs**: Configures and runs a workflow that has a Policy4 activity to apply rules defined in ApplyDiscount.rules to instances of Order objects.

App.config: The configuration file with the path of the rules file.| -|DesignerClientSample|Sample client application that configures and runs a workflow using an ExternalPolicy4 application in the [!INCLUDE[wf1](../../../../includes/wf1-md.md)] Designer.|**Sequence1.xaml**: Sequential workflow that uses a Policy4 activity to perform rule evaluations.

**Program.cs**: Runs an instance of the workflow defined in Sequence1.xaml.| - -## The ExternalizedPolicy4 Activity - -The ExternalizedPolicy4 activity is a that allows executing WF 3.5 objects within WF 4.5 workflows. The following example is a simplified definition of the public object model of the activity. - -```csharp -public class ExternalizedPolicy4Activity: CodeActivity -{ - public string RulesFilePath - - public string RuleSetName - - [RequiredArgument] - public InArgument TargetObject - - [RequiredArgument] - public OutArgument ResultObject - - public OutArgument ValidationErrors -} -``` - -|Property|Description| -|-|-| -|RuleSetFilePath|Path to the .NET Framework 3.5 file to be evaluated when the activity is executed.| -|RuleSetName|Name of the to be used within the .rules file.| -|TargetObject|The object on which the objects in the is evaluated against.| -|ResultObject|The resulting object after the rules are applied (for example, rules are applied against the Input argument and the result is stored in the Result argument.| -|ValidationError|The list of validation errors returned by the WF 3.5 Rules Engine when validating the against the target object before execution.| - -## ExternalizedPolicy4 Activity Designer - -The ExternalizedPolicy4 designer allows you to configure an activity to use an existing RuleSet without writing code. Just set the path where the .rules file is located and specify the name that you want use. It also allows you to modify the . After building the solution, it can be found in the toolbox in the section Microsoft.Samples.Activities.Rules. The designer allows you to select a .rules file and a . When the **Edit RuleSet** button is clicked, the WF 3.5 is displayed. This dialog is the re-hosted WF 3.5 rules editor and it is used to view and edit the rules that the ExternalizedPolicy4 activity executes. - -## Policy4 and ExternalPolicy4 - -The Policy activity allows you to create and execute a .NET Framework 3.5 RuleSet in a WF 4.5 workflow. The is serialized inline in the Policy4 activity XAML definition. The ExternalizedPolicy4 sample shows how to use an existing external (contained in a .rules file). - -## Use this sample - -No special set-up is required to run this sample. Open the solution in Visual Studio, and then press **F5** to run the application. - -This sample contains two client applications: ImperativeCodeClientSample and DesignerClientSample. The ImperativeCodeClientSample client shows how to configure and run the ExternalizedPolicy4 activity using C# imperative code. The DesignerClientSample shows how to configure and run the ExternalizedPolicy4 activity using the designer. - -### Run the ImperativeCodeClientSample application - -1. Using Visual Studio, open the *Policy4sample.sln* solution file. - -2. In **Solution Explorer**, right-click the **ImperativeCodeClientSample** project and then select **Set as startup project**. - -3. To run the project, press **Ctrl**+**F5**. - -### Run the DesignerClientSample application - -1. Using Visual Studio, open the *Policy4sample.sln* solution file. - -2. In **Solution Explorer**, right-click the **DesignerClientSample** project and then select **Set as startup project**. - -3. Press **Ctrl**+**Shift**+**B** to compile the project. - -4. Press **Ctrl**+**F5** to run the project. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. -> -> This sample is located in the following directory: -> -> `:\WF_WCF_Samples\WF\Scenario\ActivityLibrary\Rules-ExternalizedPolicy4` diff --git a/docs/framework/windows-workflow-foundation/samples/fault-handling-in-a-flowchart-activity-using-trycatch.md b/docs/framework/windows-workflow-foundation/samples/fault-handling-in-a-flowchart-activity-using-trycatch.md deleted file mode 100644 index 6a9f36b4a8fe5..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/fault-handling-in-a-flowchart-activity-using-trycatch.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -description: "Learn more about: Fault Handling in a Flowchart Activity Using TryCatch" -title: "Fault Handling in a Flowchart Activity Using TryCatch" -ms.date: "03/30/2017" -ms.assetid: 50922964-bfe0-4ba8-9422-0e7220d514fd ---- -# Fault Handling in a Flowchart Activity Using TryCatch - -This sample shows how the activity can be used within a complex control flow activity. - -In this sample, a promotion code and number of children are passed as variables to a activity that calculates a discount based on formulae that correspond to the promotion code. The sample includes imperative code and workflow designer versions of the sample. - -The following table details the variables for the `CreateFlowchartWithFaults` activity. - -|Parameters|Description| -|----------------|-----------------| -|promoCode|The promotion code. Type: String

The possible values with description in parentheses:

- Single (Single)
- MNK (Married with no kids.)
- MWK (Married with kids.)| -|numKids|The number of children. Type: int| - -The `CreateFlowchartWithFaults` activity uses a activity that switches on the `promoCode` argument and calculates the discount using the following formula. - -|Value of `promoCode`|Discount (%)| -|--------------------------|--------------------| -|Single|10| -|MNK|15| -|MWK|15 + (1 – 1/`numberOfKids`)\*10 **Note:** Potentially, this calculation can throw a . So, the discount calculation is wrapped in a activity that catches the exception and sets the discount to zero.| - -#### To use this sample - -1. Using Visual Studio 2010, open the FlowchartWithFaultHandling.sln solution file. - -2. To build the solution, press CTRL+SHIFT+B. - -3. To run the solution, press F5. - -> [!IMPORTANT] -> The samples may already be installed on your computer. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Basic\Built-InActivities\FlowChartWithFaultHandling` - -## See also - -- [Flowchart Workflows](../flowchart-workflows.md) -- [Exceptions](../exceptions.md) diff --git a/docs/framework/windows-workflow-foundation/samples/get-workflowinstanceid.md b/docs/framework/windows-workflow-foundation/samples/get-workflowinstanceid.md deleted file mode 100644 index 6545990a2b9cf..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/get-workflowinstanceid.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -description: "Learn more about: Get WorkflowInstanceId" -title: "Get WorkflowInstanceId" -ms.date: "03/30/2017" -ms.assetid: bd7eea3b-1c28-4b84-9a67-003bc553aa81 ---- -# Get WorkflowInstanceId - -This sample demonstrates how to use the custom activity, `GetWorkflowInstanceId` to return the workflow instance ID. - -## Demonstrates - - Custom activity development, how to access the workflow instance. - -## Discussion - - Getting the instance ID of a running workflow requires writing code. If you want to write a fully-declarative workflow, then you need an activity that can return the workflow instance ID so that the activity can be referenced in the workflow to provide a fully-declarative workflow authoring experience. Many scenarios require access to the instance ID: a few examples are for logging or auditing purposes or for doing application-level correlation by providing the instance ID back to a client for future association (for example, by using this activity inside a SendReply activity). - - `GetWorkflowInstanceId` is implemented as a because it must return a value of type , and it must have access to the for getting the workflow’s instance ID. Its implementation is fairly basic. - -```csharp -public sealed class GetWorkflowInstanceId : CodeActivity -{ - protected override Guid Execute(CodeActivityContext context) - { - return context.WorkflowInstanceId; - } -} -``` - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Scenario\ActivityLibrary\GetWorkflowInstanceId` diff --git a/docs/framework/windows-workflow-foundation/samples/hiring-process.md b/docs/framework/windows-workflow-foundation/samples/hiring-process.md deleted file mode 100644 index 03d3ce2fd3ad5..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/hiring-process.md +++ /dev/null @@ -1,236 +0,0 @@ ---- -description: "Learn more about: Hiring Process" -title: "Hiring Process" -ms.date: "03/30/2017" -ms.assetid: d5fcacbb-c884-4b37-a5d6-02b1b8eec7b4 ---- -# Hiring Process - -This sample demonstrates how to implement a business process using messaging activities and two workflows hosted as workflow services. These workflows are part of the IT infrastructure of a fictional company called Contoso, Inc. - - The `HiringRequest` workflow process (implemented as a ) asks for authorization from several managers in the organization. To achieve this goal, the workflow uses other existing services in the organization (in our case, an inbox service and an organizational data service implemented as plain Windows Communication Foundation (WCF) services). - - The `ResumeRequest` workflow (implemented as a ) publishes a job posting in Contoso's external careers Web site and manages the acquisition of resumes. A job posting is available in the external Web site for a fixed period of time (until a timeout expires) or until an employee from Contoso decides to remove it. - - This sample demonstrates the following features of [!INCLUDE[netfx_current_long](../../../../includes/netfx-current-long-md.md)]: - -- and workflows for modeling business processes. - -- Workflow Services. - -- Messaging Activities. - -- Content-based correlation. - -- Custom activities (declarative and code-based). - -- System-provided SQL server persistence. - -- Custom . - -- Custom tracking. - -- Event Tracking for Windows (ETW) Tracking. - -- Composition of activities. - -- activities. - -- activity. - -- Durable timers ( activity). - -- Transactions. - -- More than one workflow in the same solution. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Application\HiringProcess` - -## Description of the Process - - Contoso, Inc. wants to have close control of the headcount in each of its departments. Therefore, anytime any employee wants to start a new hiring process, they need to go through a hiring request process approval before the recruiting can actually happen. This process is called hiring process request (defined in the HiringRequestService project) and consists of the following steps: - -1. An employee (the requester) starts the hiring process request. - -2. The requester's manager must approve the request: - - 1. The manager can reject the request. - - 2. The manager can return the request to the requester for additional information: - - 1. The requester reviews and sends the request back to the manager. - - 3. The manager can approve. - -3. After the requester's manager approves, the department owner must approve the request: - - 1. The department owner can reject. - - 2. The department owner can approve. - -4. After the department owner approves, the process requires the approval of 2 HR managers or the CEO: - - 1. The process can transition to the accepted or rejected state. - - 2. If the process is Accepted, a new instance of the `ResumeRequest` workflow is started (`ResumeRequest` is linked to HiringRequest.csproj through a service reference.) - - Once the managers approve the hiring of a new employee, HR must find the appropriate candidate. This process is performed by the second workflow (`ResumeRequest`, defined in ResumeRequestService.csproj). This workflow defines the process for submitting a job posting with a career opportunity to Contoso's external Careers Web site, receives resumes from applicants, and monitors the state of the job posting. Positions are available for a fixed time period (until a time expires) or until an employee from Contoso decides to remove it. The `ResumeRequest` workflow consists of the following steps: - -1. An employee from Contoso types in the information about the position and a time-out duration. Once the employee types in this information, the position is posted in the Careers Web site. - -2. Once the information is published, interested parties can submit their resumes. When a resume is submitted, it is stored in a record linked to the job opening. - -3. Applicants can submit resumes until the time-out expires or someone from Contoso HR department explicitly decides to remove the posting by stopping the process. - -## Projects in the sample - - The following table shows the projects in the sample solution. - -|Project|Description| -|-------------|-----------------| -|ContosoHR|Contains data contracts, business objects, and repository classes.| -|HiringRequestService|Contains the definition of the Hiring Request Process workflow.

This project is implemented as a console application that self-hosts the workflow (xaml file) as a service.| -|ResumeRequestService|A workflow service that collects resumes from candidates until a time-out expires or someone decides that the process has to be stopped.

This project is implemented as a declarative workflow service (xamlx).| -|OrgService|A service that exposes organizational information (Employees, Positions, PositionTypes, and Departments). You can think of this service as the Company Organization module of an Enterprise Resource Plan (ERP).

This project is implemented as a console application that exposes a Windows Communication Foundation (WCF) service.| -|InboxService|An inbox that contains actionable tasks for employees.

This project is implemented as a console application that exposes a WCF service.| -|InternalClient|A Web application for interacting with the process. Users can start, participate, and view their HiringProcess workflows. Using this application, they can also start and monitor ResumeRequest processes.

This site is implemented to be internal to Contoso's intranet. This project is implemented as an ASP.NET Web site.| -|CareersWebSite|An external Web site that exposes the open positions in Contoso. Any potential candidate can navigate to this site and submit a resume.| - -## Feature summary - - The following table describes how each feature is used in this sample. - -|Feature|Description|Project| -|-------------|-----------------|-------------| -|Flowchart|The business process is represented as a flowchart . This flowchart description represents the process in the same way in which a business would have drawn it in a whiteboard.|HiringRequestService| -|Workflow services|The Flowchart with the process definition is hosted in a service (in this example, the service is hosted in a console application).|HiringRequestService| -|Messaging activities|The flowchart uses messaging activities in two ways:

- To get information from the user (to receive the decisions and related information in each approval step).
- To interact with other existing services (InboxService and OrgDataService, used through service references).|HiringRequestService| -|Content-based correlation|Approval messages correlate on the ID property of the hiring request:

- When a process is started, the correlation handle is initialized with the ID of the request.
- Incoming approval messages correlate on their ID (the first parameter of each approval message is the ID of the request).|HiringRequestService / ResumeRequestService| -|Custom activities (declarative and code based)|There are several custom activities in this sample:

- `SaveActionTracking`: This activity emits a custom (using ). This activity has been authored using imperative code extending .
- `GetEmployeesByPositionTypes`: This activity receives a list of position type IDs and returns a list of people that have that position in Contoso. This activity has been authored declaratively (using the activity designer).
- `SaveHiringRequestInfo`: This activity saves the information of a `HiringRequest` (using `HiringRequestRepository.Save`). This activity has been authored using imperative code extending .|HiringRequestService| -|System-provided SQL Server Persistence|The instance that hosts the Flowchart process definition is configured to use the system-provided SQL Server persistence.|HiringRequestService / ResumeRequestService| -|Custom Tracking|The sample includes a custom tracking participant that saves the history of a `HiringRequestProcess` (this records what action has been done, by whom, and when). The source code is in the Tracking folder of HiringRequestService.|HiringRequestService| -|ETW Tracking|System-provided ETW Tracking is configured in the App.config file in the HiringRequestService service.|HiringRequestService| -|Composition of Activities|The process definition uses the free composition of . The Flowchart contains several Sequence and Parallel activities that at the same time contain other activities (and so on).|HiringRequestService| -|Parallel Activities|- is used to register in the Inbox of the CEO and HR Managers in parallel (Waiting for two HR Managers' Approval step).
- is used to do some clean-up tasks in the Completed and Rejected steps|HiringRequestService| -|Model Cancellation|The Flowchart uses to create cancellation behavior (in this case it does some clean-up.)|HiringRequestService| -|Customer Persistence Participant|`HiringRequestPersistenceParticipant` saves data from a workflow variable to a table stored in the Contoso HR database.|HiringRequestService| -|Workflow Services|`ResumeRequestService` is implemented using workflow services. Workflow definition and service information are contained in ResumeRequestService.xamlx. The service is configured to use persistence and tracking.|ResumeRequestService| -|Durable Timers|`ResumeRequestService` uses durable timers to define the duration of a Job Posting (once a time-out expires, the Job Posting is closed).|ResumeRequestService| -|Transactions| is used to ensure consistency of data within the execution of several activities (when a new resume is received).|ResumeRequestService| -|Transactions|The custom persistence participant (`HiringRequestPersistenceParticipant`) and custom tracking participant (`HistoryFileTrackingParticipant`) use the same transaction.|HiringRequestService| -|Using [!INCLUDE[wf1](../../../../includes/wf1-md.md)] in ASP.NET applications.|Workflows are accessed from two ASP.NET applications.|InternalClient / CareersWebSite| - -## Data Storage - - Data is stored in a SQL Server database called `ContosoHR` (the script for creating this database is located in the `DbSetup` folder). Workflow instances are stored in a SQL Server database called `InstanceStore` (the scripts for creating the instance store are part of the [!INCLUDE[netfx_current_short](../../../../includes/netfx-current-short-md.md)] distribution). - - Both databases are created by running Setup.cmd script from a Developer Command Prompt for Visual Studio. - -## Running the sample - -#### To create the databases - -1. Open a Developer Command Prompt for Visual Studio. - -2. Navigate to the sample folder. - -3. Run Setup.cmd. - -4. Verify that the two databases `ContosoHR` and `InstanceStore` were created in SQL Express. - -#### To set up the solution for execution - -1. Run Visual Studio as an administrator. Open HiringRequest.sln. - -2. Right-click the solution in **Solution Explorer** and select **Properties**. - -3. Select the option **Multiple Startup Projects** and set the **CareersWebSite**, **InternalClient**, **HiringRequestService**, and **ResumeRequestService** to **Start**. Leave **ContosoHR**, **InboxService**, and **OrgService** as None. - -4. Build the solution by pressing CTRL+SHIFT+B. Verify that the build succeeded. - -#### To run the solution - -1. After the solution builds, press CTRL+F5 to run without debugging. Verify that all services have started. - -2. Right-click **InternalClient** in the solution and then select **View in Browser**. The default page for `InternalClient` is displayed. Ensure that services are running, and click the link. - -3. The **HiringRequest** module is displayed. You can follow the scenario detailed here. - -4. Once the `HiringRequest` is complete, you can start the `ResumeRequest`. You can follow the scenario detailed here. - -5. When the `ResumeRequest` is posted, it is available in the public Web site (Contoso Careers Web Site). To see the Job Posting (and apply for the position), navigate to the Careers Web Site. - -6. Right-click **CareersWebSite** in the solution and select **View in Browser**. - -7. Navigate back to the `InternalClient` by right-clicking **InternalClient** in the solution and selecting **View in Browser**. - -8. Go to the **JobPostings** section by clicking the **Job Postings** link in the inbox top menu. You can follow the scenario detailed here. - -## Scenarios - -### Hiring request - -1. Michael Alexander (Software Engineer) wants to request a new position for hiring a Software Engineer in Test (SDET) in the Engineering department who has at least 3 years of experience in C#. - -2. After being created, the request appears in Michael's inbox (click **Refresh** if you do not see the request) awaiting Peter Brehm's approval, who is Michael's manager. - -3. Peter wants to act on Michael's request. He thinks the position demands 5 years of C# experience instead of 3, so he sends his comments back for review. - -4. Michael sees a message in his inbox from his manager and wants to act. Michael sees the history of the position request and agrees with Peter. Michael modifies the description to require 5 years of C# experience and accepts the modification. - -5. Peter acts on Michael's modified request and accepts it. The request now must be approved by the Director of Engineering, Tsvi Reiter. - -6. Tsvi Reiter wants to expedite the request, so he puts in a comment to say that the request is urgent and accepts it. - -7. The request now has to be approved by two HR managers or the CEO. The CEO, Brian Richard Goldstein, sees the urgent request by Tsvi. He acts on the request by accepting it, thus bypassing the approval by two HR managers. - -8. The request is removed from Michael's inbox and the process of hiring an SDET has now begun. - -### Start Resume Request - -1. Now, the job position is waiting to be posted to an external Web site where people can apply (you can see it clicking the **Job Postings** link). Currently, the job position is sitting with an HR representative who is responsible for finalizing the job position and posting it. - -2. HR wants to edit this job position (by clicking the **Edit** link) by setting a time-out of 60 minutes (in real life, this could be days or weeks). The time-out allows the job position to be taken off the external Web site according to the time specified. - -3. After saving the edited job position, it appears in the **Receiving Resumes** tab (refresh the Web page to see the new job position). - -### Collecting Resumes - -1. The job position should appear on the external Web site. As a person interested in applying for the job, you may apply for this position and submit your resume. - -2. If you go back to the Job Postings List service, you can "view resumes" that have been collected so far. - -3. HR can also stop collecting resumes (for example, once the right candidate has been identified). - -## Troubleshooting - -1. Ensure that you are running Visual Studio with administrator privileges. - -2. If the solution fails to build, verify the following: - - - The reference to `ContosoHR` is not missing from the `InternalClient` or `CareersWebSite` projects. - -3. If the solution fails to execute, verify the following: - - 1. All services are running. - - 2. The service references are updated. - - 1. Open the App_WebReferences folder - - 2. Right-click **Contoso** and select **Update Web/Service References**. - - 3. Rebuild the solution by pressing CTRL+SHIFT+B in Visual Studio. - -## Uninstalling - -1. Delete the SQL Server instance store by running Cleanup.bat, located in DbSetup folder. - -2. Delete the source code form your hard drive. diff --git a/docs/framework/windows-workflow-foundation/samples/index.md b/docs/framework/windows-workflow-foundation/samples/index.md deleted file mode 100644 index 37c260edcc46f..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/index.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: "Windows Workflow (WF) sample documentation" -description: You can download Windows Workflow samples to learn about various aspects of Windows Workflow Foundation, including application, basic, and scenario samples. -ms.date: 09/24/2018 -ms.assetid: e0aef017-4381-4f2f-a904-6e1ed898687e ---- -# Windows Workflow (WF) Samples - -You can [download Windows Workflow samples](https://www.microsoft.com/download/details.aspx?id=21459) that provide instruction on various aspects of Windows Workflow Foundation (WF). - -The articles in this section describe some of the samples in the download package. For a complete documentation set that covers all of the samples, check the [.NET Framework 4 WF samples](/previous-versions/dotnet/netframework-4.0/dd483375(v=vs.100)) section. - -> [!NOTE] -> The downloadable samples were created with Visual Studio 2010 and .NET Framework 4, but are compatible with later versions of Visual Studio and the .NET Framework. Additional samples for Windows Workflow Foundation in [!INCLUDE[netfx_current_short](../../../../includes/netfx-current-short-md.md)] can be found on [MSDN code samples](/samples/browse/?redirectedfrom=MSDN-samples). - -## In this section - -[Application](application.md) - Provides samples that are related to workflow applications. - -[Basic](basic.md) - Provides samples that demonstrate basic Windows Workflow Foundation (WF) functionality. - -[Scenario](scenario.md) - Provides examples of Windows Workflow Foundation (WF) scenarios. diff --git a/docs/framework/windows-workflow-foundation/samples/linq-message-query-correlation.md b/docs/framework/windows-workflow-foundation/samples/linq-message-query-correlation.md deleted file mode 100644 index 133f1c6d0efe2..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/linq-message-query-correlation.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -description: "Learn more about: LINQ Message Query Correlation" -title: "LINQ Message Query Correlation" -ms.date: "03/30/2017" -ms.assetid: b746872e-57b1-4514-b337-53398a0e0deb ---- -# LINQ Message Query Correlation - -This sample demonstrates how to do content-based correlation using a custom implementation as opposed to the system-provided . - -## Demonstrates - - Custom , Content-Based Correlation. - -## Discussion - - This sample shows how to extend from the base class for the purposes of correlation. The custom implementation, `LinqMessageQuery`, allows users to provide an XName to find within the message using XLinq. The data retrieved by the query is used to form the correlation key to dispatch messages to the appropriate workflow instance. - -#### To set up, build, and run the sample - -1. This sample exposes a workflow service using HTTP endpoints. To run this sample, proper URL ACLs must be added (see [Configuring HTTP and HTTPS](../../wcf/feature-details/configuring-http-and-https.md) for details), either by running Visual Studio as Administrator or by executing the following command at an elevated prompt to add the appropriate ACLs. Ensure that your Domain and Username are substituted. - - ```console - netsh http add urlacl url=http://+:8000/ user=%DOMAIN%\%UserName% - ``` - -2. Once the URL ACLs are added, use the following steps. - - 1. Build the solution. - - 2. Set multiple start-up projects by right-clicking the solution and selecting **Set Startup Projects**. Add **Service** and **Client** (in that order) as multiple start-up projects. - - 3. Run the application. The client console shows a workflow sending an order and receiving the purchase order id and then subsequently confirming the order. The Service window will show the requests being processed. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Scenario\Services\LinqMessageQueryCorrelation` diff --git a/docs/framework/windows-workflow-foundation/samples/load-from-xaml.md b/docs/framework/windows-workflow-foundation/samples/load-from-xaml.md deleted file mode 100644 index 5acb62b4db33a..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/load-from-xaml.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -description: "Learn more about: Load From XAML" -title: "Load From XAML" -ms.date: "03/30/2017" -ms.assetid: 1f103ef6-7bed-4f16-ae52-9e665c5a43d7 ---- -# Load From XAML - -This sample demonstrates how to dynamically load a XAML workflow without having to run the XamlBuildTask tool. Instead, the sample calls the method. The sample is a Windows Presentation Foundation (WPF) client application that loads XAML workflows using the class and executes them. After they have been loaded using the class, a is returned that can be executed. - -#### To use this sample - -1. Using Visual Studio 2010, open the LoadFromXAML.sln solution file. - -2. To build the solution, press CTRL+SHIFT+B. - -3. To run the solution, press CTRL+F5. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Basic\Built-InActivities\DynamicActivity\LoadFromXAML` diff --git a/docs/framework/windows-workflow-foundation/samples/media/71f08d57-e8f2-499e-8151-ece2cbdcabfd.gif b/docs/framework/windows-workflow-foundation/samples/media/71f08d57-e8f2-499e-8151-ece2cbdcabfd.gif deleted file mode 100644 index b9e5adad16149b0e15026ead2ae367130415f48b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60464 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 E166~f^8f$< diff --git a/docs/framework/windows-workflow-foundation/samples/media/document-approval-process/document-approval-process.jpg b/docs/framework/windows-workflow-foundation/samples/media/document-approval-process/document-approval-process.jpg deleted file mode 100644 index b684a1051776b55ac2c8b2164d91afd1b8a1a959..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34287 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

t%2mnmCTTMOY#-9{SH zC*a&Y;#`kSWT?0c-rHy8wTCkwV0W;BcBjMmY^kr+j+_t0rT!0 zS2OyOLOTvykcimMEK{Q7dO^`BLht^KG=$=oy|Tgv#|NLPQU2ZyG?5UsuQwRH>!)M! z`4$@tCaOP%O&Tm(%7YfZ6Jk((??NVfWIfJUT$g;;UJm+ZeBgUy`>lY_OD6FZ!?43^ z8!JQp7*3G>Y~N^>?BXcr5iF+l+oII9T8iqFoly|NB$OW?$40w!Ge}SZ4p=o5*c#0z0j% z2h(6Pc%t!xaP!&1WDAPCEP@a_2?%F(YnlURMrs~P{gR#I zPVMXc4T_c+?5;M9mWk6=z5}=x&HQ|e>Y$ly-dZCDG2!7ZsQ!RJ&(ubkbe}ON-9!d} z`Ts84{*RZnhp}P1rK=yFaZvrJIu+e$&1#4x*lr_-!d{XlzqQ}%mU|UMV8f<(Ur7{N zPB>kW)V(d0-OBK3?asyjcml8+(WmO#&^TN#fT5k^o``;h-qx?|U*V+#M8m`zYsi^3Zk9yLk^%4r3wxZ zQ)|m3A~B>3qpPc*#<7E9$cKE`kIa3EA|VMk1#`eJFFo}@G945lt;0kP;pK%f7U4{k z&oCR&P)xlZOMjE+?dBUS7oO-Y+m6r=3L16*jXBAH)ER)`ts;Akg2h4ABJC9RY5mfx z`@s|d9xYI)zjf|4Qxy);u6g``j9-m^HREf1-j3VM6<5x7%Hw(cQSt$wS0>1ujHdPi z`m^+$jc-seA3vmTj(Ez-x`zEa1IDu`ceTC8xYndAt22y@Iwc`dR%QlQ4`v^fat!iv zRyUtGr8{VG%Mqvq*G~J5e^zqbkQILDpikso&-$6|S-mnc&Ok-}|7L7`S=00IIZH7~ zd=UKxvNL7Z^npjNefv!?@X_0fzGr2bFVv>WHUvd$$W6?yC8ME$iUw@^MCk*0r`u-6 zLlOQ}g3(zEO0ZyCI_nM5k^a2mn``TBGK8vFb*)vKO3JN~8;Nbkk-M`&XnkFDX1#KT z{91+#f8urazPD?U%c8kFOjUaFlv!vkysjTsQ}zk_6I>CC?F>2nfHJ#cw#W0f;XHkL z2)+K19wEuXpu%t;8f|Qx14nM!u2r63X4DRnJRroLBuRMOXBk)FZi|)}h1X}Cm1I}k z9F9sruK9R$vh1}q?aOQMgO2w$$iY7xp7%B6$(MQx@3VQN_uD2Q9DM3J`0ZZ=VT*+2 zap^pb8zC6R8AB;%;bL@&C+4co0`iCW0~McwES@BtwRXJ^GrAeZuj4*Jxx+`|{ZE!9 z|L!%O=F$FZE-81duYvE*3U+_>VaVOl%(iZ=cTcxa7-D8eE_|Ugk@mJ?)JL62CmXE9 zT5gX9Fscv$&sNX$PJPDzOY6br&D9Vf23o$c+DrL{MJC-!l~yj zbe3X~rq&~NRHigcGq6aVjS#631SA=JNRrMemr);fC4uSNDFa?8q znMf+^!Q05%ei>uv@zGHOC_X?)hpF=SK0`R!mo1xPJ)`q3Wqs!{tti1xX8sp6wI(K?FhcU zS#$kzL)td+!xPlGYNvZqRioGVM>Yozm|VvGaVdL*HJ! z)ueD6ULR(u!MB6jQnjC;Jsz4w&>bKp`<#RY`_P3PRsj8ExE+6yFt>YZp0)>5hi1Cc zBZnnz%fdMR-HH6m48FXX|w3{6&tW7mw;mj+n+Kdp4qdzy^73`9Y9%&UZCiv z+>W4ZpD8>&M$M@|E#BPE_b7+nK9Wv8->uS}f0*{v9mVxGkPev2QhdG%Z+)n9HBHxB zM3w9}5dDVGDYrF_yfxioU+Ox3vup^SOi42msOZ%m=wq*vKQO`j3*9}v3#v=L^dr2L T02q}VIsZ^g{9QHi+uZ*G9b`g> diff --git a/docs/framework/windows-workflow-foundation/samples/media/external-ruleset-toolkit/ruleset-browser-dialog.gif b/docs/framework/windows-workflow-foundation/samples/media/external-ruleset-toolkit/ruleset-browser-dialog.gif deleted file mode 100644 index e9d19e7b9d5ddd50bc21bdfd13844d1f4c3b57d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 127097 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 X*MF}Bm`S+}=SAO3d_yDvfbstT5kui* diff --git a/docs/framework/windows-workflow-foundation/samples/media/external-ruleset-toolkit/ruleset-editor-dialog.gif b/docs/framework/windows-workflow-foundation/samples/media/external-ruleset-toolkit/ruleset-editor-dialog.gif deleted file mode 100644 index bb2498b121b62c7c0a1ef9eeaaaa66063d9488af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70749 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 diff --git a/docs/framework/windows-workflow-foundation/samples/media/external-ruleset-toolkit/ruleset-selector-dialog.gif b/docs/framework/windows-workflow-foundation/samples/media/external-ruleset-toolkit/ruleset-selector-dialog.gif deleted file mode 100644 index 39fe0cb16672dbd534b806e9283ba4985f4913a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24536 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 Dpc#t> diff --git a/docs/framework/windows-workflow-foundation/samples/media/external-ruleset-toolkit/validation-errors-dialog.png b/docs/framework/windows-workflow-foundation/samples/media/external-ruleset-toolkit/validation-errors-dialog.png deleted file mode 100644 index 5ddd89863f88d46ea65bc2442e32c95c7abdedee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11738 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 diff --git a/docs/framework/windows-workflow-foundation/samples/media/programming-model-item-tree/workflow-designer-architecture.jpg b/docs/framework/windows-workflow-foundation/samples/media/programming-model-item-tree/workflow-designer-architecture.jpg deleted file mode 100644 index 58321ab2406f5a6040a816848bfad4223166536a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21272 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

    (U7iV@5SA2PqZyYsT@JJ+&o`5=#o+QcJBf) zlMz-Hj(?{LlK?-0Q_2mgXO;DRLh?8qhUQYLZ~7xzalqE%r9yDhuw6;?_Q&*;eMGsm ziaW8{GS=wo5NEm{j z_q1DEpRRfwX>;Ww0WDw0yG@g4ocsn=L*R0p*gjc)aX~e^5h0R-Dt^-NVkTALQzwLb z^2(`9XTIRz@g0Nsr7Ax*BQOrwwJIGF^odPaiDK$aK@{=8l-_Y#Se^-zFBRN!dp;NS zku!`Hf2=|0ZOIZ4D~*a%mxw2kSM}#?JiMPLsjfG=&Ll2xI<)rSMG?}FC(-zB8cSO~ z5R;s3>SnJj>Y>8VmjlLH{^2py|FVyC(sEB8JH0vOP|u@UpRO}7ch=2;)ylO74{=p@ogzyUiINQra~IVw<`#P4wD)<(Qu6~_ zjdW^uRAKG`ygB)!kwRvleWLy;uIwjFR}CoUt}4-R#zfT(c|Vz1x9HI;e_K5$uoxn# z`zlH`+}gT_B_vS9WS)XsXb6pbJE1H~l@|UImfR4YgHf&-__Yo^$YN4>xhPG0>r-9H zMD@|gx*?Q&uaHkbw_o1M&cvU!J5!w&6$;bZ82slbcUhRqV8^uD*~ zD+NM&Rr2OiCHjr}@YPLeC#c3&1vdAtpN!$_ah2^gZ1=NSH%{7~dN;SHZ}K_sH77e! z>P#&!`yV6cxZ@UwhNPemlT*_WGmkb!m+Mx&qr}L|OO)=A6X5ID=@!GjPKxyltUJqe zDd~+XbF|Wox{qH-<9VE!BWg)WQFBh$1QC?$ARfWD*1%@6s&{|ch2Fp zK}^C7xGk*S_T3Qs6{2TUGcqbxI+Bm)gw5%dTV z5{f}5o7y_HJ>EK$1%=bSD&HF`yE zp4MivB4LuRlsQbb8FE(g_9{hp4Yva+cbgBio7Y-W>6$tF2=R9*kO#NwAYg|M%tzZi zec1l+?Xu97iyHy`@_~F{emOB52P~ZhPnHJBGjBceg=6mxLB7s`=^yfW^S#qPap=MBmP%vPOT`Aef&D-+qn0Uz;x43sr?Tv4dV08s7jsR2rj*VKrk0gMebu z$A@70r}@wz@P=tmvK=D3ar)vG4miduf^W8GVJ`@P{?BK+HY^5APEBKqk@Dt@;ue*9W~0`suS#-V01qP5+6RmK7N=J zfi^zD&-aWTsWW#r|Jwm)*w4%FCB5Xtn+dax4=Kn4&o+ETWWm1!rueM1O8@TXW{o$M zl@rZ0S)|4*ibh%=XI;Fdq9lj|4Qgc5_q}7Rt!sTorj)Au*6)a*b!)f~ztq;2^{I4% Tk!&rRfAUE8KRWu2ha341YUkYn diff --git a/docs/framework/windows-workflow-foundation/samples/non-generic-foreach.md b/docs/framework/windows-workflow-foundation/samples/non-generic-foreach.md deleted file mode 100644 index 5acffb04c05a7..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/non-generic-foreach.md +++ /dev/null @@ -1,113 +0,0 @@ ---- -description: "Learn more about: Non-Generic ForEach" -title: "Non-Generic ForEach" -ms.date: "03/30/2017" -ms.assetid: 576cd07a-d58d-4536-b514-77bad60bff38 ---- -# Non-Generic ForEach - -[!INCLUDE[netfx_current_long](../../../../includes/netfx-current-long-md.md)] ships in its toolbox a set of Control Flow activities, including , which allows iterating through collections. - - requires its property to be of type . This precludes users from iterating over data structures that implement interface (for example, ). The non-generic version of overcomes this requirement, at the expense of more run-time complexity for ensuring the compatibility of the types of the values in the collection. - - This sample shows how to implement a non-generic activity and its designer. This activity can be used to iterate through . - -## ForEach Activity - - The C#/Visual Basic `foreach` statement enumerates the elements of a collection, executing an embedded statement for each element of the collection. The [!INCLUDE[wf1](../../../../includes/wf1-md.md)] equivalent activities of `foreach` are and . The activity contains a list of values and a body. At runtime, the list is iterated and the body is executed for each value in the list. - - For most cases, the generic version of the activity should be the preferred solution, because it covers most of the scenarios in which it would be used, and provides type checking at compile time. The non-generic version can be used for iterating through types that implement the non-generic interface. - -## Class Definition - - The following code example shows the definition of a non-generic `ForEach` activity. - -```csharp -[ContentProperty("Body")] -public class ForEach : NativeActivity -{ - [RequiredArgument] - [DefaultValue(null)] - InArgument Values { get; set; } - - [DefaultValue(null)] - [DependsOn("Values")] - ActivityAction Body { get; set; } -} -``` - - Body (optional) - The of type , which is executed for each element in the collection. Each individual element is passed into the Body through its `Argument` property. - - Values (optional) - The collection of elements that are iterated over. Ensuring that all elements of the collection are of compatible types is done at run-time. - -## Example of Using ForEach - - The following code demonstrates how to use the ForEach activity in an application. - -```csharp -string[] names = { "bill", "steve", "ray" }; - -DelegateInArgument iterationVariable = new DelegateInArgument() { Name = "iterationVariable" }; - -Activity sampleUsage = - new ForEach - { - Values = new InArgument(c=> names), - Body = new ActivityAction - { - Argument = iterationVariable, - Handler = new WriteLine - { - Text = new InArgument(env => string.Format("Hello {0}", iterationVariable.Get(env))) - } - } - }; -``` - -|Condition|Message|Severity|Exception Type| -|---------------|-------------|--------------|--------------------| -|Values is `null`|Value for a required activity argument 'Values' was not supplied.|Error|| - -## ForEach Designer - - The activity designer for the sample is similar in appearance to the designer provided for the built-in activity. The designer appears in the toolbox in the **Samples**, **Non-Generic Activities** category. The designer is named **ForEachWithBodyFactory** in the toolbox, because the activity exposes an in the toolbox, which creates the activity with a properly configured . - -```csharp -public sealed class ForEachWithBodyFactory : IActivityTemplateFactory -{ - public Activity Create(DependencyObject target) - { - return new Microsoft.Samples.Activities.Statements.ForEach() - { - Body = new ActivityAction() - { - Argument = new DelegateInArgument() - { - Name = "item" - } - } - }; - } -} -``` - -#### To run this sample - -1. Set the project of your choice as the start-up project of the solution: - - 1. **CodeTestClient** shows how to use the activity using code. - - 2. **DesignerTestClient** shows how to use the activity within the designer. - -2. Build and run the project. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Scenario\ActivityLibrary\NonGenericForEach` diff --git a/docs/framework/windows-workflow-foundation/samples/non-generic-parallelforeach.md b/docs/framework/windows-workflow-foundation/samples/non-generic-parallelforeach.md deleted file mode 100644 index c493bcce5039f..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/non-generic-parallelforeach.md +++ /dev/null @@ -1,117 +0,0 @@ ---- -description: "Learn more about: Non-generic ParallelForEach" -title: "Non-generic ParallelForEach" -ms.date: "03/30/2017" -ms.assetid: de17e7a2-257b-48b3-91a1-860e2e9bf6e6 ---- -# Non-generic ParallelForEach - -[!INCLUDE[netfx_current_long](../../../../includes/netfx-current-long-md.md)] ships in its toolbox a set of Control Flow activities, including , which allows iterating through collections. - - requires its property to be of type . This precludes users from iterating over data structures that implement interface (for example, ). The non-generic version of overcomes this requirement, at the expense of more run-time complexity for ensuring the compatibility of the types of the values in the collection. - -This sample shows how to implement a non-generic activity and its designer. This activity can be used to iterate through . - -## ParallelForEach activity - -The C#/Visual Basic `foreach` statement enumerates the elements of a collection, executing an embedded statement for each element of the collection. The [!INCLUDE[wf1](../../../../includes/wf1-md.md)] equivalent activities are and . The activity contains a list of values and a body. At runtime, the list is iterated and the body is executed for each value in the list. - - has a , so that the activity could complete early if the evaluation of the returns `true`. The is evaluated after each iteration is completed. - -For most cases, the generic version of the activity should be the preferred solution, because it covers most of the scenarios in which it is used and provides type checking at compile time. The non-generic version can be used for iterating through types that implement the non-generic interface. - -## Class definition - -The following code example shows the definition of a non-generic `ParallelForEach` activity is. - -```csharp -[ContentProperty("Body")] -public class ParallelForEach : NativeActivity -{ - [RequiredArgument] - [DefaultValue(null)] - InArgument Values { get; set; } - - [DefaultValue(null)] - [DependsOn("Values")] - public Activity CompletionCondition - [DefaultValue(null)] - [DependsOn("CompletionCondition")] - ActivityAction Body { get; set; } -} -``` - -Body (optional)\ -The of type , which is executed for each element in the collection. Each individual element is passed into the Body through its Argument property. - -Values (optional)\ -The collection of elements that are iterated over. Ensuring that all elements of the collection are of compatible types is done at run-time. - -CompletionCondition (optional)\ -The property is evaluated after any iteration completes. If it evaluates to `true`, then the scheduled pending iterations are canceled. If this property is not set, all activities in the Branches collection execute until completion. - -## Example of using ParallelForEach - -The following code demonstrates how to use the ParallelForEach activity in an application. - -```csharp -string[] names = { "bill", "steve", "ray" }; - -DelegateInArgument iterationVariable = new DelegateInArgument() { Name = "iterationVariable" }; - -Activity sampleUsage = - new ParallelForEach - { - Values = new InArgument(c=> names), - Body = new ActivityAction - { - Argument = iterationVariable, - Handler = new WriteLine - { - Text = new InArgument(env => string.Format("Hello {0}", iterationVariable.Get(env))) - } - } - }; -``` - -## ParallelForEach designer - -The activity designer for the sample is similar in appearance to the designer provided for the built-in activity. The designer appears in the toolbox in the **Samples**, **Non-Generic Activities** category. The designer is named **ParallelForEachWithBodyFactory** in the toolbox, because the activity exposes an in the toolbox that creates the activity with a properly configured . - -```csharp -public sealed class ParallelForEachWithBodyFactory : IActivityTemplateFactory -{ - public Activity Create(DependencyObject target) - { - return new Microsoft.Samples.Activities.Statements.ParallelForEach() - { - Body = new ActivityAction() - { - Argument = new DelegateInArgument() - { - Name = "item" - } - } - }; - } -} -``` - -## To run the sample - -1. Set the project of your choice as the startup project of the solution. - - 1. **CodeTestClient** shows how to use the activity using code. - - 2. **DesignerTestClient** shows how to use the activity within the designer. - -2. Build and run the project. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Scenario\ActivityLibrary\NonGenericParallelForEach` diff --git a/docs/framework/windows-workflow-foundation/samples/programming-model-item-tree.md b/docs/framework/windows-workflow-foundation/samples/programming-model-item-tree.md deleted file mode 100644 index 244afc6001ffb..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/programming-model-item-tree.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -description: "Learn more about: Programming Model Item Tree" -title: "Programming Model Item Tree" -ms.date: "03/30/2017" -ms.assetid: 0229efde-19ac-4bdc-a187-c6227a7bd1a5 ---- -# Programming Model Item Tree - -This sample demonstrates how to navigate the tree using declarative data binding from the Windows Presentation Foundation (WPF) Tree View. - -## Sample Details - - The tree is the abstraction that is used by the Windows Workflow Designer infrastructure to expose the data about the underlying instance being edited. The following illustration is a depiction of the various layers of infrastructure within the Workflow Designer. - - ![Diagram that shows the Workflow Designer architecture.](./media/programming-model-item-tree/workflow-designer-architecture.jpg) - - A consists of a pointer to the underlying value, as well as a collection of objects. A object in turn, consists of data such as the name and type of the property and then a pointer to the value, which in turn, is another . A value converter is used to manipulate some of the s returned from a to make them appear correctly in the tree view. The sample then demonstrates how to imperatively program against the tree using the imperative syntax, as seen in the following example. - -```csharp -ModelItem mi = wd.Context.Services.GetService().Root; -ModelProperty mp = mi.Properties["Activities"]; -mp.Collection.Add(new Persist()); -ModelItem justAdded = mp.Collection.Last(); -justAdded.Properties["DisplayName"].SetValue("new name"); -``` - -#### To use this sample - -1. Open the ProgrammingModelItemTree.sln solution in Visual Studio 2010. - -2. Build the solution by selecting **Build Solution** from the **Build** menu. - -3. Press F5 to run the application. The WPF form is then displayed. - -4. Click the **Load WF** button to load the and bind it to the tree view. - -5. Clicking the **Change Model Item Tree** button executes the preceding code to add an item into the tree and set a property. - -> [!IMPORTANT] -> The samples may already be installed on your computer. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Basic\Designer\ProgrammingModelItemTree` - -## See also - -- diff --git a/docs/framework/windows-workflow-foundation/samples/property-grid-extensibility.md b/docs/framework/windows-workflow-foundation/samples/property-grid-extensibility.md deleted file mode 100644 index 227c1a2eb1870..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/property-grid-extensibility.md +++ /dev/null @@ -1,132 +0,0 @@ ---- -description: "Learn more about: Property grid extensibility" -title: "Property grid extensibility - WF sample" -ms.date: "03/30/2017" -ms.assetid: 3530c3a3-756d-4712-9f10-fb2897414d3a ---- -# Property grid extensibility - -A developer can customize the property grid that is displayed when a given activity is selected within the designer. This can be done to create a rich editing experience. This sample shows how this can be done. - -## Demonstrates - -Workflow designer property grid extensibility. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Basic\Designer\PropertyGridExtensibility` - -## Discussion - -To extend the property grid, a developer has options to customize the inline appearance of a property grid editor or provide a dialog that appears for a more advanced editing surface. There are two different editors demonstrated in this sample; an inline editor and a dialog editor. - -## Inline editor - -The inline editor sample demonstrates the following: - -- Creates a type that derives from . - -- In the constructor, the value is set with a Windows Presentation Foundation (WPF) data template. This can be bound to a XAML template, but in this sample, code is used to initialize data binding. - -- The data template has a data context of the of the item rendered in the property grid. Note in the following code (from CustomInlineEditor.cs) that this context then binds to the `Value` property. - - ```csharp - FrameworkElementFactory stack = new FrameworkElementFactory(typeof(StackPanel)); - FrameworkElementFactory slider = new FrameworkElementFactory(typeof(Slider)); - Binding sliderBinding = new Binding("Value"); - sliderBinding.Mode = BindingMode.TwoWay; - slider.SetValue(Slider.MinimumProperty, 0.0); - slider.SetValue(Slider.MaximumProperty, 100.0); - slider.SetValue(Slider.ValueProperty, sliderBinding); - stack.AppendChild(slider); - ``` - -- Because the activity and the designer are in the same assembly, registration of the activity designer attributes are accomplished in the static constructor of the activity itself, as shown in the following example from SimpleCodeActivity.cs. - - ```csharp - static SimpleCodeActivity() - { - AttributeTableBuilder builder = new AttributeTableBuilder(); - builder.AddCustomAttributes(typeof(SimpleCodeActivity), "RepeatCount", new EditorAttribute(typeof(CustomInlineEditor), typeof(PropertyValueEditor))); - builder.AddCustomAttributes(typeof(SimpleCodeActivity), "FileName", new EditorAttribute(typeof(FilePickerEditor), typeof(DialogPropertyValueEditor))); - MetadataStore.AddAttributeTable(builder.CreateTable()); - } - ``` - -## Dialog editor - -The dialog editor sample demonstrates the following: - -1. Creates a type that derives from . - -2. Sets the value in the constructor with a WPF data template. This can be created in XAML, but in this sample, this is created in code. - -3. The data template has a data context of the of the item rendered in the property grid. In the following code, this then binds to the `Value` property. It is critical to also include an to provide the button that raises the dialog in FilePickerEditor.cs. - - ```csharp - this.InlineEditorTemplate = new DataTemplate(); - - FrameworkElementFactory stack = new FrameworkElementFactory(typeof(StackPanel)); - stack.SetValue(StackPanel.OrientationProperty, Orientation.Horizontal); - FrameworkElementFactory label = new FrameworkElementFactory(typeof(Label)); - Binding labelBinding = new Binding("Value"); - label.SetValue(Label.ContentProperty, labelBinding); - label.SetValue(Label.MaxWidthProperty, 90.0); - - stack.AppendChild(label); - - FrameworkElementFactory editModeSwitch = new FrameworkElementFactory(typeof(EditModeSwitchButton)); - - editModeSwitch.SetValue(EditModeSwitchButton.TargetEditModeProperty, PropertyContainerEditMode.Dialog); - - stack.AppendChild(editModeSwitch); - - this.InlineEditorTemplate.VisualTree = stack; - ``` - -4. Overrides the method in the designer type to handle the display of the dialog. In this sample, a basic is shown. - - ```csharp - public override void ShowDialog(PropertyValue propertyValue, IInputElement commandSource) - { - Microsoft.Win32.OpenFileDialog ofd = new Microsoft.Win32.OpenFileDialog(); - if (ofd.ShowDialog() == true) - { - propertyValue.Value = ofd.FileName; - } - } - ``` - -5. Because the activity and the designer are in the same assembly, registration of the activity designer attributes are accomplished in the static constructor of the activity itself, as shown in the following example from SimpleCodeActivity.cs. - - ```csharp - static SimpleCodeActivity() - { - AttributeTableBuilder builder = new AttributeTableBuilder(); - builder.AddCustomAttributes(typeof(SimpleCodeActivity), "RepeatCount", new EditorAttribute(typeof(CustomInlineEditor), typeof(PropertyValueEditor))); - builder.AddCustomAttributes(typeof(SimpleCodeActivity), "FileName", new EditorAttribute(typeof(FilePickerEditor), typeof(DialogPropertyValueEditor))); - MetadataStore.AddAttributeTable(builder.CreateTable()); - } - ``` - -## To set up, build, and run the sample - -1. Build the solution, and then open Workflow1.xaml. - -2. Drag a **SimpleCodeActivity** from the toolbox onto the designer canvas. - -3. Click the **SimpleCodeActivity** and then open the property grid where there is a slider control and a file picking control. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Basic\Designer\PropertyGridExtensibility` diff --git a/docs/framework/windows-workflow-foundation/samples/removing-the-view-state-the-designer-adds-to-an-xaml-file.md b/docs/framework/windows-workflow-foundation/samples/removing-the-view-state-the-designer-adds-to-an-xaml-file.md deleted file mode 100644 index 913136b547e86..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/removing-the-view-state-the-designer-adds-to-an-xaml-file.md +++ /dev/null @@ -1,121 +0,0 @@ ---- -description: "Learn more about: Removing the view state the designer adds to an XAML file" -title: "Removing the view state the designer adds to an XAML file - WF" -ms.date: "03/30/2017" -ms.assetid: a801ce22-8699-483c-a392-7bb3834aae4f ---- -# Removing the view state the designer adds to an XAML file - -This sample demonstrates how to create a class that derives from and removes view state from a XAML file. Windows Workflow Designer writes information into the XAML document, which is known as view state. View state refers to the information that is required at design time, such as layout positioning, that is not required at runtime. Workflow Designer inserts this information into the XAML document as it is edited. Workflow Designer writes the view state into the XAML file with the `mc:Ignorable` attribute, so this information is not loaded when the runtime loads the XAML file. This sample demonstrates how to create a class that removes that view state information while processing XAML nodes. - -## Discussion - -This sample demonstrates how to create a custom writer. - -To build a custom XAML writer, create a class that inherits from . As XAML writers are often nested, it is typical to keep track of an "inner" XAML writer. These "inner’ writers can be thought of as the reference to the remaining stack of XAML writers, allowing you to have multiple entry points to do work and then delegate processing to the remainder of the stack. - -In this sample, there are a few items of interest. One is the check to see whether the item being written is from a designer namespace. Note that this also strips out the use of other types from the designer namespace in a workflow. - -```csharp -static Boolean IsDesignerAttachedProperty(XamlMember xamlMember) -{ - return xamlMember.IsAttachable && - xamlMember.PreferredXamlNamespace.Equals(c_sapNamespaceURI, StringComparison.OrdinalIgnoreCase); -} - -const String c_sapNamespaceURI = "http://schemas.microsoft.com/netfx/2009/xaml/activities/presentation"; - -// The next item of interest is the constructor, where the utilization of the inner XAML writer is seen. -public ViewStateCleaningWriter(XamlWriter innerWriter) -{ - this.InnerWriter = innerWriter; - this.MemberStack = new Stack(); -} - -XamlWriter InnerWriter {get; set; } -Stack MemberStack {get; set; } -``` - -This also creates a stack of XAML members that are used while traversing the node stream. The remaining work of this sample is largely contained in the `WriteStartMember` method. - -```csharp -public override void WriteStartMember(XamlMember xamlMember) -{ - MemberStack.Push(xamlMember); - - if (IsDesignerAttachedProperty(xamlMember)) - { - m_attachedPropertyDepth++; - } - - if (m_attachedPropertyDepth > 0) - { - return; - } - - InnerWriter.WriteStartMember(xamlMember); -} -``` - -Subsequent methods then check to see whether they are still contained in a view state container, and if so, return, and do not pass the node down the writer stack. - -```csharp -public override void WriteValue(Object value) -{ - if (m_attachedPropertyDepth > 0) - { - return; - } - - InnerWriter.WriteValue(value); -} -``` - -To use a custom XAML writer, you must chain it together in a stack of XAML writers. The following code shows how this can be used. - -```csharp -XmlWriterSettings writerSettings = new XmlWriterSettings { Indent = true }; -XmlWriter xmlWriter = XmlWriter.Create(File.OpenWrite(args[1]), writerSettings); -XamlXmlWriter xamlWriter = new XamlXmlWriter(xmlWriter, new XamlSchemaContext()); -XamlServices.Save(new ViewStateCleaningWriter(ActivityXamlServices.CreateBuilderWriter(xamlWriter)), ab); -``` - -## To use this sample - -1. Using Visual Studio 2010, open the ViewStateCleaningWriter.sln solution file. - -2. Open a command prompt and navigate to the directory where the ViewStageCleaningWriter.exe is built. - -3. Run ViewStateCleaningWriter.exe on the Workflow1.xaml file. - - The syntax for the executable is shown in the following example. - - ```console - ViewStateCleaningWriter.exe [input file] [output file] - ``` - - This outputs a XAML file to \[outfile], which has all its view state information removed. - -> [!NOTE] -> For a workflow, a number of virtualization hints are removed. This causes the designer to recalculate layout the next time it is loaded. When you use this sample for a , all positioning and line routing information are removed and on subsequent loading into the designer, all activities are stacked on the left side of the screen. - -## To create a sample XAML file for use with this sample - -1. Open Visual Studio 2010. - -2. Create a new Workflow Console Application. - -3. Drag and drop a few activities onto the canvas - -4. Save the workflow XAML file. - -5. Inspect the XAML file to see the view state attached properties. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Basic\Designer\ViewStateCleaningWriter` diff --git a/docs/framework/windows-workflow-foundation/samples/scenario.md b/docs/framework/windows-workflow-foundation/samples/scenario.md deleted file mode 100644 index 7629c5b5b34f6..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/scenario.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: "Windows Workflow scenarios" -description: View samples of Windows Workflow Foundation scenarios, such as scenarios using the built-in activity library and scenarios using workflow services activities. -ms.date: "03/30/2017" -ms.assetid: cb678fda-79aa-4495-833b-ef570539d4c3 ---- -# Scenario - -This section contains examples of Windows Workflow Foundation (WF) scenarios. - -## In This Section - -[Activity Library](activity-library.md) - Contains samples that demonstrate scenarios using the built-in activity library. - -[Services](accessing-operationcontext.md) - Contains samples that demonstrate scenarios using workflow services activities. - -[WPF and WF Integration in XAML](wpf-and-wf-integration-in-xaml.md) - Demonstrates how to create an application that uses Windows Presentation Foundation (WPF) and Windows Workflow Foundation (WF) features in a single XAML document. To accomplish this, the sample uses Windows Workflow Foundation (WF) and XAML extensibility. - -[External Ruleset Toolkit](external-ruleset-toolkit.md) - Demonstrates how to manage and edit RuleSets in a database and access those RuleSets from a workflow at runtime. diff --git a/docs/framework/windows-workflow-foundation/samples/sendmail-custom-activity.md b/docs/framework/windows-workflow-foundation/samples/sendmail-custom-activity.md deleted file mode 100644 index 6f63c29f54de0..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/sendmail-custom-activity.md +++ /dev/null @@ -1,141 +0,0 @@ ---- -description: "Learn more about: SendMail Custom Activity" -title: "SendMail Custom Activity" -ms.date: "03/30/2017" -ms.assetid: 947a9ae6-379c-43a3-9cd5-87f573a5739f ---- -# SendMail Custom Activity - -This sample demonstrates how to create a custom activity that derives from to send mail using SMTP for use within a workflow application. The custom activity uses the capabilities of to send email asynchronously and to send mail with authentication. It also provides some end-user features like test mode, token replacement, file templates, and test drop path. - - The following table details the arguments for the `SendMail` activity. - -|Name|Type|Description| -|-|-|-| -|Host|String|Address of the SMTP server host.| -|Port|String|Port of the SMTP service in the host.| -|EnableSsl|bool|Specifies whether the uses Secure Sockets Layer (SSL) to encrypt the connection.| -|UserName|String|Username to set up the credentials to authenticate the sender property.| -|Password|String|Password to set up the credentials to authenticate the sender property.| -|Subject|\|Subject of the message.| -|Body|\|Body of the message.| -|Attachments|\|Attachment collection used to store data attached to this email message.| -|From||From address for this email message.| -|To|\<>|Address collection that contains the recipients of this email message.| -|CC|\<>|Address collection that contains the carbon copy (CC) recipients for this email message.| -|BCC|\<>|Address collection that contains the blind carbon copy (BCC) recipients for this email message.| -|Tokens|>|Tokens to replace in the body. This feature allows users to specify some values in the body than can be replaced later by the tokens provided using this property.| -|BodyTemplateFilePath|String|Path of a template for the body. The `SendMail` activity copies the contents of this file to its body property.

    The template can contain tokens that are replaced by the contents of the tokens property.| -|TestMailTo||When this property is set, all emails are sent to the address specified in it.

    This property is intended to be used when testing workflows. For example, when you want to make sure that all emails are sent without sending them to the actual recipients.| -|TestDropPath|String|When this property is set, all emails are also saved in the specified file.

    This property is intended to be used when you are testing or debugging workflows, to make sure that the format and contents of the outgoing emails is appropriate.| - -## Solution Contents - - The solution contains two projects. - -|Project|Description|Important Files| -|-------------|-----------------|---------------------| -|SendMail|The SendMail activity|1. SendMail.cs: implementation for the main activity
    2. SendMailDesigner.xaml and SendMailDesigner.xaml.cs: designer for the SendMail activity
    3. MailTemplateBody.htm: template for the email to be sent out.| -|SendMailTestClient|Client to test the SendMail activity. This project demonstrates two ways of invoking the SendMail activity: declaratively, and programmatically.|1. Sequence1.xaml: workflow that invokes the SendMail activity.
    2. Program.cs: invokes Sequence1 and also creates a workflow programmatically that uses SendMail.| - -## Further configuration of the SendMail activity - - Although not shown in the sample, users can perform addition configuration of the SendMail activity. The next three sections demonstrate how this is done. - -### Sending an email using tokens specified in the body - - This code snippet demonstrates how you can send email with tokens in the body. Notice how the tokens are provided in the body property. Values for those tokens are provided to the tokens property. - -```csharp -IDictionary tokens = new Dictionary(); -tokens.Add("@name", "John Doe"); -tokens.Add("@date", DateTime.Now.ToString()); -tokens.Add("@server", "localhost"); - -new SendMail -{ - From = new LambdaValue(ctx => new MailAddress("john.doe@contoso.com")), - To = new LambdaValue( - ctx => new MailAddressCollection() { new MailAddress("someone@microsoft.com") }), - Subject = "Test email", - Body = "Hello @name. This is a test email sent from @server. Current date is @date", - Host = "localhost", - Port = 25, - Tokens = new LambdaValue>(ctx => tokens) -}; -``` - -### Sending an email using a template - - This snippet shows how to send an email using a template tokens in the body. Notice that when setting the `BodyTemplateFilePath` property we don’t need to provide the value for Body property (the contents of the template file will be copied to the body). - -```csharp -new SendMail -{ - From = new LambdaValue(ctx => new MailAddress("john.doe@contoso.com")), - To = new LambdaValue( - ctx => new MailAddressCollection() { new MailAddress("someone@microsoft.com") }), - Subject = "Test email", - Host = "localhost", - Port = 25, - Tokens = new LambdaValue>(ctx => tokens), - BodyTemplateFilePath = @"..\..\..\SendMail\Templates\MailTemplateBody.htm", -}; -``` - -### Sending Mails in Testing Mode - - This code snippet shows how to set the two testing properties: by setting `TestMailTo` to all messages will be sent to `john.doe@contoso.con` (without regard of the values of To, Cc, Bcc). By setting TestDropPath all outgoing emails will be also recorded in the provided path. These properties can be set independently (they are not related). - -```csharp -new SendMail -{ - From = new LambdaValue(ctx => new MailAddress("john.doe@contoso.com")), - To = new LambdaValue( - ctx => new MailAddressCollection() { new MailAddress("someone@microsoft.com") }), - Subject = "Test email", - Host = "localhost", - Port = 25, - Tokens = new LambdaValue>(ctx => tokens), - BodyTemplateFilePath = @"..\..\..\SendMail\Templates\MailTemplateBody.htm", - TestMailTo= new LambdaValue(ctx => new MailAddress("john.doe@contoso.com")), - TestDropPath = @"c:\Samples\SendMail\TestDropPath\", -}; -``` - -## Set-Up Instructions - - Access to a SMTP server is required for this sample. - - For more information about setting up a SMTP server, see the following links. - -- [Configuring the SMTP Service (IIS 6.0)](/previous-versions/windows/it-pro/windows-server-2003/cc784968(v=ws.10)) - -- [IIS 7.0: Configure SMTP E-Mail](/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc772058(v=ws.10)) - -- [How to Install the SMTP Service](/previous-versions/tn-archive/aa997480(v=exchg.65)) - - SMTP emulators provided by third parties are available for download. - -##### To run this sample - -1. Using Visual Studio 2010, open the SendMail.sln solution file. - -2. Ensure that you have access to a valid SMTP server. See the set-up instructions. - -3. Configure the program with your server address, and From and To email addresses. - - To correctly run this sample, you may need to configure the value of From and To email addresses and the address of the SMTP server in Program.cs and in Sequence.xaml. You will need to change the address in both locations since the program sends mail in two different ways - -4. To build the solution, press CTRL+SHIFT+B. - -5. To run the solution, press CTRL+F5. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Scenario\ActivityLibrary\SendMail` diff --git a/docs/framework/windows-workflow-foundation/samples/sql-tracking.md b/docs/framework/windows-workflow-foundation/samples/sql-tracking.md deleted file mode 100644 index c1e1e9d65003a..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/sql-tracking.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -description: "Learn more about: SQL tracking" -title: "SQL Tracking" -ms.date: "03/30/2017" -ms.assetid: bcaebeb1-b9e5-49e8-881b-e49af66fd341 ---- -# SQL tracking - -This sample demonstrates how to write a custom SQL tracking participant that writes tracking records to a SQL database. Windows Workflow Foundation (WF) provides workflow tracking to gain visibility into the execution of a workflow instance. The tracking runtime emits workflow tracking records during the execution of the workflow. For more information about workflow tracking, see [Workflow Tracking and Tracing](../workflow-tracking-and-tracing.md). - -## Use the sample - -1. Verify you have SQL Server 2008, SQL Server 2008 Express or newer installed. The scripts packaged with the sample assume the use of a SQL Express instance on your local computer. If you have a different instance please modify the database-related scripts before running the sample. - -2. Create the SQL Server tracking database by running Trackingsetup.cmd in the scripts directory (\WF\Basic\Tracking\SqlTracking\CS\Scripts). This creates a database called TrackingSample. - - > [!NOTE] - > The script creates the database on the default instance of SQL Express. If you want to install it on a different database instance, edit the Trackingsetup.cmd script. - -3. Open SqlTrackingSample.sln in Visual Studio 2010. - -4. Press **Ctrl**+**Shift**+**B** to build the solution. - -5. Press **F5** to run the application. - - The browser window opens and shows the directory listing for the application. - -6. In the browser, click StockPriceService.xamlx. - -7. The browser displays the StockPriceService page, which contains the local service WSDL address. Copy this address. - - An example of the local service WSDL address is `http://localhost:65193/StockPriceService.xamlx?wsdl`. - -8. Using File Explorer, run the WCF test client (WcfTestClient.exe). It's located in the *Microsoft Visual Studio 10.0\Common7\IDE directory*. - -9. In the WCF test client, click the **File** menu and select **Add Service**. Paste the local service address in the textbox. Click **OK** to close the dialog. - -10. In the WCF test client, double click **GetStockPrice**. This opens the `GetStockPrice` operation that takes one parameter, type in the value `Contoso` and click **Invoke**. - -11. The emitted tracking records are written to a SQL database. To view the tracking records, open the TrackingSample database in SQL Management Studio and navigate to the tables. Running a select query on the tables displays the data within the tracking records stored in the respective tables. - - For more information about SQL Server Management Studio, see [Introducing SQL Server Management Studio](/sql/ssms/sql-server-management-studio-ssms). Download SQL Server Management Studio [here](https://aka.ms/ssmsfullsetup). - -## Uninstall the sample - -1. Run theTrackingcleanup.cmd script in the sample directory (*\WF\Basic\Tracking\SqlTracking*). - - > [!NOTE] - > The Trackingcleanup.cmd attempts to delete the database in your local computer SQL Express. If you are using another SQL server instance, edit Trackingcleanup.cmd. - -> [!IMPORTANT] -> The samples may already be installed on your computer. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Basic\Tracking\SqlTracking` - -## See also - -- [AppFabric Monitoring Samples](/previous-versions/appfabric/ff383407(v=azure.10)) diff --git a/docs/framework/windows-workflow-foundation/samples/suspended-instance-management.md b/docs/framework/windows-workflow-foundation/samples/suspended-instance-management.md deleted file mode 100644 index b014a4b9da7ed..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/suspended-instance-management.md +++ /dev/null @@ -1,84 +0,0 @@ ---- -description: "Learn more about: Suspended Instance Management" -title: "Suspended Instance Management" -ms.date: "03/30/2017" -ms.assetid: f5ca3faa-ba1f-4857-b92c-d927e4b29598 ---- -# Suspended Instance Management - -This sample demonstrates how to manage workflow instances that have been suspended. The default action for is `AbandonAndSuspend`. This means that by default, unhandled exceptions thrown from a workflow instance hosted in the will cause the instance to be disposed from memory (abandoned) and the durable/persisted version of the instance to be marked as suspended. A suspended workflow instance will not be able to run until it has been unsuspended. - - The sample shows how a command-line utility can be implemented to query for suspended instances, and how to give the user the option to resume or terminate the instance. In this sample, a workflow service intentionally throws an exception, causing it to become suspended. The command-line utility can then be used to query for the instance and subsequently resume or terminate the instance. - -## Demonstrates - - with and in Windows Workflow Foundation (WF). - -## Discussion - - The command-line utility implemented in this sample is specific to the SQL instance store implementation that ships in [!INCLUDE[netfx_current_long](../../../../includes/netfx-current-long-md.md)]. If you have a custom implementation of the instance store, then you can adapt this utility by replacing the `WorkflowInstanceCommand` implementations in the sample with implementations that are specific to your instance store. - - The provided implementation runs SQL commands against the SQL instance store directly to list suspended instances, and it relies on a added to the in order to resume or terminate the instances. - -#### To set up, build, and run the sample - -1. This sample requires that the following Windows components are enabled: - - 1. Microsoft Message Queues (MSMQ) Server - - 2. SQL Server Express - -2. Set up the SQL Server database. - - 1. From a Visual Studio 2010 command prompt, run "setup.cmd" from the SuspendedInstanceManagement sample directory, which does the following: - - 1. Creates a persistence database using SQL Server Express. If the persistence database already exists, then it is dropped and re-created - - 2. Sets up the database for persistence. - - 3. Adds IIS APPPOOL\DefaultAppPool and NT AUTHORITY\Network Service to the InstanceStoreUsers role that was defined when setting up the database for persistence. - -3. Set up the service queue. - - 1. In Visual Studio 2010, right-click the **SampleWorkflowApp** project and click **Set as Startup Project**. - - 2. Compile and run the SampleWorkflowApp by pressing **F5**. This will create the required queue. - - 3. Press **Enter** to stop the SampleWorkflowApp. - - 4. Open the Computer Management console by running Compmgmt.msc from a command prompt. - - 5. Expand **Service and Applications**, **Message Queuing**, **Private Queues**. - - 6. Right click the **ReceiveTx** queue and select **Properties**. - - 7. Select the **Security** tab and allow **Everyone** to have permissions to **Receive Message**, **Peek Message**, and **Send Message**. - -4. Now, run the sample. - - 1. In Visual Studio 2010, run the SampleWorkflowApp project again without debugging by pressing **Ctrl+F5**. Two endpoint addresses will be printed in the console window: one for the application endpoint and then other from the . A workflow instance is then created, and tracking records for that instance will appear in the console window. The workflow instance will throw an exception causing the instance to be suspended and aborted. - - 2. The command-line utility can then be used to take further action on any of these instances. The syntax for command line arguments is as follows:: - - `SuspendedInstanceManagement -Command:[CommandName] -Server:[ServerName] -Database:[DatabaseName] -InstanceId:[InstanceId]` - - The supported commands are: `Query`, `Resume`, and `Terminate`. The InstanceId switch is only required for `Resume` and `Terminate` operations. - -#### To cleanup (Optional) - -1. Open the Computer Management console by running Compmgmt.msc from a `vs2010` command prompt. - -2. Expand **Service and Applications**, **Message Queuing**, **Private Queues**. - -3. Delete the **ReceiveTx** queue. - -4. To remove the persistence database, run cleanup.cmd. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Application\SuspendedInstanceManagement` diff --git a/docs/framework/windows-workflow-foundation/samples/throttled-parallel-foreach.md b/docs/framework/windows-workflow-foundation/samples/throttled-parallel-foreach.md deleted file mode 100644 index 2c038ba5d32db..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/throttled-parallel-foreach.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -description: "Learn more about: Throttled Parallel ForEach" -title: "Throttled Parallel ForEach" -ms.date: "03/30/2017" -ms.assetid: f2855b5f-e9a7-433d-96a4-40fc31025215 ---- -# Throttled Parallel ForEach - -The `ThrottleParallelForEach` activity is similar to the activity with the one exception that it allows setting a concurrency factor to restrict the number of simultaneous branches to execute. The `ThrottleParallelForEach` activity derives from , because it needs to schedule other activities (the child activities) and this is only accessible through the class. - -## Projects - -|**ProjectName**|**Description**|**Main Files**| -|-|-|-| -|ThrottledParallelForEach|Contains `ThrottledParallelForEach` activity and its designer.|ThrottledParallelForEach.cs

    The `ThrottledParallelForEach` activity definition.| -|CodeTestClient|Sample client application that configures and runs a workflow with a `ThrottledParallelForEach` using imperative code.|Program.cs

    Defines and runs an instance of the sample workflow.| - -## To use this sample - -1. Using Visual Studio 2010, open the ThrottledParallelForEach.sln file. - -2. To build the solution, press CTRL+SHIFT+B. - -3. To run the solution, press F5. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Scenario\ActivityLibrary\ThrottledParallelForEach` diff --git a/docs/framework/windows-workflow-foundation/samples/toc.yml b/docs/framework/windows-workflow-foundation/samples/toc.yml index 5c707f359270f..fe51488c7066f 100644 --- a/docs/framework/windows-workflow-foundation/samples/toc.yml +++ b/docs/framework/windows-workflow-foundation/samples/toc.yml @@ -1,108 +1 @@ -- name: Windows Workflow Samples - href: index.md - items: - - name: Application - href: application.md - items: - - name: Document Approval Process - href: document-approval-process.md - - name: Corporate Purchase Process - href: corporate-purchase-process.md - - name: Hiring Process - href: hiring-process.md - - name: Visual Workflow Tracking - href: visual-workflow-tracking.md - - name: Suspended Instance Management - href: suspended-instance-management.md - - name: Basic - href: basic.md - items: - - name: Built-in Activities - href: built-in-activities.md - items: - - name: Fault Handling in a Flowchart Activity Using TryCatch - href: fault-handling-in-a-flowchart-activity-using-trycatch.md - - name: Load From XAML - href: load-from-xaml.md - - name: Use the Pick Activity - href: using-the-pick-activity.md - - name: Custom Activities - href: custom-activities.md - items: - - name: Code-Bodied - href: code-bodied.md - items: - - name: Custom Composite using Native Activity - href: custom-composite-using-native-activity.md - - name: Custom Activity Designers - href: custom-activity-designers.md - items: - - name: Custom Composite Designers - Workflow Item Presenter - href: custom-composite-designers-workflow-item-presenter.md - - name: Custom Composite Designers - Workflow Items Presenter - href: custom-composite-designers-workflow-items-presenter.md - - name: Using the ExpressionTextBox in a Custom Activity Designer - href: using-the-expressiontextbox-in-a-custom-activity-designer.md - - name: Using Editing Scope - href: using-editing-scope.md - - name: Designer - href: designer.md - items: - - name: Removing the View State the Designer Adds to an XAML File - href: removing-the-view-state-the-designer-adds-to-an-xaml-file.md - - name: Programming Model Item Tree - href: programming-model-item-tree.md - - name: Property Grid Extensibility - href: property-grid-extensibility.md - - name: Designer Rehosting - href: designer-rehosting.md - - name: Execution - href: execution.md - items: - - name: Creating and Running a Workflow Instance - href: creating-and-running-a-workflow-instance.md - - name: WorkflowHostingEndpoint Resume Bookmark - href: workflowhostingendpoint-resume-bookmark.md - - name: Bookmark Resolver for WorkflowHostingEndpoint - href: bookmark-resolver-for-workflowhostingendpoint.md - - name: Tracking - href: tracking.md - items: - - name: Custom Tracking - href: custom-tracking.md - - name: Tracking Events into Event Tracing in Windows - href: tracking-events-into-event-tracing-in-windows.md - - name: SQL Tracking - href: sql-tracking.md - - name: Scenario - href: scenario.md - items: - - name: Activity Library - href: activity-library.md - items: - - name: SendMail Custom Activity - href: sendmail-custom-activity.md - - name: Throttled Parallel ForEach - href: throttled-parallel-foreach.md - - name: Database Access Activities - href: database-access-activities.md - - name: Externalized Policy Activity in .NET Framework 4.5 - href: externalized-policy-activity-in-net-framework-4-5.md - - name: Non-Generic ForEach - href: non-generic-foreach.md - - name: Non-Generic ParallelForEach - href: non-generic-parallelforeach.md - - name: Get WorkflowInstanceId - href: get-workflowinstanceid.md - - name: Services - items: - - name: Accessing OperationContext - href: accessing-operationcontext.md - - name: LINQ Message Query Correlation - href: linq-message-query-correlation.md - - name: Asynchronous Communication - href: asynchronous-communication.md - - name: WPF and WF Integration in XAML - href: wpf-and-wf-integration-in-xaml.md - - name: External Ruleset Toolkit - href: external-ruleset-toolkit.md +[] diff --git a/docs/framework/windows-workflow-foundation/samples/tracking-events-into-event-tracing-in-windows.md b/docs/framework/windows-workflow-foundation/samples/tracking-events-into-event-tracing-in-windows.md deleted file mode 100644 index 167903936fe6e..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/tracking-events-into-event-tracing-in-windows.md +++ /dev/null @@ -1,151 +0,0 @@ ---- -description: "Learn more about: Tracking Events into Event Tracing in Windows" -title: "Tracking Events into Event Tracing in Windows" -ms.date: "03/30/2017" -ms.assetid: f812659b-0943-45ff-9430-4defa733182b ---- -# Tracking Events into Event Tracing in Windows - -This sample demonstrates how to enable Windows Workflow Foundation (WF) tracking on a workflow service and emit the tracking events in Event Tracing for Windows (ETW). To emit workflow tracking records into ETW, the sample uses the ETW tracking participant (). - -The workflow in the sample receives a request, assigns the reciprocal of the input data to the input variable and returns the reciprocal back to the client. When the input data is 0, a divide by zero exception occurs that is unhandled that causes the workflow to abort. With tracking enabled, the error track record is emitted to ETW, which can help troubleshoot the error later. The ETW tracking participant is configured with a tracking profile to subscribe to tracking records. The tracking profile is defined in the Web.config file and provided as a configuration parameter to the ETW tracking participant. The ETW tracking participant is configured in the Web.config file of the workflow service and is applied to the service as a service behavior. In this sample, you view the tracking events in the event log using Event Viewer. - -## Workflow Tracking Details - -Windows Workflow Foundation provides a tracking infrastructure to track the execution of a workflow instance. The tracking runtime creates a workflow instance to emit events related to the workflow lifecycle, events from workflow activities and custom events. The following table details the primary components of the tracking infrastructure. - -|Component|Description| -|---------------|-----------------| -|Tracking runtime|Provides the infrastructure to emit tracking records.| -|Tracking participants|Accesses the tracking records. [!INCLUDE[netfx_current_short](../../../../includes/netfx-current-short-md.md)] ships with a tracking participant that writes tracking records as Event Tracing for Windows (ETW) events.| -|Tracking profile|A filtering mechanism that allows a tracking participant to subscribe for a subset of the tracking records emitted from a workflow instance.| - -The following table details the tracking records that the workflow runtime emits. - -|Tracking record|Description| -|---------------------|-----------------| -|Workflow instance tracking records.|Describes the lifecycle of the workflow instance. For example, an instance record is emitted when the workflow starts or completes.| -|Activity state tracking records.|Details activity execution. These records indicate the state of a workflow activity such as when an activity is scheduled or when the activity completes or when a fault is thrown.| -|Bookmark resumption record.|Emitted whenever a bookmark within a workflow instance is resumed.| -|Custom tracking records.|A workflow author can create custom tracking records and emit them within the custom activity.| -||This record is emitted when an activity schedules another activity.| -||This record is emitted when a fault is propagated from an activity.| -||This record is emitted when an activity is canceled by another activity.| - -The tracking participant subscribes for a subset of the emitted tracking records using tracking profiles. A tracking profile contains tracking queries that allow subscribing for a particular tracking record type. Tracking profiles can be specified in code or in configuration. - -#### To use this sample - -1. Using Visual Studio 2010, open the EtwTrackingParticipantSample.sln solution file. - -2. To build the solution, press CTRL+SHIFT+B. - -3. To run the solution, press F5. - - By default, the service is listening on port 53797 (`http://localhost:53797/SampleWorkflowService.xamlx`). - -4. Using File Explorer, open the WCF test client. - - The WCF test client (WcfTestClient.exe) is located in the \\Common7\IDE\ folder. - - The default Visual Studio 2010 installation folder is C:\Program Files\Microsoft Visual Studio 10.0. - -5. In WCF test client, select **Add Service** from the **File** menu. - - Add the endpoint address in the input box. The default is `http://localhost:53797/SampleWorkflowService.xamlx`. - -6. Open the Event Viewer application. - - Before invoking the service, start Event Viewer from the **Start** menu, select **Run** and type in `eventvwr.exe`. Ensure that the event log is listening for tracking events emitted from the workflow service. - -7. In the tree view of the Event Viewer, navigate to **Event Viewer**, **Applications and Services Logs**, and **Microsoft**. Right-click **Microsoft** and select **View** and then **Show Analytic and Debug Logs** to enable the analytic and debug logs - - Ensure that the **Show Analytic and Debug Logs** option is checked. - -8. In the tree view in Event Viewer, navigate to **Event Viewer**, **Applications and Services Logs**, **Microsoft**, **Windows**, **Application Server-Applications**. Right-click **Analytic** and select **Enable Log** to enable the **Analytic** log. - -9. Test the service using the WCF test client by double-clicking `GetData`. - - This opens the `GetData` method. The request accepts one parameter and ensures that the value is 0, which is the default. - - Click **Invoke**. - -10. Observe the events emitted from the workflow. - - Switch back to Event Viewer and navigate to **Event Viewer**, **Applications and Services Logs**, **Microsoft**, **Windows**, **Application Server-Applications**. Right-click **Analytic** and select **Refresh**. - - The workflow events are displayed in the event viewer. Notice that workflow execution events are displayed and that one of them is an unhandled exception that corresponds to the error in workflow. Also, a warning event is emitted from the workflow activity, which indicates that the activity is throwing a fault. - -11. Repeat steps 9 and 10 with an input of data other than 0, so that no error is thrown. - -Tracking profiles allow you to subscribe to events that are emitted by the runtime when the state of a workflow instance changes. Depending on your monitoring requirements, you can create a profile that is very coarse, which subscribes to a small set of high-level state changes on a workflow. On the other hand, you can create a very precise profile whose output is rich enough to reconstruct the execution later. The sample demonstrates the events emitted from the workflow runtime to ETW using the `HealthMonitoring Tracking Profile`, which emits a small set of events. A different profile that emits more workflow tracking events is also provided in the Web.config that is named `Troubleshooting Tracking Profile`. When the [!INCLUDE[netfx_current_short](../../../../includes/netfx-current-short-md.md)] is installed, a default profile with an empty name is configured in the Machine.config file. This profile is used by the ETW tracking behavior configuration when no profile name or an empty profile name is specified. - -The health monitoring tracking profile emits workflow instance records and activity fault propagation records. This profile is created by adding the following tracking profile to a Web.config configuration file. - -```xml - - - - - - - - - - - - - - - - - - - - - -``` - - The profile can be changed by changing the `EtwTrackingParticipant` configuration to the following. - -```xml - - - - - - - -``` - -#### To clean up (Optional) - -1. Open Event Viewer. - -2. Navigate to **Event Viewer**, **Applications and Services Logs**, **Microsoft**, **Windows**, **Application Server-Applications**. Right-click **Analytic** and select **Disable Log**. - -3. Navigate to **Event Viewer**, **Applications and Services Logs**, **Microsoft**, **Windows**, **Application Server-Applications**. Right-click **Analytic** and select **Clear Log**. - -4. Choose the **Clear** option to clear the events. - -## Known Issue - -> [!NOTE] -> There is a known issue in the Event Viewer where it may fail to decode ETW events. You may see an error message that looks like the following. -> -> The description for Event ID \ from source Microsoft-Windows-Application Server-Applications cannot be found. Either the component that raises this event is not installed on your local computer or the installation is corrupted. You can install or repair the component on the local computer. -> -> If you encounter this error, click refresh in the actions pane. The event should now decode properly. - -> [!IMPORTANT] -> The samples may already be installed on your computer. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Basic\Tracking\EtwTracking` - -## See also - -- [AppFabric Monitoring Samples](/previous-versions/appfabric/ff383407(v=azure.10)) diff --git a/docs/framework/windows-workflow-foundation/samples/tracking.md b/docs/framework/windows-workflow-foundation/samples/tracking.md deleted file mode 100644 index b778cb96eaf97..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/tracking.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -description: "Learn more about: Tracking" -title: "Tracking" -ms.date: "03/30/2017" -ms.assetid: afdcd9bd-b462-4b2a-aac7-bebf9c80be81 ---- -# Tracking - -This section contains samples that demonstrate workflow tracking in Windows Workflow Foundation (WF). - -## In This Section - - [Custom Tracking](custom-tracking.md) - Demonstrates how to create a custom tracking participant and write the contents of the tracking data to console. - - [Tracking Events into Event Tracing in Windows](tracking-events-into-event-tracing-in-windows.md) - Demonstrates how to enable [!INCLUDE[wf1](../../../../includes/wf1-md.md)] tracking on a workflow service and emit the tracking events in Event Tracing for Windows (ETW). - - [SQL Tracking](sql-tracking.md) - Demonstrates how to write a custom SQL tracking participant that writes tracking records to a SQL database. diff --git a/docs/framework/windows-workflow-foundation/samples/using-editing-scope.md b/docs/framework/windows-workflow-foundation/samples/using-editing-scope.md deleted file mode 100644 index 9ebdb880e86f4..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/using-editing-scope.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -description: "Learn more about: Using Editing Scope" -title: "Using Editing Scope" -ms.date: "03/30/2017" -ms.assetid: 79306f9e-318b-4687-9863-8b93d1841716 ---- -# Using Editing Scope - -This sample demonstrates how to batch a set of changes so that they can be undone in a single atomic unit. By default, the actions taken by an activity designer author are automatically integrated into the Undo/Redo system. - -## Demonstrates - - Editing scope and Undo and Redo. - -## Discussion - - This sample demonstrates how to batch a set of changes to the tree within a single unit of work. Note that when binding to values directly from a WPF designer, changes are applied automatically. This sample demonstrates what must be done when multiple changes to be batched are being made through imperative code, rather than a single change. - - In this sample, three activities are added. When editing begins, is called on an instance of . Changes made to the tree within this editing scope are batched. The command returns an , which can be used to control this instance. Either or can be called to either commit or revert the editing scope. - - You can also nest objects, which allows for multiple sets of changes to be tracked as part of a larger editing scope and can be controlled individually. A scenario that may use this feature would be when changes from multiple dialogs must be committed or reverted separately, with all changes being treated as a single atomic operation. In this sample, the editing scopes are stacked using an of type . The is used so that the depth of the nesting can be observed on the designer surface. - -## To set up, build, and run the sample - -1. Build and run the sample, and then use the buttons on the left to modify the workflow. - -2. Click **Open Editing Scope**. - - 1. This command calls that creates an editing scope and pushes it onto the editing stack. - - 2. Three activities are then added to the selected . Note that if the editing scope had not been opened with , three new activities would appear on the designer canvas. Because this operation is still pending within the , the designer is not yet updated. - -3. Press **Close Editing Scope** to commit the editing scope. Three activities appear in the designer. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Basic\CustomActivities\CustomActivityDesigners\UsingEditingScope` diff --git a/docs/framework/windows-workflow-foundation/samples/using-the-expressiontextbox-in-a-custom-activity-designer.md b/docs/framework/windows-workflow-foundation/samples/using-the-expressiontextbox-in-a-custom-activity-designer.md deleted file mode 100644 index 0e88a1b2043ac..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/using-the-expressiontextbox-in-a-custom-activity-designer.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -description: "Learn more about: Using the ExpressionTextBox in a Custom Activity Designer" -title: "Using the ExpressionTextBox in a Custom Activity Designer" -ms.date: "03/30/2017" -ms.assetid: f82e73e7-a256-4a4d-82b7-c0d62f4ab5e7 ---- -# Using the ExpressionTextBox in a Custom Activity Designer - -This sample shows how to use the in a custom activity designer. The custom activity, `MultiAssign`, assigns two string values to two string variables. Some controls bind to s and some bind to s. - -## Sample details - - The `ArgumentToExpressionConverter` is the type converter used when binding expressions to arguments. The `ConverterParameter` must be set to `In` or `Out` as appropriate. `InOut` is not supported. - - The `UseLocationExpression` attribute is used on `OutArgument`s to specify that the expression should be an L-value ("left value" or "location value") expression. In most cases, an L-value expression is a valid Visual Basic identifier used to indicate that the `OutArgument` being returned is a variable or argument name. - - The `MaxLines` attribute is set to one in this example and `MinLines` is not set. This indicates that the is a fixed size of one line regardless of the amount of text typed by the user. To allow the to grow to fit user input, set `MaxLines` greater than `MinLines`. - - An ExpressionTextBox can only be bound to arguments, and cannot be bound to CLR properties. - -#### To use this sample - -1. Using Visual Studio 2010, open the ExpressionTextBoxSample.sln file. - -2. To build the solution, press CTRL+SHIFT+B. - -#### To run this sample - -1. Add a new Workflow Console Application to the solution. - -2. Add a reference to the **ExpressionTextBoxSample** project from the new Workflow Console Application project. - -3. Build the solution. - -4. Drag the **MultiAssign** activity from the toolbox and drop it into the workflow. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Basic\CustomActivities\CustomActivityDesigners\ExpressionTextBox` - -## See also - -- -- [Developing Applications with the Workflow Designer](/visualstudio/workflow-designer/developing-applications-with-the-workflow-designer) diff --git a/docs/framework/windows-workflow-foundation/samples/using-the-pick-activity.md b/docs/framework/windows-workflow-foundation/samples/using-the-pick-activity.md deleted file mode 100644 index 16636169e4bc5..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/using-the-pick-activity.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -description: "Learn more about: Using the Pick Activity" -title: "Using the Pick Activity" -ms.date: "03/30/2017" -ms.assetid: b89be812-a247-4025-b0e3-ffb20db027a6 ---- -# Using the Pick Activity - -This sample demonstrates how to use the activity. - - The activity provides event-based control modeling. It behaves similar to the C# `switch` statement, which executes only one of the branches in the `switch` statement. Unlike the `switch` statement in which a branch is executed based upon on a value, the activity executes a branch based upon how an activity completes. - - This sample prompts a user to type in their name on the console within a given time period. The activity in the sample has two branches that are executed based upon whether the user types in their name within 5 seconds or not. If the user types in their name within 5 seconds, the first branch is executed, which contains a custom `ReadLine` activity; otherwise the other branch is executed, which contains a activity. Once a user’s name is typed in on the console, the user’s name is printed on the console. If an input is not entered within 5 seconds, the operation is timed out. - -## Demonstrates - - activity. - -## Discussion - - The sample includes a Designer workflow and coded workflow. - - Designer Workflow - The Designer version of the sample demonstrates how to create a workflow in the designer. The following files are included: - -- Program.cs : Includes the `Main` function that executes the sample workflow. - -- ReadString.cs: A custom activity that reads some input from the console. - -- Sequence1.xaml: A workflow created using the designer that uses Pick. - - Coded Workflow - The coded version of the sample demonstrates how to create a workflow in the designer. The following files are included: - -- Program.cs : Includes the `Main` function that executes the sample workflow. - -- ReadString.cs: A custom activity that reads some input from the console. - -#### To use this sample - -1. Using Visual Studio 2010, open the Pick.sln solution file. - -2. To build the solution, press CTRL+SHIFT+B. - -3. To run the solution, press F5. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Basic\Built-InActivities\Pick` diff --git a/docs/framework/windows-workflow-foundation/samples/visual-workflow-tracking.md b/docs/framework/windows-workflow-foundation/samples/visual-workflow-tracking.md deleted file mode 100644 index 7382de60a547e..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/visual-workflow-tracking.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -description: "Learn more about: Visual Workflow Tracking" -title: "Visual Workflow Tracking" -ms.date: "03/30/2017" -ms.assetid: 0143448f-2044-40a0-8a3d-941f6d12468b ---- -# Visual Workflow Tracking - -This sample demonstrates how to write a visual workflow tracking application using the debug functionality available through the [!INCLUDE[netfx_current_short](../../../../includes/netfx-current-short-md.md)]. - -## Sample Details - - The application executes a simple flowchart workflow (defined in Workflow.xaml) and re-hosts the workflow designer to display the currently executing workflow. As the workflow is executed, the currently executing activity is shown with a yellow outline and debug arrow. In addition, tracking records generated by the workflow are also displayed in the application window. For more information about workflow tracking, see [Workflow Tracking and Tracing](../workflow-tracking-and-tracing.md). For more information about re-hosting the workflow designer, see [Rehosting the Workflow Designer](../rehosting-the-workflow-designer.md). - - The workflow simulator works by keeping two dictionaries. One contains a mapping between the currently executing activity object and the XAML line number in which the activity is instantiated. The other contains a mapping between the activity instance ID and the activity object. When tracking records are emitted using a custom tracking profile, the application determines the instance ID of the currently executing activity and maps it back to the XAML file that instantiated it. The rehosted workflow designer is then instructed to highlight the activity on the designer surface and use the same method as the workflow debugger, specifically drawing a yellow border around the activity and displaying a yellow arrow along the left side of the designer. - -#### To use this sample - -1. Open the WorkflowSimulator.sln file from the sample directory in Visual Studio 2010. - -2. Press CTRL+SHIFT+B to build the solution. - -3. Press CTRL + F5 to run the sample. This displays the Workflow.xaml file in a rehosted workflow designer window. - -4. Click the **File** menu and select **Run Workflow...**. - -5. Notice the currently executing activity is highlighted as described previously and the tracking records are displayed on the right side of the application window. - -6. When the workflow has completed, you can click any of the tracking records to inspect which activity it corresponds to. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Application\VisualWorkflowTracking` diff --git a/docs/framework/windows-workflow-foundation/samples/workflowhostingendpoint-resume-bookmark.md b/docs/framework/windows-workflow-foundation/samples/workflowhostingendpoint-resume-bookmark.md deleted file mode 100644 index f131f17a1f12b..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/workflowhostingendpoint-resume-bookmark.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -description: "Learn more about: WorkflowHostingEndpoint Resume Bookmark" -title: "WorkflowHostingEndpoint Resume Bookmark" -ms.date: "03/30/2017" -ms.assetid: a708064f-50b0-4751-b44e-d5410d08d451 ---- -# WorkflowHostingEndpoint Resume Bookmark - -This sample demonstrates how the can be used with to create workflow instances. - -## Demonstrates - - , - -## Discussion - - This sample uses the to create a workflow instance hosted using . is an extensibility point for that can be used in the following scenarios: - -- Creating new workflow instances. - -- Resuming bookmarks on a workflow instance hosted in a . - - The sample endpoint that is included exposes a contract that provides operations to create a workflow and return an instance ID, or to create an instance with a specific ID. The sample console application creates a instance with a basic workflow definition, and adds a `CreationEndpoint` to the host. It then calls the `Create` operation on the endpoint to create a new workflow instance. - -#### To set up, build, and run the sample - -1. Build the solution. - -2. Run the application. The `CreationEndpoint` console shows a message that includes the instance ID when the workflow instance is created. The message "Hello World!" is printed by the workflow on successful resumption of the bookmark. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Basic\Execution\ResumeBookmarkEndpoint` diff --git a/docs/framework/windows-workflow-foundation/samples/wpf-and-wf-integration-in-xaml.md b/docs/framework/windows-workflow-foundation/samples/wpf-and-wf-integration-in-xaml.md deleted file mode 100644 index 0069441f8248c..0000000000000 --- a/docs/framework/windows-workflow-foundation/samples/wpf-and-wf-integration-in-xaml.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -description: "Learn more about: WPF and Windows Workflow Foundation integration in XAML" -title: "WPF and WF Integration in XAML" -ms.date: "03/30/2017" -ms.assetid: a4f53b48-fc90-4315-bca0-ba009562f488 ---- -# WPF and Windows Workflow Foundation integration in XAML - -This sample demonstrates how to create an application that uses Windows Presentation Foundation (WPF) and Windows Workflow Foundation (WF) features in a single XAML document. To accomplish this, the sample uses Windows Workflow Foundation and XAML extensibility. - -## Sample details - - The ShowWindow.xaml file deserializes into a activity with two string variables that are manipulated by the sequence’s activities: `ShowWindow` and `WriteLine`. The activity outputs to the console window the expression that it assigns to the property. The `ShowWindow` activity displays a WPF window as part of its execution logic. The of the window includes the variables declared in the sequence. The controls of the window declared in the `ShowWindow` activity use data binding to manipulate those variables. Finally, the window contains a button control. The `Click` event for the button is handled by a named `MarkupExtension` that contains a `CloseWindow` activity. `MarkUpExtension` invokes the contained activity that provides, as context, any objects identified by an `x:Name`, as well as the of the containing window. Thus, the `CloseWindow.InArgument` can be bound using an expression that references the window’s name. - - The `ShowWindow` activity derives from the class to display a WPF window and completes when the window is closed. The `Window` property is of type `Func` that allows the window to be created on demand for each execution of the activity. The `Window` property uses a to enable this deferred evaluation model. The `FuncFactoryDeferringLoader` allows a `XamlReader` to be captured during serialization and then read during activity execution. - - A well-written activity never blocks the scheduler thread. However, the `ShowWindow` activity cannot complete until the window it is displaying is closed. The `ShowWindow` activity achieves this behavior by deriving from , calling the method in the method, and showing the window modally. The delegate is invoked through the WPF . The `ShowWindow` activity assigns the property to the `Window.DataContext` property to provide any data bound controls access to the in-scope variables. - - The last point of interest in this sample is a called `DelegateActivityExtension`. The `ProvideValue` method of this markup extension returns a delegate that invokes an embedded activity. This activity runs in an environment that includes the WPF data context and any `x:Name` values in scope. In the `GenericInvoke` method, this environment is provided to the activity through a extension. This extension is added to a that is then used to invoke the embedded activity whenever the markup extension’s delegate is invoked. - -> [!NOTE] -> The default designer does not support the ShowWindow activity; as such, the ShowWindow.Xaml file does not display correctly in the designer. - -## Run the sample - -1. Using Visual Studio, open the WPFWFIntegration.sln solution file. - -2. To build the solution, press **Ctrl**+**Shift**+**B**. - -3. To run the solution, press **F5**. - -4. Type your first and last name into the dialog. - -5. Close the dialog and the console echoes your name. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Scenario\WPFWFIntegration` diff --git a/docs/framework/windows-workflow-foundation/tracking-profiles.md b/docs/framework/windows-workflow-foundation/tracking-profiles.md index 70cd08351588e..b1892daf696cf 100644 --- a/docs/framework/windows-workflow-foundation/tracking-profiles.md +++ b/docs/framework/windows-workflow-foundation/tracking-profiles.md @@ -384,6 +384,6 @@ Here are some of the common examples of tracking profiles. ## See also -- [SQL Tracking](./samples/sql-tracking.md) +- [SQL Tracking](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/sql-tracking) - [Windows Server App Fabric Monitoring](/previous-versions/appfabric/ee677251(v=azure.10)) - [Monitoring Applications with App Fabric](/previous-versions/appfabric/ee677276(v=azure.10)) diff --git a/docs/framework/windows-workflow-foundation/using-a-custom-expression-editor.md b/docs/framework/windows-workflow-foundation/using-a-custom-expression-editor.md index f4a089f72589a..badc8b2f38f28 100644 --- a/docs/framework/windows-workflow-foundation/using-a-custom-expression-editor.md +++ b/docs/framework/windows-workflow-foundation/using-a-custom-expression-editor.md @@ -281,4 +281,4 @@ namespace WpfApplication1 - - -- [Using the ExpressionTextBox in a Custom Activity Designer](./samples/using-the-expressiontextbox-in-a-custom-activity-designer.md) +- [Using the ExpressionTextBox in a Custom Activity Designer](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/using-the-expressiontextbox-in-a-custom-activity-designer) diff --git a/docs/framework/windows-workflow-foundation/using-custom-activity-designers-and-templates.md b/docs/framework/windows-workflow-foundation/using-custom-activity-designers-and-templates.md index e771c0eda7b0a..a03e374372840 100644 --- a/docs/framework/windows-workflow-foundation/using-custom-activity-designers-and-templates.md +++ b/docs/framework/windows-workflow-foundation/using-custom-activity-designers-and-templates.md @@ -40,4 +40,4 @@ This section contains topics describing how to create custom activity designers ## External Resources - [Custom Activities](./samples/custom-activities.md) + [Custom Activities](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/custom-activities) diff --git a/docs/framework/windows-workflow-foundation/workflow-tracking-and-tracing.md b/docs/framework/windows-workflow-foundation/workflow-tracking-and-tracing.md index 7fe6524dd8622..b9c33df0bdf9a 100644 --- a/docs/framework/windows-workflow-foundation/workflow-tracking-and-tracing.md +++ b/docs/framework/windows-workflow-foundation/workflow-tracking-and-tracing.md @@ -51,4 +51,4 @@ Windows Workflow tracking is a [!INCLUDE[netfx_current_long](../../../includes/n ## See also -- [SQL Tracking](./samples/sql-tracking.md) +- [SQL Tracking](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/sql-tracking) From 4b700ccc433038cc0177c0fae2ce036293bb5606 Mon Sep 17 00:00:00 2001 From: Genevieve Warren <24882762+gewarren@users.noreply.github.com> Date: Mon, 21 Jun 2021 11:11:12 -0700 Subject: [PATCH 064/105] Delete WCF samples (#24739) --- .openpublishing.redirection.json | 1180 +++++++++++++++++ .../file-schema/wcf-directive/servicehost.md | 2 +- .../wcf/add-of-authorizationpolicies.md | 6 +- .../wcf/add-of-claimtyperequirements.md | 2 +- .../additionalrequestparameters-element.md | 2 +- .../file-schema/wcf/authorizationpolicies.md | 6 +- .../file-schema/wcf/basichttpbinding.md | 4 +- .../wcf/basichttpcontextbinding.md | 2 +- .../wcf/behavior-of-endpointbehaviors.md | 4 +- .../wcf/behavior-of-servicebehaviors.md | 4 +- .../file-schema/wcf/behaviors.md | 2 +- .../file-schema/wcf/bindings.md | 2 +- .../wcf/claimtyperequirements-element.md | 2 +- .../file-schema/wcf/custombinding.md | 2 +- .../file-schema/wcf/issuedtokenparameters.md | 2 +- .../wcf/issuer-of-issuedtokenparameters.md | 2 +- ...issuermetadata-of-issuedtokenparameters.md | 2 +- .../wcf/localclientsettings-element.md | 2 +- .../wcf/localservicesettings-element.md | 2 +- .../file-schema/wcf/mexhttpbinding.md | 2 +- .../file-schema/wcf/mexhttpsbinding.md | 6 +- .../file-schema/wcf/mexnamedpipebinding.md | 2 +- .../file-schema/wcf/mextcpbinding.md | 2 +- .../file-schema/wcf/msmqintegrationbinding.md | 2 +- .../file-schema/wcf/nethttpbinding.md | 4 +- .../file-schema/wcf/nethttpsbinding.md | 144 +- .../file-schema/wcf/netmsmqbinding.md | 2 +- .../file-schema/wcf/netnamedpipebinding.md | 2 +- .../file-schema/wcf/netpeertcpbinding.md | 2 +- .../file-schema/wcf/nettcpbinding.md | 2 +- .../file-schema/wcf/nettcpcontextbinding.md | 2 +- .../wcf/secureconversationbootstrap.md | 2 +- .../wcf/security-of-custombinding.md | 4 +- .../wcf/serviceauthorization-element.md | 6 +- .../file-schema/wcf/servicedebug.md | 4 +- .../file-schema/wcf/servicemetadata.md | 4 +- .../file-schema/wcf/servicesecurityaudit.md | 4 +- .../file-schema/wcf/servicethrottling.md | 2 +- .../file-schema/wcf/udpbinding.md | 2 +- .../file-schema/wcf/webhttpbinding.md | 2 +- .../wcf/ws2007federationhttpbinding.md | 2 +- .../file-schema/wcf/ws2007httpbinding.md | 2 +- .../file-schema/wcf/wsdualhttpbinding.md | 2 +- .../wcf/wsfederationhttpbinding.md | 2 +- .../file-schema/wcf/wshttpbinding.md | 2 +- .../file-schema/wcf/wshttpcontextbinding.md | 2 +- ...how-to-migrate-managed-code-dcom-to-wcf.md | 2 +- .../writing-large-responsive-apps.md | 2 +- docs/framework/toc.yml | 18 +- docs/framework/wcf/basic-wcf-programming.md | 8 +- docs/framework/wcf/conceptual-overview.md | 2 +- .../configuring-bindings-for-wcf-services.md | 2 +- ...ring-services-using-configuration-files.md | 2 +- .../wcf/configuring-wcf-services-in-code.md | 2 +- .../wcf/designing-service-contracts.md | 2 +- .../determining-service-operation-duration.md | 2 +- .../dynamically-enabling-analytic-tracing.md | 4 +- docs/framework/wcf/diagnostics/etw/index.md | 36 +- .../wcf/diagnostics/message-flow-overview.md | 2 +- .../tracing/configuring-tracing.md | 2 +- .../tracing/emitting-user-code-traces.md | 8 +- ...ty-concerns-and-useful-tips-for-tracing.md | 2 +- ...g-correlated-traces-and-troubleshooting.md | 4 +- .../wcf/endpoint-creation-overview.md | 2 +- .../client-channel-factories-and-channels.md | 2 +- .../configuration-and-metadata-support.md | 8 +- .../extending/creating-a-bindingelement.md | 4 +- .../creating-user-defined-bindings.md | 2 +- .../wcf/extending/custom-bindings.md | 2 +- .../wcf/extending/custom-encoders.md | 2 +- .../wcf/extending/developing-channels.md | 2 +- ...ing-custom-metadata-for-a-wcf-extension.md | 2 +- .../wcf/extending/extending-clients.md | 2 +- .../wcf/extending/extending-dispatchers.md | 10 +- ...e-a-custom-ws-metadata-exchange-binding.md | 6 +- ...tom-authorization-manager-for-a-service.md | 4 +- ...to-create-a-custom-authorization-policy.md | 2 +- ...reate-a-custom-client-identity-verifier.md | 6 +- .../extending/how-to-create-a-custom-token.md | 4 +- .../extending/how-to-import-custom-wsdl.md | 2 +- ...nspect-or-modify-messages-on-the-client.md | 2 +- ...o-lock-down-endpoints-in-the-enterprise.md | 6 +- ...etrieve-metadata-over-a-non-mex-binding.md | 2 +- ...dentity-of-a-service-for-authentication.md | 2 +- ...trieving-metadata-over-a-custom-binding.md | 2 +- .../service-channel-listeners-and-channels.md | 2 +- .../specifying-a-custom-crypto-algorithm.md | 2 +- .../accessing-services-using-a-client.md | 4 +- ...best-practices-for-queued-communication.md | 4 +- .../choosing-a-message-encoder.md | 2 +- docs/framework/wcf/feature-details/clients.md | 2 +- ...eserialization-with-serializationbinder.md | 4 +- ...-header-that-is-signed-and-or-encrypted.md | 4 +- ...eating-wcf-ajax-services-without-aspnet.md | 4 +- .../creating-wcf-services-for-aspnet-ajax.md | 2 +- .../data-contract-known-types.md | 4 +- .../delegation-and-impersonation-with-wcf.md | 4 +- .../discovery-find-and-findcriteria.md | 4 +- .../discoveryclient-and-dynamicendpoint.md | 4 +- .../wcf/feature-details/duplex-services.md | 2 +- .../wcf/feature-details/federation.md | 2 +- .../grouping-queued-messages-in-a-session.md | 2 +- .../hosting-in-a-managed-application.md | 2 +- ...osting-in-a-windows-service-application.md | 2 +- ...ess-a-wse-3-0-service-with-a-wcf-client.md | 2 +- ...ax-endpoint-without-using-configuration.md | 4 +- ...henticate-with-a-user-name-and-password.md | 4 +- ...gure-an-iis-hosted-wcf-service-with-ssl.md | 4 +- ...ure-credentials-on-a-federation-service.md | 2 +- ...igure-tracking-with-workflowservicehost.md | 2 +- .../how-to-control-service-instancing.md | 4 +- ...-data-contract-for-a-class-or-structure.md | 4 +- ...tom-reliable-session-binding-with-https.md | 2 +- .../how-to-create-a-duplex-contract.md | 6 +- .../how-to-create-a-federated-client.md | 2 +- .../how-to-create-a-one-way-contract.md | 4 +- .../how-to-create-a-security-token-service.md | 8 +- ...ow-to-create-a-service-endpoint-in-code.md | 2 +- ...ate-a-service-endpoint-in-configuration.md | 2 +- ...how-to-create-a-wsfederationhttpbinding.md | 2 +- .../feature-details/how-to-dynamic-update.md | 2 +- .../how-to-enable-streaming.md | 2 +- ...enable-the-net-tcp-port-sharing-service.md | 2 +- ...points-and-message-queuing-applications.md | 12 +- ...ange-messages-within-a-reliable-session.md | 2 +- ...ange-queued-messages-with-wcf-endpoints.md | 10 +- ...cf-service-in-a-managed-windows-service.md | 2 +- .../how-to-host-a-wcf-service-in-iis.md | 4 +- .../how-to-host-a-wcf-service-in-was.md | 4 +- ...-import-metadata-into-service-endpoints.md | 4 +- ...and-configure-wcf-activation-components.md | 6 +- ...ke-x-509-certificates-accessible-to-wcf.md | 8 +- ...overability-to-a-wcf-service-and-client.md | 6 +- ...or-a-service-using-a-configuration-file.md | 6 +- ...blish-metadata-for-a-service-using-code.md | 6 +- ...ecure-messages-within-reliable-sessions.md | 2 +- ...-to-serialize-and-deserialize-json-data.md | 2 +- .../how-to-service-data-partitioning.md | 2 +- .../how-to-service-versioning.md | 2 +- ...to-specify-channel-security-credentials.md | 4 +- ...custom-user-name-and-password-validator.md | 2 +- ...e-a-service-moniker-with-wsdl-contracts.md | 2 +- ...guration-to-add-an-aspnet-ajax-endpoint.md | 4 +- .../wcf/feature-details/how-to-use-filters.md | 2 +- ...w-to-use-the-aspnet-membership-provider.md | 4 +- ...the-aspnet-role-provider-with-a-service.md | 4 +- ...-get-requests-for-aspnet-ajax-endpoints.md | 6 +- ...rmation-services-hosting-best-practices.md | 2 +- .../large-data-and-streaming.md | 2 +- ...sage-security-with-a-certificate-client.md | 2 +- ...essage-security-with-a-user-name-client.md | 4 +- ...ssage-security-with-an-anonymous-client.md | 4 +- .../metadata-architecture-overview.md | 2 +- .../middle-tier-client-applications.md | 2 +- .../migrating-wse-3-0-web-services-to-wcf.md | 4 +- .../wcf/feature-details/one-way-services.md | 4 +- ...-of-messages-in-single-concurrency-mode.md | 2 +- .../poison-message-handling.md | 4 +- .../wcf/feature-details/queues-overview.md | 14 +- .../wcf/feature-details/queuing-in-wcf.md | 18 +- .../reliable-sessions-overview.md | 2 +- ...ecuring-messages-using-message-security.md | 2 +- .../security-considerations-with-metadata.md | 2 +- ...-in-json-with-message-level-programming.md | 2 +- .../service-endpoints-and-queue-addressing.md | 4 +- .../service-identity-and-authentication.md | 2 +- .../sessions-instancing-and-concurrency.md | 6 +- .../stand-alone-json-serialization.md | 2 +- ...sport-security-with-an-anonymous-client.md | 4 +- .../uritemplate-and-uritemplatetable.md | 6 +- .../using-a-data-contract-resolver.md | 6 +- .../feature-details/using-data-contracts.md | 2 +- .../wcf-services-and-aspnet.md | 2 +- .../wcf-web-http-programming-object-model.md | 2 +- .../working-with-certificates.md | 2 +- .../wcf/feature-details/wsdl-and-policy.md | 2 +- ...ind-private-key-tool-findprivatekey-exe.md | 2 +- .../framework/wcf/getting-started-tutorial.md | 8 +- .../wcf/guide-to-the-documentation.md | 4 +- .../wcf/guidelines-and-best-practices.md | 2 +- ...-a-wcf-service-in-a-managed-application.md | 4 +- ...how-to-host-and-run-a-basic-wcf-service.md | 4 +- ...ow-to-impersonate-a-client-on-a-service.md | 4 +- ...-the-principalpermissionattribute-class.md | 4 +- ...cure-a-service-with-windows-credentials.md | 2 +- ...how-to-specify-a-client-binding-in-code.md | 2 +- ...ecify-a-client-binding-in-configuration.md | 2 +- ...cify-a-service-binding-in-configuration.md | 2 +- docs/framework/wcf/index.md | 2 +- docs/framework/wcf/load-balancing.md | 2 +- docs/framework/wcf/samples/address-headers.md | 83 -- docs/framework/wcf/samples/addressing.md | 132 -- ...ajax-service-using-complex-types-sample.md | 67 - .../samples/ajax-service-using-http-post.md | 51 - .../ajax-service-with-json-and-xml-sample.md | 110 -- .../ajax-service-without-configuration.md | 51 - docs/framework/wcf/samples/ajax.md | 32 - .../wcf/samples/announcements-sample.md | 86 -- .../samples/asmx-client-with-a-wcf-service.md | 146 -- .../wcf/samples/aspnet-caching-integration.md | 64 - .../wcf/samples/aspnet-compatibility.md | 128 -- .../wcf/samples/authorization-policy.md | 505 ------- ...uthorizing-access-to-service-operations.md | 60 - .../wcf/samples/basic-ajax-service.md | 82 -- docs/framework/wcf/samples/basic-binding.md | 20 - .../wcf/samples/basic-data-contract.md | 144 -- .../wcf/samples/basic-http-service.md | 40 - docs/framework/wcf/samples/basic-sample.md | 100 -- docs/framework/wcf/samples/basic.md | 47 - .../basicbinding-with-transport-security.md | 87 -- docs/framework/wcf/samples/basicbinding.md | 92 -- .../wcf/samples/behavior-security.md | 23 - docs/framework/wcf/samples/behaviors.md | 35 - .../wcf/samples/binding-extensibility.md | 17 - docs/framework/wcf/samples/binding.md | 23 - .../wcf/samples/building-the-samples.md | 86 -- docs/framework/wcf/samples/channel-factory.md | 78 -- .../wcf/samples/channels-extensibility.md | 29 - .../framework/wcf/samples/chunking-channel.md | 391 ------ .../framework/wcf/samples/circular-tracing.md | 62 - .../wcf/samples/client-interoperability.md | 17 - .../wcf/samples/client-validation.md | 64 - docs/framework/wcf/samples/client.md | 32 - docs/framework/wcf/samples/concurrency.md | 109 -- .../wcf/samples/concurrencymode-reentrant.md | 80 -- .../samples/configuration-channel-factory.md | 51 - .../wcf/samples/configuration-sample.md | 267 ---- .../wcf/samples/configurationcodegenerator.md | 47 - docs/framework/wcf/samples/contract.md | 29 - .../cryptographic-agility-in-wcf-security.md | 40 - .../wcf/samples/custom-binding-imperative.md | 81 -- ...tom-binding-reliable-session-over-https.md | 134 -- .../custom-binding-reliable-session.md | 120 -- .../wcf/samples/custom-binding-security.md | 183 --- .../custom-binding-transport-and-encoding.md | 83 -- docs/framework/wcf/samples/custom-binding.md | 23 - .../wcf/samples/custom-channel-dispatcher.md | 56 - .../wcf/samples/custom-find-criteria.md | 68 - docs/framework/wcf/samples/custom-lifetime.md | 249 ---- ...tom-message-encoder-compression-encoder.md | 353 ----- ...tom-message-encoder-custom-text-encoder.md | 238 ---- .../wcf/samples/custom-message-filter.md | 135 -- .../wcf/samples/custom-message-interceptor.md | 174 --- .../custom-secure-metadata-endpoint.md | 186 --- .../wcf/samples/custom-service-host.md | 180 --- docs/framework/wcf/samples/custom-token.md | 633 --------- .../wcf/samples/custom-wsdl-publication.md | 308 ----- .../wcf/samples/customchannelstester.md | 66 - .../data-binding-in-a-windows-forms-client.md | 35 - .../samples/data-binding-in-a-wpf-client.md | 79 -- .../data-binding-in-an-aspnet-client.md | 35 - .../wcf/samples/data-binding-scenarios.md | 20 - docs/framework/wcf/samples/data-contracts.md | 29 - .../wcf/samples/datacontract-surrogate.md | 266 ---- .../wcf/samples/datacontractresolver.md | 167 --- ...tractresolver-netdatacontractserializer.md | 77 -- .../samples/datacontractserializer-sample.md | 138 -- .../wcf/samples/dead-letter-queues.md | 359 ----- .../wcf/samples/default-message-contract.md | 182 --- .../wcf/samples/default-nettcpbinding.md | 119 -- .../wcf/samples/default-service-behavior.md | 91 -- ...n-patterns-list-based-publish-subscribe.md | 158 --- .../wcf/samples/discovery-router-service.md | 38 - .../wcf/samples/discovery-samples.md | 32 - .../wcf/samples/discovery-security-sample.md | 76 -- .../samples/discovery-with-scopes-sample.md | 36 - .../wcf/samples/dispatch-by-body-element.md | 179 --- docs/framework/wcf/samples/duplex.md | 191 --- .../wcf/samples/durable-instance-context.md | 458 ------- .../samples/durable-issued-token-provider.md | 255 ---- docs/framework/wcf/samples/etw-tracing.md | 107 -- .../wcf/samples/expected-exceptions.md | 77 -- .../wcf/samples/extended-protection-policy.md | 62 - ...ntrol-over-error-handling-and-reporting.md | 155 --- .../wcf/samples/extending-tracing.md | 101 -- docs/framework/wcf/samples/extensibility.md | 59 - docs/framework/wcf/samples/fault-contract.md | 133 -- .../wcf/samples/federation-sample.md | 115 -- .../wcf/samples/feed-formatter-json.md | 61 - docs/framework/wcf/samples/findprivatekey.md | 98 -- .../wcf/samples/firewall-instructions.md | 86 -- .../wcf/samples/getting-started-sample.md | 285 ---- .../hello-world-with-the-routing-service.md | 61 - docs/framework/wcf/samples/hosting.md | 29 - .../wcf/samples/httpcookiesession.md | 171 --- .../samples/iis-hosting-using-inline-code.md | 94 -- ...r-certificate-installation-instructions.md | 79 -- docs/framework/wcf/samples/imperative.md | 91 -- .../wcf/samples/impersonating-the-client.md | 122 -- docs/framework/wcf/samples/index.md | 22 - .../installing-message-queuing-msmq.md | 63 - .../wcf/samples/instancing-extensibility.md | 23 - .../wcf/samples/instancing-initialization.md | 266 ---- docs/framework/wcf/samples/instancing.md | 136 -- ...nformation-service-hosting-instructions.md | 175 --- .../wcf/samples/interop-extensibility.md | 17 - .../interoperating-with-asmx-web-services.md | 128 -- .../wcf/samples/json-serialization.md | 67 - docs/framework/wcf/samples/jsonp.md | 69 - docs/framework/wcf/samples/known-types.md | 168 --- .../wcf/samples/knownassemblyattribute.md | 369 ------ docs/framework/wcf/samples/local-channel.md | 38 - .../loosely-typed-extensions-sample.md | 160 --- docs/framework/wcf/samples/management.md | 41 - .../chunking-channel-receive.gif | Bin 2272 -> 0 bytes .../chunking-channel-send.gif | Bin 1998 -> 0 bytes .../samples/media/iiscertificate-wizard.GIF | Bin 19399 -> 0 bytes .../samples/membership-and-role-provider.md | 196 --- .../wcf/samples/message-contracts.md | 26 - .../wcf/samples/message-correlation.md | 314 ----- .../samples/message-encoder-extensibility.md | 17 - .../wcf/samples/message-inspectors.md | 414 ------ .../samples/message-queueing-integration.md | 20 - .../wcf/samples/message-queuing-to-wcf.md | 156 --- .../wcf/samples/message-security-anonymous.md | 236 ---- .../wcf/samples/message-security-binding.md | 23 - .../samples/message-security-certificate.md | 331 ----- .../message-security-over-message-queuing.md | 345 ----- .../wcf/samples/message-security-sample.md | 176 --- .../wcf/samples/message-security-user-name.md | 236 ---- .../wcf/samples/message-security-windows.md | 77 -- .../wcf/samples/metadata-extensibility.md | 17 - .../samples/metadata-publishing-behavior.md | 83 -- docs/framework/wcf/samples/msmq-activation.md | 347 ----- docs/framework/wcf/samples/mtom-encoding.md | 77 -- .../wcf/samples/multiple-contracts.md | 60 - ...ultiple-endpoints-at-a-single-listenuri.md | 78 -- .../wcf/samples/multiple-endpoints.md | 116 -- .../wcf/samples/namedpipe-activation.md | 225 ---- docs/framework/wcf/samples/net-binding.md | 23 - .../framework/wcf/samples/net-msmq-binding.md | 35 - .../samples/net-tcp-port-sharing-sample.md | 138 -- .../wcf/samples/netnamedpipebinding.md | 91 -- docs/framework/wcf/samples/nettcpbinding.md | 17 - .../wcf/samples/object-references.md | 117 -- ...ime-setup-procedure-for-the-wcf-samples.md | 83 -- docs/framework/wcf/samples/one-way.md | 103 -- ...ration-formatter-and-operation-selector.md | 180 --- .../wcf/samples/operationcontextscope.md | 129 -- .../wcf/samples/pii-security-lockdown.md | 147 -- docs/framework/wcf/samples/poco-support.md | 58 - .../poison-message-handling-in-msmq-4-0.md | 324 ----- docs/framework/wcf/samples/pooling.md | 253 ---- .../wcf/samples/reliable-secure-profile.md | 38 - .../wcf/samples/retrieve-metadata.md | 66 - docs/framework/wcf/samples/route-by-body.md | 70 - .../framework/wcf/samples/routing-services.md | 14 - .../wcf/samples/running-the-samples.md | 81 -- .../wcf/samples/saml-token-provider.md | 396 ------ docs/framework/wcf/samples/scenario.md | 29 - .../wcf/samples/security-extensibility.md | 41 - docs/framework/wcf/samples/security-in-wcf.md | 14 - .../wcf/samples/security-validation.md | 109 -- docs/framework/wcf/samples/self-host.md | 76 -- .../wcf/samples/service-auditing-behavior.md | 52 - .../wcf/samples/service-contracts.md | 29 - .../wcf/samples/service-debug-behavior.md | 56 - .../wcf/samples/service-description.md | 99 -- .../wcf/samples/service-identity-sample.md | 156 --- .../wcf/samples/service-interoperability.md | 17 - .../framework/wcf/samples/service-security.md | 14 - .../samples/service-transaction-behavior.md | 262 ---- docs/framework/wcf/samples/services.md | 59 - docs/framework/wcf/samples/session.md | 89 -- .../wcf/samples/sessions-and-queues.md | 266 ---- .../wcf/samples/set-up-instructions.md | 42 - .../setting-the-use-and-style-properties.md | 91 -- ...mplified-configuration-for-wcf-services.md | 80 -- .../wcf/samples/soap-and-http-endpoints.md | 64 - docs/framework/wcf/samples/srmp.md | 96 -- .../stand-alone-diagnostics-feed-sample.md | 95 -- docs/framework/wcf/samples/stream.md | 186 --- .../wcf/samples/streaming-feeds-sample.md | 121 -- .../strongly-typed-extensions-sample.md | 287 ---- .../wcf/samples/supporting-tokens.md | 473 ------- .../syndication-extensibility-samples.md | 20 - docs/framework/wcf/samples/syndication.md | 17 - .../systemwebrouting-integration-sample.md | 84 -- docs/framework/wcf/samples/tcp-activation.md | 207 --- docs/framework/wcf/samples/throttling.md | 79 -- docs/framework/wcf/samples/toc.yml | 519 +------- .../wcf/samples/token-authenticator.md | 366 ----- docs/framework/wcf/samples/token-provider.md | 291 ---- docs/framework/wcf/samples/tool-samples.md | 20 - .../samples/tracing-and-message-logging.md | 137 -- .../wcf/samples/transacted-msmq-binding.md | 236 ---- ...ort-custom-transactions-over-udp-sample.md | 264 ---- .../wcf/samples/transport-extensibility.md | 20 - docs/framework/wcf/samples/transport-udp.md | 504 ------- .../transport-wse-3-0-tcp-interoperability.md | 197 --- .../wcf/samples/trusted-facade-service.md | 292 ---- .../wcf/samples/two-way-communication.md | 328 ----- docs/framework/wcf/samples/typed-client.md | 64 - docs/framework/wcf/samples/udp-activation.md | 167 --- .../wcf/samples/untyped-request-reply.md | 86 -- .../wcf/samples/unwrapped-messages.md | 108 -- .../wcf/samples/uritemplate-sample.md | 35 - .../uritemplate-table-dispatcher-sample.md | 37 - .../wcf/samples/uritemplate-table-sample.md | 37 - .../samples/usage-of-serialization-binder.md | 31 - .../samples/usage-of-standard-endpoints.md | 167 --- ...lose-abort-release-wcf-client-resources.md | 116 -- .../samples/user-name-password-validator.md | 320 ----- .../wcf/samples/using-performance-counters.md | 77 -- .../using-the-wcf-moniker-with-com-clients.md | 237 ---- .../virtual-directory-setup-instructions.md | 191 --- .../samples/volatile-queued-communication.md | 225 ---- .../wcf/samples/wcf-analytic-tracing.md | 122 -- ...-services-and-event-tracing-for-windows.md | 88 -- .../wcf/samples/wcf-to-message-queuing.md | 175 --- .../weakly-typed-json-serialization-sample.md | 137 -- docs/framework/wcf/samples/web.md | 29 - .../samples/webcontenttypemapper-sample.md | 66 - .../wcf/samples/windows-process-activation.md | 20 - .../wcf/samples/windows-service-host.md | 64 - docs/framework/wcf/samples/wmi-provider.md | 146 -- .../wcf/samples/workflow-discovery-sample.md | 32 - .../ws-2007-federation-http-binding.md | 126 -- docs/framework/wcf/samples/ws-binding.md | 38 - docs/framework/wcf/samples/ws-dual-http.md | 101 -- .../wcf/samples/ws-reliable-session.md | 82 -- .../wcf/samples/ws-transaction-flow.md | 286 ---- .../wcf/samples/ws-transport-security.md | 82 -- .../ws-transport-with-message-credential.md | 94 -- docs/framework/wcf/samples/wshttpbinding.md | 88 -- .../wcf/samples/wsstreamedhttpbinding.md | 141 -- .../samples/x-509-certificate-validator.md | 355 ----- .../framework/wcf/samples/xmlreader-sample.md | 106 -- .../wcf/samples/xmlserializer-faults.md | 58 - .../wcf/samples/xmlserializer-sample.md | 131 -- docs/framework/wcf/securing-services.md | 2 +- .../wcf/sending-and-receiving-faults.md | 8 +- .../wcf/services-and-transactions.md | 2 +- .../wcf/specifying-an-endpoint-address.md | 2 +- .../wcf/troubleshooting-setup-issues.md | 2 +- docs/framework/wcf/using-sessions.md | 2 +- docs/framework/wcf/wcf-client-overview.md | 8 +- docs/framework/wcf/wcf-error-handling.md | 2 +- .../wcf/wcf-troubleshooting-quickstart.md | 4 +- .../feature-specifics.md | 10 +- .../performance.md | 2 +- 441 files changed, 1604 insertions(+), 30945 deletions(-) delete mode 100644 docs/framework/wcf/samples/address-headers.md delete mode 100644 docs/framework/wcf/samples/addressing.md delete mode 100644 docs/framework/wcf/samples/ajax-service-using-complex-types-sample.md delete mode 100644 docs/framework/wcf/samples/ajax-service-using-http-post.md delete mode 100644 docs/framework/wcf/samples/ajax-service-with-json-and-xml-sample.md delete mode 100644 docs/framework/wcf/samples/ajax-service-without-configuration.md delete mode 100644 docs/framework/wcf/samples/ajax.md delete mode 100644 docs/framework/wcf/samples/announcements-sample.md delete mode 100644 docs/framework/wcf/samples/asmx-client-with-a-wcf-service.md delete mode 100644 docs/framework/wcf/samples/aspnet-caching-integration.md delete mode 100644 docs/framework/wcf/samples/aspnet-compatibility.md delete mode 100644 docs/framework/wcf/samples/authorization-policy.md delete mode 100644 docs/framework/wcf/samples/authorizing-access-to-service-operations.md delete mode 100644 docs/framework/wcf/samples/basic-ajax-service.md delete mode 100644 docs/framework/wcf/samples/basic-binding.md delete mode 100644 docs/framework/wcf/samples/basic-data-contract.md delete mode 100644 docs/framework/wcf/samples/basic-http-service.md delete mode 100644 docs/framework/wcf/samples/basic-sample.md delete mode 100644 docs/framework/wcf/samples/basic.md delete mode 100644 docs/framework/wcf/samples/basicbinding-with-transport-security.md delete mode 100644 docs/framework/wcf/samples/basicbinding.md delete mode 100644 docs/framework/wcf/samples/behavior-security.md delete mode 100644 docs/framework/wcf/samples/behaviors.md delete mode 100644 docs/framework/wcf/samples/binding-extensibility.md delete mode 100644 docs/framework/wcf/samples/binding.md delete mode 100644 docs/framework/wcf/samples/building-the-samples.md delete mode 100644 docs/framework/wcf/samples/channel-factory.md delete mode 100644 docs/framework/wcf/samples/channels-extensibility.md delete mode 100644 docs/framework/wcf/samples/chunking-channel.md delete mode 100644 docs/framework/wcf/samples/circular-tracing.md delete mode 100644 docs/framework/wcf/samples/client-interoperability.md delete mode 100644 docs/framework/wcf/samples/client-validation.md delete mode 100644 docs/framework/wcf/samples/client.md delete mode 100644 docs/framework/wcf/samples/concurrency.md delete mode 100644 docs/framework/wcf/samples/concurrencymode-reentrant.md delete mode 100644 docs/framework/wcf/samples/configuration-channel-factory.md delete mode 100644 docs/framework/wcf/samples/configuration-sample.md delete mode 100644 docs/framework/wcf/samples/configurationcodegenerator.md delete mode 100644 docs/framework/wcf/samples/contract.md delete mode 100644 docs/framework/wcf/samples/cryptographic-agility-in-wcf-security.md delete mode 100644 docs/framework/wcf/samples/custom-binding-imperative.md delete mode 100644 docs/framework/wcf/samples/custom-binding-reliable-session-over-https.md delete mode 100644 docs/framework/wcf/samples/custom-binding-reliable-session.md delete mode 100644 docs/framework/wcf/samples/custom-binding-security.md delete mode 100644 docs/framework/wcf/samples/custom-binding-transport-and-encoding.md delete mode 100644 docs/framework/wcf/samples/custom-binding.md delete mode 100644 docs/framework/wcf/samples/custom-channel-dispatcher.md delete mode 100644 docs/framework/wcf/samples/custom-find-criteria.md delete mode 100644 docs/framework/wcf/samples/custom-lifetime.md delete mode 100644 docs/framework/wcf/samples/custom-message-encoder-compression-encoder.md delete mode 100644 docs/framework/wcf/samples/custom-message-encoder-custom-text-encoder.md delete mode 100644 docs/framework/wcf/samples/custom-message-filter.md delete mode 100644 docs/framework/wcf/samples/custom-message-interceptor.md delete mode 100644 docs/framework/wcf/samples/custom-secure-metadata-endpoint.md delete mode 100644 docs/framework/wcf/samples/custom-service-host.md delete mode 100644 docs/framework/wcf/samples/custom-token.md delete mode 100644 docs/framework/wcf/samples/custom-wsdl-publication.md delete mode 100644 docs/framework/wcf/samples/customchannelstester.md delete mode 100644 docs/framework/wcf/samples/data-binding-in-a-windows-forms-client.md delete mode 100644 docs/framework/wcf/samples/data-binding-in-a-wpf-client.md delete mode 100644 docs/framework/wcf/samples/data-binding-in-an-aspnet-client.md delete mode 100644 docs/framework/wcf/samples/data-binding-scenarios.md delete mode 100644 docs/framework/wcf/samples/data-contracts.md delete mode 100644 docs/framework/wcf/samples/datacontract-surrogate.md delete mode 100644 docs/framework/wcf/samples/datacontractresolver.md delete mode 100644 docs/framework/wcf/samples/datacontractserializer-datacontractresolver-netdatacontractserializer.md delete mode 100644 docs/framework/wcf/samples/datacontractserializer-sample.md delete mode 100644 docs/framework/wcf/samples/dead-letter-queues.md delete mode 100644 docs/framework/wcf/samples/default-message-contract.md delete mode 100644 docs/framework/wcf/samples/default-nettcpbinding.md delete mode 100644 docs/framework/wcf/samples/default-service-behavior.md delete mode 100644 docs/framework/wcf/samples/design-patterns-list-based-publish-subscribe.md delete mode 100644 docs/framework/wcf/samples/discovery-router-service.md delete mode 100644 docs/framework/wcf/samples/discovery-samples.md delete mode 100644 docs/framework/wcf/samples/discovery-security-sample.md delete mode 100644 docs/framework/wcf/samples/discovery-with-scopes-sample.md delete mode 100644 docs/framework/wcf/samples/dispatch-by-body-element.md delete mode 100644 docs/framework/wcf/samples/duplex.md delete mode 100644 docs/framework/wcf/samples/durable-instance-context.md delete mode 100644 docs/framework/wcf/samples/durable-issued-token-provider.md delete mode 100644 docs/framework/wcf/samples/etw-tracing.md delete mode 100644 docs/framework/wcf/samples/expected-exceptions.md delete mode 100644 docs/framework/wcf/samples/extended-protection-policy.md delete mode 100644 docs/framework/wcf/samples/extending-control-over-error-handling-and-reporting.md delete mode 100644 docs/framework/wcf/samples/extending-tracing.md delete mode 100644 docs/framework/wcf/samples/extensibility.md delete mode 100644 docs/framework/wcf/samples/fault-contract.md delete mode 100644 docs/framework/wcf/samples/federation-sample.md delete mode 100644 docs/framework/wcf/samples/feed-formatter-json.md delete mode 100644 docs/framework/wcf/samples/findprivatekey.md delete mode 100644 docs/framework/wcf/samples/firewall-instructions.md delete mode 100644 docs/framework/wcf/samples/getting-started-sample.md delete mode 100644 docs/framework/wcf/samples/hello-world-with-the-routing-service.md delete mode 100644 docs/framework/wcf/samples/hosting.md delete mode 100644 docs/framework/wcf/samples/httpcookiesession.md delete mode 100644 docs/framework/wcf/samples/iis-hosting-using-inline-code.md delete mode 100644 docs/framework/wcf/samples/iis-server-certificate-installation-instructions.md delete mode 100644 docs/framework/wcf/samples/imperative.md delete mode 100644 docs/framework/wcf/samples/impersonating-the-client.md delete mode 100644 docs/framework/wcf/samples/index.md delete mode 100644 docs/framework/wcf/samples/installing-message-queuing-msmq.md delete mode 100644 docs/framework/wcf/samples/instancing-extensibility.md delete mode 100644 docs/framework/wcf/samples/instancing-initialization.md delete mode 100644 docs/framework/wcf/samples/instancing.md delete mode 100644 docs/framework/wcf/samples/internet-information-service-hosting-instructions.md delete mode 100644 docs/framework/wcf/samples/interop-extensibility.md delete mode 100644 docs/framework/wcf/samples/interoperating-with-asmx-web-services.md delete mode 100644 docs/framework/wcf/samples/json-serialization.md delete mode 100644 docs/framework/wcf/samples/jsonp.md delete mode 100644 docs/framework/wcf/samples/known-types.md delete mode 100644 docs/framework/wcf/samples/knownassemblyattribute.md delete mode 100644 docs/framework/wcf/samples/local-channel.md delete mode 100644 docs/framework/wcf/samples/loosely-typed-extensions-sample.md delete mode 100644 docs/framework/wcf/samples/management.md delete mode 100644 docs/framework/wcf/samples/media/chunking-channel/chunking-channel-receive.gif delete mode 100644 docs/framework/wcf/samples/media/chunking-channel/chunking-channel-send.gif delete mode 100644 docs/framework/wcf/samples/media/iiscertificate-wizard.GIF delete mode 100644 docs/framework/wcf/samples/membership-and-role-provider.md delete mode 100644 docs/framework/wcf/samples/message-contracts.md delete mode 100644 docs/framework/wcf/samples/message-correlation.md delete mode 100644 docs/framework/wcf/samples/message-encoder-extensibility.md delete mode 100644 docs/framework/wcf/samples/message-inspectors.md delete mode 100644 docs/framework/wcf/samples/message-queueing-integration.md delete mode 100644 docs/framework/wcf/samples/message-queuing-to-wcf.md delete mode 100644 docs/framework/wcf/samples/message-security-anonymous.md delete mode 100644 docs/framework/wcf/samples/message-security-binding.md delete mode 100644 docs/framework/wcf/samples/message-security-certificate.md delete mode 100644 docs/framework/wcf/samples/message-security-over-message-queuing.md delete mode 100644 docs/framework/wcf/samples/message-security-sample.md delete mode 100644 docs/framework/wcf/samples/message-security-user-name.md delete mode 100644 docs/framework/wcf/samples/message-security-windows.md delete mode 100644 docs/framework/wcf/samples/metadata-extensibility.md delete mode 100644 docs/framework/wcf/samples/metadata-publishing-behavior.md delete mode 100644 docs/framework/wcf/samples/msmq-activation.md delete mode 100644 docs/framework/wcf/samples/mtom-encoding.md delete mode 100644 docs/framework/wcf/samples/multiple-contracts.md delete mode 100644 docs/framework/wcf/samples/multiple-endpoints-at-a-single-listenuri.md delete mode 100644 docs/framework/wcf/samples/multiple-endpoints.md delete mode 100644 docs/framework/wcf/samples/namedpipe-activation.md delete mode 100644 docs/framework/wcf/samples/net-binding.md delete mode 100644 docs/framework/wcf/samples/net-msmq-binding.md delete mode 100644 docs/framework/wcf/samples/net-tcp-port-sharing-sample.md delete mode 100644 docs/framework/wcf/samples/netnamedpipebinding.md delete mode 100644 docs/framework/wcf/samples/nettcpbinding.md delete mode 100644 docs/framework/wcf/samples/object-references.md delete mode 100644 docs/framework/wcf/samples/one-time-setup-procedure-for-the-wcf-samples.md delete mode 100644 docs/framework/wcf/samples/one-way.md delete mode 100644 docs/framework/wcf/samples/operation-formatter-and-operation-selector.md delete mode 100644 docs/framework/wcf/samples/operationcontextscope.md delete mode 100644 docs/framework/wcf/samples/pii-security-lockdown.md delete mode 100644 docs/framework/wcf/samples/poco-support.md delete mode 100644 docs/framework/wcf/samples/poison-message-handling-in-msmq-4-0.md delete mode 100644 docs/framework/wcf/samples/pooling.md delete mode 100644 docs/framework/wcf/samples/reliable-secure-profile.md delete mode 100644 docs/framework/wcf/samples/retrieve-metadata.md delete mode 100644 docs/framework/wcf/samples/route-by-body.md delete mode 100644 docs/framework/wcf/samples/routing-services.md delete mode 100644 docs/framework/wcf/samples/running-the-samples.md delete mode 100644 docs/framework/wcf/samples/saml-token-provider.md delete mode 100644 docs/framework/wcf/samples/scenario.md delete mode 100644 docs/framework/wcf/samples/security-extensibility.md delete mode 100644 docs/framework/wcf/samples/security-in-wcf.md delete mode 100644 docs/framework/wcf/samples/security-validation.md delete mode 100644 docs/framework/wcf/samples/self-host.md delete mode 100644 docs/framework/wcf/samples/service-auditing-behavior.md delete mode 100644 docs/framework/wcf/samples/service-contracts.md delete mode 100644 docs/framework/wcf/samples/service-debug-behavior.md delete mode 100644 docs/framework/wcf/samples/service-description.md delete mode 100644 docs/framework/wcf/samples/service-identity-sample.md delete mode 100644 docs/framework/wcf/samples/service-interoperability.md delete mode 100644 docs/framework/wcf/samples/service-security.md delete mode 100644 docs/framework/wcf/samples/service-transaction-behavior.md delete mode 100644 docs/framework/wcf/samples/services.md delete mode 100644 docs/framework/wcf/samples/session.md delete mode 100644 docs/framework/wcf/samples/sessions-and-queues.md delete mode 100644 docs/framework/wcf/samples/set-up-instructions.md delete mode 100644 docs/framework/wcf/samples/setting-the-use-and-style-properties.md delete mode 100644 docs/framework/wcf/samples/simplified-configuration-for-wcf-services.md delete mode 100644 docs/framework/wcf/samples/soap-and-http-endpoints.md delete mode 100644 docs/framework/wcf/samples/srmp.md delete mode 100644 docs/framework/wcf/samples/stand-alone-diagnostics-feed-sample.md delete mode 100644 docs/framework/wcf/samples/stream.md delete mode 100644 docs/framework/wcf/samples/streaming-feeds-sample.md delete mode 100644 docs/framework/wcf/samples/strongly-typed-extensions-sample.md delete mode 100644 docs/framework/wcf/samples/supporting-tokens.md delete mode 100644 docs/framework/wcf/samples/syndication-extensibility-samples.md delete mode 100644 docs/framework/wcf/samples/syndication.md delete mode 100644 docs/framework/wcf/samples/systemwebrouting-integration-sample.md delete mode 100644 docs/framework/wcf/samples/tcp-activation.md delete mode 100644 docs/framework/wcf/samples/throttling.md delete mode 100644 docs/framework/wcf/samples/token-authenticator.md delete mode 100644 docs/framework/wcf/samples/token-provider.md delete mode 100644 docs/framework/wcf/samples/tool-samples.md delete mode 100644 docs/framework/wcf/samples/tracing-and-message-logging.md delete mode 100644 docs/framework/wcf/samples/transacted-msmq-binding.md delete mode 100644 docs/framework/wcf/samples/transport-custom-transactions-over-udp-sample.md delete mode 100644 docs/framework/wcf/samples/transport-extensibility.md delete mode 100644 docs/framework/wcf/samples/transport-udp.md delete mode 100644 docs/framework/wcf/samples/transport-wse-3-0-tcp-interoperability.md delete mode 100644 docs/framework/wcf/samples/trusted-facade-service.md delete mode 100644 docs/framework/wcf/samples/two-way-communication.md delete mode 100644 docs/framework/wcf/samples/typed-client.md delete mode 100644 docs/framework/wcf/samples/udp-activation.md delete mode 100644 docs/framework/wcf/samples/untyped-request-reply.md delete mode 100644 docs/framework/wcf/samples/unwrapped-messages.md delete mode 100644 docs/framework/wcf/samples/uritemplate-sample.md delete mode 100644 docs/framework/wcf/samples/uritemplate-table-dispatcher-sample.md delete mode 100644 docs/framework/wcf/samples/uritemplate-table-sample.md delete mode 100644 docs/framework/wcf/samples/usage-of-serialization-binder.md delete mode 100644 docs/framework/wcf/samples/usage-of-standard-endpoints.md delete mode 100644 docs/framework/wcf/samples/use-close-abort-release-wcf-client-resources.md delete mode 100644 docs/framework/wcf/samples/user-name-password-validator.md delete mode 100644 docs/framework/wcf/samples/using-performance-counters.md delete mode 100644 docs/framework/wcf/samples/using-the-wcf-moniker-with-com-clients.md delete mode 100644 docs/framework/wcf/samples/virtual-directory-setup-instructions.md delete mode 100644 docs/framework/wcf/samples/volatile-queued-communication.md delete mode 100644 docs/framework/wcf/samples/wcf-analytic-tracing.md delete mode 100644 docs/framework/wcf/samples/wcf-services-and-event-tracing-for-windows.md delete mode 100644 docs/framework/wcf/samples/wcf-to-message-queuing.md delete mode 100644 docs/framework/wcf/samples/weakly-typed-json-serialization-sample.md delete mode 100644 docs/framework/wcf/samples/web.md delete mode 100644 docs/framework/wcf/samples/webcontenttypemapper-sample.md delete mode 100644 docs/framework/wcf/samples/windows-process-activation.md delete mode 100644 docs/framework/wcf/samples/windows-service-host.md delete mode 100644 docs/framework/wcf/samples/wmi-provider.md delete mode 100644 docs/framework/wcf/samples/workflow-discovery-sample.md delete mode 100644 docs/framework/wcf/samples/ws-2007-federation-http-binding.md delete mode 100644 docs/framework/wcf/samples/ws-binding.md delete mode 100644 docs/framework/wcf/samples/ws-dual-http.md delete mode 100644 docs/framework/wcf/samples/ws-reliable-session.md delete mode 100644 docs/framework/wcf/samples/ws-transaction-flow.md delete mode 100644 docs/framework/wcf/samples/ws-transport-security.md delete mode 100644 docs/framework/wcf/samples/ws-transport-with-message-credential.md delete mode 100644 docs/framework/wcf/samples/wshttpbinding.md delete mode 100644 docs/framework/wcf/samples/wsstreamedhttpbinding.md delete mode 100644 docs/framework/wcf/samples/x-509-certificate-validator.md delete mode 100644 docs/framework/wcf/samples/xmlreader-sample.md delete mode 100644 docs/framework/wcf/samples/xmlserializer-faults.md delete mode 100644 docs/framework/wcf/samples/xmlserializer-sample.md diff --git a/.openpublishing.redirection.json b/.openpublishing.redirection.json index 905529a22f6f0..85123297c415b 100644 --- a/.openpublishing.redirection.json +++ b/.openpublishing.redirection.json @@ -5505,6 +5505,1186 @@ "source_path": "docs/framework/wcf/samples/web-extensibility.md", "redirect_url": "/previous-versions/dotnet/netframework-4.0/ee818234(v%3dvs.100)" }, + { + "source_path": "docs/framework/wcf/samples/index.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/index", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/set-up-instructions.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/set-up-instructions", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/one-time-setup-procedure-for-the-wcf-samples.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/one-time-setup-procedure-for-the-wcf-samples", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/firewall-instructions.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/firewall-instructions", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/internet-information-service-hosting-instructions.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/internet-information-service-hosting-instructions", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/iis-server-certificate-installation-instructions.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/iis-server-certificate-installation-instructions", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/virtual-directory-setup-instructions.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/virtual-directory-setup-instructions", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/installing-message-queuing-msmq.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/installing-message-queuing-msmq", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/building-the-samples.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/building-the-samples", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/running-the-samples.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/running-the-samples", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/basic.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/basic", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/getting-started-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/getting-started-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/ajax.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/ajax", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/jsonp.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/jsonp", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/json-serialization.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/json-serialization", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/basic-ajax-service.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/basic-ajax-service", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/ajax-service-using-http-post.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/ajax-service-using-http-post", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/ajax-service-without-configuration.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/ajax-service-without-configuration", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/ajax-service-using-complex-types-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/ajax-service-using-complex-types-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/ajax-service-with-json-and-xml-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/ajax-service-with-json-and-xml-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/binding.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/binding", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/basic-binding.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/basic-binding", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/message-security-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/message-security-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/basicbinding-with-transport-security.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/basicbinding-with-transport-security", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/basicbinding.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/basicbinding", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/custom-binding.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/custom-binding", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/custom-binding-imperative.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/custom-binding-imperative", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/custom-binding-transport-and-encoding.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/custom-binding-transport-and-encoding", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/custom-binding-reliable-session.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/custom-binding-reliable-session", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/custom-binding-reliable-session-over-https.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/custom-binding-reliable-session-over-https", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/custom-binding-security.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/custom-binding-security", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/net-binding.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/net-binding", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/net-msmq-binding.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/net-msmq-binding", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/transacted-msmq-binding.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/transacted-msmq-binding", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/volatile-queued-communication.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/volatile-queued-communication", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/dead-letter-queues.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/dead-letter-queues", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/poison-message-handling-in-msmq-4-0.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/poison-message-handling-in-msmq-4-0", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/sessions-and-queues.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/sessions-and-queues", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/two-way-communication.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/two-way-communication", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/srmp.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/srmp", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/message-security-over-message-queuing.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/message-security-over-message-queuing", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/message-queueing-integration.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/message-queueing-integration", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/message-queuing-to-wcf.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/message-queuing-to-wcf", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/wcf-to-message-queuing.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/wcf-to-message-queuing", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/message-correlation.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/message-correlation", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/nettcpbinding.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/nettcpbinding", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/default-nettcpbinding.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/default-nettcpbinding", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/net-tcp-port-sharing-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/net-tcp-port-sharing-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/netnamedpipebinding.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/netnamedpipebinding", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/ws-binding.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/ws-binding", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/ws-2007-federation-http-binding.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/ws-2007-federation-http-binding", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/ws-dual-http.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/ws-dual-http", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/mtom-encoding.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/mtom-encoding", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/wshttpbinding.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/wshttpbinding", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/ws-reliable-session.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/ws-reliable-session", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/ws-transport-security.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/ws-transport-security", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/message-security-binding.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/message-security-binding", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/message-security-anonymous.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/message-security-anonymous", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/message-security-certificate.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/message-security-certificate", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/message-security-user-name.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/message-security-user-name", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/message-security-windows.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/message-security-windows", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/ws-transport-with-message-credential.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/ws-transport-with-message-credential", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/ws-transaction-flow.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/ws-transaction-flow", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/client.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/client", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/client-interoperability.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/client-interoperability", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/interoperating-with-asmx-web-services.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/interoperating-with-asmx-web-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/xmlserializer-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/xmlserializer-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/address-headers.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/address-headers", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/channel-factory.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/channel-factory", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/expected-exceptions.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/expected-exceptions", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/retrieve-metadata.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/retrieve-metadata", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/use-close-abort-release-wcf-client-resources.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/use-close-abort-release-wcf-client-resources", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/typed-client.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/typed-client", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/contract.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/contract", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/data-contracts.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/data-contracts", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/basic-data-contract.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/basic-data-contract", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/datacontractserializer-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/datacontractserializer-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/known-types.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/known-types", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/object-references.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/object-references", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/poco-support.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/poco-support", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/usage-of-serialization-binder.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/usage-of-serialization-binder", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/message-contracts.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/message-contracts", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/default-message-contract.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/default-message-contract", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/untyped-request-reply.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/untyped-request-reply", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/unwrapped-messages.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/unwrapped-messages", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/setting-the-use-and-style-properties.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/setting-the-use-and-style-properties", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/xmlreader-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/xmlreader-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/service-contracts.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/service-contracts", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/duplex.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/duplex", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/fault-contract.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/fault-contract", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/one-way.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/one-way", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/session.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/session", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/stream.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/stream", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/xmlserializer-faults.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/xmlserializer-faults", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/datacontractresolver.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/datacontractresolver", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/knownassemblyattribute.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/knownassemblyattribute", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/datacontractserializer-datacontractresolver-netdatacontractserializer.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/datacontractserializer-datacontractresolver-netdatacontractserializer", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/discovery-samples.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/discovery-samples", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/announcements-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/announcements-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/basic-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/basic-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/configuration-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/configuration-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/discovery-with-scopes-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/discovery-with-scopes-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/custom-find-criteria.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/custom-find-criteria", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/workflow-discovery-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/workflow-discovery-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/discovery-router-service.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/discovery-router-service", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/management.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/management", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/wcf-services-and-event-tracing-for-windows.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/wcf-services-and-event-tracing-for-windows", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/wcf-analytic-tracing.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/wcf-analytic-tracing", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/circular-tracing.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/circular-tracing", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/etw-tracing.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/etw-tracing", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/extending-tracing.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/extending-tracing", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/pii-security-lockdown.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/pii-security-lockdown", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/using-performance-counters.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/using-performance-counters", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/tracing-and-message-logging.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/tracing-and-message-logging", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/security-validation.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/security-validation", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/wmi-provider.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/wmi-provider", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/routing-services.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/routing-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/hello-world-with-the-routing-service.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/hello-world-with-the-routing-service", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/security-in-wcf.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/security-in-wcf", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/cryptographic-agility-in-wcf-security.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/cryptographic-agility-in-wcf-security", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/services.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/hosting.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/hosting", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/windows-process-activation.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/windows-process-activation", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/namedpipe-activation.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/namedpipe-activation", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/tcp-activation.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/tcp-activation", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/msmq-activation.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/msmq-activation", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/systemwebrouting-integration-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/systemwebrouting-integration-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/aspnet-compatibility.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/aspnet-compatibility", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/iis-hosting-using-inline-code.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/iis-hosting-using-inline-code", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/windows-service-host.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/windows-service-host", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/self-host.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/self-host", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/service-interoperability.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/service-interoperability", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/using-the-wcf-moniker-with-com-clients.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/using-the-wcf-moniker-with-com-clients", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/asmx-client-with-a-wcf-service.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/asmx-client-with-a-wcf-service", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/behaviors.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/behaviors", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/concurrency.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/concurrency", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/default-service-behavior.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/default-service-behavior", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/instancing.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/instancing", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/metadata-publishing-behavior.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/metadata-publishing-behavior", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/service-transaction-behavior.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/service-transaction-behavior", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/service-debug-behavior.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/service-debug-behavior", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/throttling.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/throttling", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/behavior-security.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/behavior-security", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/service-auditing-behavior.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/service-auditing-behavior", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/membership-and-role-provider.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/membership-and-role-provider", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/authorizing-access-to-service-operations.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/authorizing-access-to-service-operations", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/impersonating-the-client.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/impersonating-the-client", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/simplified-configuration-for-wcf-services.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/usage-of-standard-endpoints.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/usage-of-standard-endpoints", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/extended-protection-policy.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/extended-protection-policy", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/configuration-channel-factory.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/configuration-channel-factory", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/addressing.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/addressing", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/imperative.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/imperative", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/multiple-contracts.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/multiple-contracts", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/multiple-endpoints.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/multiple-endpoints", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/multiple-endpoints-at-a-single-listenuri.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/multiple-endpoints-at-a-single-listenuri", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/operationcontextscope.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/operationcontextscope", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/service-description.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/service-description", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/concurrencymode-reentrant.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/concurrencymode-reentrant", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/service-security.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/service-security", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/service-identity-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/service-identity-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/syndication.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/syndication", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/stand-alone-diagnostics-feed-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/stand-alone-diagnostics-feed-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/loosely-typed-extensions-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/loosely-typed-extensions-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/web.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/web", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/basic-http-service.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/basic-http-service", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/soap-and-http-endpoints.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/soap-and-http-endpoints", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/aspnet-caching-integration.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/aspnet-caching-integration", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/uritemplate-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/uritemplate-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/uritemplate-table-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/uritemplate-table-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/uritemplate-table-dispatcher-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/uritemplate-table-dispatcher-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/extensibility.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/extensibility", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/binding-extensibility.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/binding-extensibility", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/wsstreamedhttpbinding.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/wsstreamedhttpbinding", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/channels-extensibility.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/channels-extensibility", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/local-channel.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/local-channel", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/reliable-secure-profile.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/reliable-secure-profile", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/custom-channel-dispatcher.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/custom-channel-dispatcher", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/chunking-channel.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/chunking-channel", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/httpcookiesession.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/httpcookiesession", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/custom-message-interceptor.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/custom-message-interceptor", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/instancing-extensibility.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/instancing-extensibility", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/durable-instance-context.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/durable-instance-context", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/custom-lifetime.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/custom-lifetime", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/instancing-initialization.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/instancing-initialization", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/pooling.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/pooling", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/interop-extensibility.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/interop-extensibility", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/dispatch-by-body-element.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/dispatch-by-body-element", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/route-by-body.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/route-by-body", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/message-encoder-extensibility.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/message-encoder-extensibility", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/custom-message-encoder-custom-text-encoder.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/custom-message-encoder-custom-text-encoder", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/custom-message-encoder-compression-encoder.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/custom-message-encoder-compression-encoder", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/metadata-extensibility.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/metadata-extensibility", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/custom-secure-metadata-endpoint.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/custom-secure-metadata-endpoint", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/custom-wsdl-publication.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/custom-wsdl-publication", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/security-extensibility.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/security-extensibility", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/durable-issued-token-provider.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/durable-issued-token-provider", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/saml-token-provider.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/saml-token-provider", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/supporting-tokens.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/supporting-tokens", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/token-authenticator.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/token-authenticator", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/token-provider.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/token-provider", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/user-name-password-validator.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/user-name-password-validator", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/x-509-certificate-validator.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/x-509-certificate-validator", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/authorization-policy.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/authorization-policy", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/custom-token.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/custom-token", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/client-validation.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/client-validation", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/syndication-extensibility-samples.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/syndication-extensibility-samples", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/strongly-typed-extensions-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/strongly-typed-extensions-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/feed-formatter-json.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/feed-formatter-json", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/streaming-feeds-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/streaming-feeds-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/transport-extensibility.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/transport-extensibility", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/udp-activation.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/udp-activation", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/transport-custom-transactions-over-udp-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/transport-custom-transactions-over-udp-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/transport-udp.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/transport-udp", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/transport-wse-3-0-tcp-interoperability.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/transport-wse-3-0-tcp-interoperability", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/operation-formatter-and-operation-selector.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/operation-formatter-and-operation-selector", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/custom-message-filter.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/custom-message-filter", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/custom-service-host.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/custom-service-host", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/datacontract-surrogate.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/datacontract-surrogate", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/extending-control-over-error-handling-and-reporting.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/extending-control-over-error-handling-and-reporting", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/message-inspectors.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/message-inspectors", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/webcontenttypemapper-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/webcontenttypemapper-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/scenario.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/scenario", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/data-binding-scenarios.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/data-binding-scenarios", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/data-binding-in-a-windows-forms-client.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/data-binding-in-a-windows-forms-client", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/data-binding-in-an-aspnet-client.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/data-binding-in-an-aspnet-client", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/data-binding-in-a-wpf-client.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/data-binding-in-a-wpf-client", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/discovery-security-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/discovery-security-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/federation-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/federation-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/weakly-typed-json-serialization-sample.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/weakly-typed-json-serialization-sample", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/trusted-facade-service.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/trusted-facade-service", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/design-patterns-list-based-publish-subscribe.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/design-patterns-list-based-publish-subscribe", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/tool-samples.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/tool-samples", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/configurationcodegenerator.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/configurationcodegenerator", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/customchannelstester.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/customchannelstester", + "redirect_document_id": false + }, + { + "source_path": "docs/framework/wcf/samples/findprivatekey.md", + "redirect_url": "/previous-versions/dotnet/framework/wcf/samples/findprivatekey", + "redirect_document_id": false + }, { "source_path": "docs/framework/wcf/wcf-system-requirements.md", "redirect_url": "/dotnet/framework/get-started/system-requirements" diff --git a/docs/framework/configure-apps/file-schema/wcf-directive/servicehost.md b/docs/framework/configure-apps/file-schema/wcf-directive/servicehost.md index b77df5c9ef90c..83f88d877c496 100644 --- a/docs/framework/configure-apps/file-schema/wcf-directive/servicehost.md +++ b/docs/framework/configure-apps/file-schema/wcf-directive/servicehost.md @@ -69,4 +69,4 @@ Factory="WebScriptServiceHostFactory" ## See also -- [Custom Service Host](../../../wcf/samples/custom-service-host.md) +- [Custom Service Host](/previous-versions/dotnet/framework/wcf/samples/custom-service-host) diff --git a/docs/framework/configure-apps/file-schema/wcf/add-of-authorizationpolicies.md b/docs/framework/configure-apps/file-schema/wcf/add-of-authorizationpolicies.md index 5c7786c0b2d0e..8e832efa843e7 100644 --- a/docs/framework/configure-apps/file-schema/wcf/add-of-authorizationpolicies.md +++ b/docs/framework/configure-apps/file-schema/wcf/add-of-authorizationpolicies.md @@ -51,7 +51,7 @@ Specifies an authorization policy for claim transformation. ## Remarks - Each authorization policy contains a single required `policyType` attribute that is a string. The attribute specifies an authorization policy, which enables transformation of one set of input claims into another set of claims. Access control can be granted or denied based on that. For more information on how an authorization policy works, see and [Authorization Policy](../../../wcf/samples/authorization-policy.md). + Each authorization policy contains a single required `policyType` attribute that is a string. The attribute specifies an authorization policy, which enables transformation of one set of input claims into another set of claims. Access control can be granted or denied based on that. For more information on how an authorization policy works, see and [Authorization Policy](/previous-versions/dotnet/framework/wcf/samples/authorization-policy). ## See also @@ -62,7 +62,7 @@ Specifies an authorization policy for claim transformation. - - - -- [Authorizing Access to Service Operations](../../../wcf/samples/authorizing-access-to-service-operations.md) +- [Authorizing Access to Service Operations](/previous-versions/dotnet/framework/wcf/samples/authorizing-access-to-service-operations) - [How to: Create a Custom Authorization Manager for a Service](../../../wcf/extending/how-to-create-a-custom-authorization-manager-for-a-service.md) - [\](add-of-authorizationpolicies.md) -- [Authorization Policy](../../../wcf/samples/authorization-policy.md) +- [Authorization Policy](/previous-versions/dotnet/framework/wcf/samples/authorization-policy) diff --git a/docs/framework/configure-apps/file-schema/wcf/add-of-claimtyperequirements.md b/docs/framework/configure-apps/file-schema/wcf/add-of-claimtyperequirements.md index 8d16e62f57769..14e84fa2230d1 100644 --- a/docs/framework/configure-apps/file-schema/wcf/add-of-claimtyperequirements.md +++ b/docs/framework/configure-apps/file-schema/wcf/add-of-claimtyperequirements.md @@ -88,4 +88,4 @@ Specifies the types of required and optional claims expected to appear in the fe - [Custom Bindings](../../../wcf/extending/custom-bindings.md) - [\](custombinding.md) - [How to: Create a Custom Binding Using the SecurityBindingElement](../../../wcf/feature-details/how-to-create-a-custom-binding-using-the-securitybindingelement.md) -- [Custom Binding Security](../../../wcf/samples/custom-binding-security.md) +- [Custom Binding Security](/previous-versions/dotnet/framework/wcf/samples/custom-binding-security) diff --git a/docs/framework/configure-apps/file-schema/wcf/additionalrequestparameters-element.md b/docs/framework/configure-apps/file-schema/wcf/additionalrequestparameters-element.md index 4ea907cd8b5af..f3f48b6181e59 100644 --- a/docs/framework/configure-apps/file-schema/wcf/additionalrequestparameters-element.md +++ b/docs/framework/configure-apps/file-schema/wcf/additionalrequestparameters-element.md @@ -22,4 +22,4 @@ This contains a collection of configuration elements that specify additional req - [Custom Bindings](../../../wcf/extending/custom-bindings.md) - [\](custombinding.md) - [How to: Create a Custom Binding Using the SecurityBindingElement](../../../wcf/feature-details/how-to-create-a-custom-binding-using-the-securitybindingelement.md) -- [Custom Binding Security](../../../wcf/samples/custom-binding-security.md) +- [Custom Binding Security](/previous-versions/dotnet/framework/wcf/samples/custom-binding-security) diff --git a/docs/framework/configure-apps/file-schema/wcf/authorizationpolicies.md b/docs/framework/configure-apps/file-schema/wcf/authorizationpolicies.md index 2ec9e5b96e294..4be390fb88520 100644 --- a/docs/framework/configure-apps/file-schema/wcf/authorizationpolicies.md +++ b/docs/framework/configure-apps/file-schema/wcf/authorizationpolicies.md @@ -6,7 +6,7 @@ ms.assetid: 5b367489-54d7-408b-8f56-cb157dd68eaf --- # \ -This configuration section contains a collection of authorization policy types, which can be added using the `add` keyword. Each authorization policy contains a single required `policyType` attribute that is a string. The attribute specifies an authorization policy, which enables transformation of one set of input claims into another set of claims. Access control can be granted or denied based on that. For more information on how an authorization policy works, see and [Authorization Policy](../../../wcf/samples/authorization-policy.md). +This configuration section contains a collection of authorization policy types, which can be added using the `add` keyword. Each authorization policy contains a single required `policyType` attribute that is a string. The attribute specifies an authorization policy, which enables transformation of one set of input claims into another set of claims. Access control can be granted or denied based on that. For more information on how an authorization policy works, see and [Authorization Policy](/previous-versions/dotnet/framework/wcf/samples/authorization-policy). ## See also @@ -17,7 +17,7 @@ This configuration section contains a collection of authorization policy types, - - - -- [Authorizing Access to Service Operations](../../../wcf/samples/authorizing-access-to-service-operations.md) +- [Authorizing Access to Service Operations](/previous-versions/dotnet/framework/wcf/samples/authorizing-access-to-service-operations) - [How to: Create a Custom Authorization Manager for a Service](../../../wcf/extending/how-to-create-a-custom-authorization-manager-for-a-service.md) - [\](add-of-authorizationpolicies.md) -- [Authorization Policy](../../../wcf/samples/authorization-policy.md) +- [Authorization Policy](/previous-versions/dotnet/framework/wcf/samples/authorization-policy) diff --git a/docs/framework/configure-apps/file-schema/wcf/basichttpbinding.md b/docs/framework/configure-apps/file-schema/wcf/basichttpbinding.md index d3fcc606fbb15..996c26ec00686 100644 --- a/docs/framework/configure-apps/file-schema/wcf/basichttpbinding.md +++ b/docs/framework/configure-apps/file-schema/wcf/basichttpbinding.md @@ -67,7 +67,7 @@ Represents a binding that a Windows Communication Foundation (WCF) service can u |`maxBufferSize`|An integer value that specifies the maximum size, in bytes, of a buffer that stores messages while they are processed for an endpoint configured with this binding. The default value is 65,536 bytes.| |`maxReceivedMessageSize`|A positive integer that defines the maximum message size, in bytes, including headers, for a message that can be received on a channel configured with this binding. The sender receives a SOAP fault if the message is too large for the receiver. The receiver drops the message and creates an entry of the event in the trace log. The default is 65,536 bytes.| |`messageEncoding`|Defines the encoder used to encode the SOAP message. Valid values include the following:

    - Text: Use a text message encoder.
    - Mtom: Use a Message Transmission Organization Mechanism 1.0 (MTOM) encoder.

    The default is Text. This attribute is of type .| -|`name`|A string that contains the configuration name of the binding. This value should be unique among bindings of the same type. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| +|`name`|A string that contains the configuration name of the binding. This value should be unique among bindings of the same type. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services).| |`openTimeout`|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| |`proxyAddress`|A URI that contains the address of the HTTP proxy. If `useSystemWebProxy` is set to `true`, this setting must be `null`. The default is `null`.| |`receiveTimeout`|A value that specifies the interval of time provided for a receive operation to complete. This value should be greater than or equal to . The default is 00:10:00.| @@ -169,7 +169,7 @@ Represents a binding that a Windows Communication Foundation (WCF) service can u ``` - For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md). + For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services). ## See also diff --git a/docs/framework/configure-apps/file-schema/wcf/basichttpcontextbinding.md b/docs/framework/configure-apps/file-schema/wcf/basichttpcontextbinding.md index ad96badd854e4..30f25fe457ecc 100644 --- a/docs/framework/configure-apps/file-schema/wcf/basichttpcontextbinding.md +++ b/docs/framework/configure-apps/file-schema/wcf/basichttpcontextbinding.md @@ -66,7 +66,7 @@ Specifying a binding that provides context for the
    - Text: Use a text message encoder.
    - Mtom: Use a Message Transmission Organization Mechanism 1.0 (MTOM) encoder.

    The default is Text. This attribute is of type .| |`messageVersion`|Specifies the message version used by clients and services configured with the binding. This attribute is of type .| -|`name`|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| +|`name`|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services).| |`openTimeout`|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| |`proxyAddress`|A URI that contains the address of the HTTP proxy. If `useSystemWebProxy` is set to `true`, this setting must be `null`. The default is `null`.| |`receiveTimeout`|A value that specifies the interval of time provided for a receive operation to complete. This value should be greater than or equal to . The default is 00:10:00.| diff --git a/docs/framework/configure-apps/file-schema/wcf/behavior-of-endpointbehaviors.md b/docs/framework/configure-apps/file-schema/wcf/behavior-of-endpointbehaviors.md index 0ff36d1c698b3..1a2002a2de268 100644 --- a/docs/framework/configure-apps/file-schema/wcf/behavior-of-endpointbehaviors.md +++ b/docs/framework/configure-apps/file-schema/wcf/behavior-of-endpointbehaviors.md @@ -6,7 +6,7 @@ ms.assetid: b90ca3bc-3c22-4174-b903-e3a39898bd27 --- # \ of \ -The `behavior` element contains a collection of settings for the behavior of an endpoint. Each behavior is indexed by its `name`. Endpoints can link to each behavior through this name. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md). +The `behavior` element contains a collection of settings for the behavior of an endpoint. Each behavior is indexed by its `name`. Endpoints can link to each behavior through this name. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services). [**\**](../configuration-element.md)\   [**\**](system-servicemodel.md)\ @@ -34,7 +34,7 @@ The `behavior` element contains a collection of settings for the behavior of an |Attribute|Description| |---------------|-----------------| -|name|A unique string that contains the configuration name of the behavior. This value is a user-defined string that must be unique, since it acts as the identification string for the element. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| +|name|A unique string that contains the configuration name of the behavior. This value is a user-defined string that must be unique, since it acts as the identification string for the element. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services).| ### Child Elements diff --git a/docs/framework/configure-apps/file-schema/wcf/behavior-of-servicebehaviors.md b/docs/framework/configure-apps/file-schema/wcf/behavior-of-servicebehaviors.md index 7145982c704f5..e799a19bc5597 100644 --- a/docs/framework/configure-apps/file-schema/wcf/behavior-of-servicebehaviors.md +++ b/docs/framework/configure-apps/file-schema/wcf/behavior-of-servicebehaviors.md @@ -6,7 +6,7 @@ ms.assetid: 78fc0a08-55de-416a-ac12-a5e6ffc9a987 --- # \ of \ -The `behavior` element contains a collection of settings for the behavior of a service. Each behavior is indexed by its `name`. Services can link to each behavior through this name using the `behaviorConfiguration` attribute of the [\](endpoint-element.md) element. This allows endpoints to share common behavior configurations without redefining the settings. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md). +The `behavior` element contains a collection of settings for the behavior of a service. Each behavior is indexed by its `name`. Services can link to each behavior through this name using the `behaviorConfiguration` attribute of the [\](endpoint-element.md) element. This allows endpoints to share common behavior configurations without redefining the settings. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services). > [!NOTE] > Behavior elements specific to Windows Workflow activities, such as the [\](../windows-workflow-foundation/sendmessagechannelcache.md) element, are documented in the [\ of \](../windows-workflow-foundation/behavior-of-servicebehaviors-of-workflow.md) page. @@ -37,7 +37,7 @@ The `behavior` element contains a collection of settings for the behavior of a s |Attribute|Description| |---------------|-----------------| -|name|A unique string that contains the configuration name of the behavior. This value is a user-defined string that must be unique, since it acts as the identification string for the element. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| +|name|A unique string that contains the configuration name of the behavior. This value is a user-defined string that must be unique, since it acts as the identification string for the element. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services).| ### Child Elements diff --git a/docs/framework/configure-apps/file-schema/wcf/behaviors.md b/docs/framework/configure-apps/file-schema/wcf/behaviors.md index a3963b5a5275f..7a27655d235c2 100644 --- a/docs/framework/configure-apps/file-schema/wcf/behaviors.md +++ b/docs/framework/configure-apps/file-schema/wcf/behaviors.md @@ -6,7 +6,7 @@ ms.assetid: 0e5da4e6-1aa5-466c-924e-f10efee57f0b --- # \ -This element defines two child collections named `endpointBehaviors` and `serviceBehaviors`. Each collection defines behavior elements consumed by endpoints and services respectively. Each behavior element is identified by its unique `name` attribute. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md). +This element defines two child collections named `endpointBehaviors` and `serviceBehaviors`. Each collection defines behavior elements consumed by endpoints and services respectively. Each behavior element is identified by its unique `name` attribute. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services). [**\**](../configuration-element.md)\   [**\**](system-servicemodel.md)\ diff --git a/docs/framework/configure-apps/file-schema/wcf/bindings.md b/docs/framework/configure-apps/file-schema/wcf/bindings.md index be2ecbc89d585..6c960930daa4d 100644 --- a/docs/framework/configure-apps/file-schema/wcf/bindings.md +++ b/docs/framework/configure-apps/file-schema/wcf/bindings.md @@ -6,7 +6,7 @@ ms.assetid: b62cd369-5409-4030-8490-9759a462dd3a --- # \ -You can use the `bindings` element to configure a collection of standard and custom bindings for Windows Communication Foundation (WCF). Each entry is a `binding` element that can be identified by its unique `name`. Services use bindings by linking them using the `name`. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md). +You can use the `bindings` element to configure a collection of standard and custom bindings for Windows Communication Foundation (WCF). Each entry is a `binding` element that can be identified by its unique `name`. Services use bindings by linking them using the `name`. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services). ## System-provided bindings diff --git a/docs/framework/configure-apps/file-schema/wcf/claimtyperequirements-element.md b/docs/framework/configure-apps/file-schema/wcf/claimtyperequirements-element.md index ceabf30ecae37..ec937516eb45d 100644 --- a/docs/framework/configure-apps/file-schema/wcf/claimtyperequirements-element.md +++ b/docs/framework/configure-apps/file-schema/wcf/claimtyperequirements-element.md @@ -30,4 +30,4 @@ Specifies a collection of required claim types. - [Custom Bindings](../../../wcf/extending/custom-bindings.md) - [\](custombinding.md) - [How to: Create a Custom Binding Using the SecurityBindingElement](../../../wcf/feature-details/how-to-create-a-custom-binding-using-the-securitybindingelement.md) -- [Custom Binding Security](../../../wcf/samples/custom-binding-security.md) +- [Custom Binding Security](/previous-versions/dotnet/framework/wcf/samples/custom-binding-security) diff --git a/docs/framework/configure-apps/file-schema/wcf/custombinding.md b/docs/framework/configure-apps/file-schema/wcf/custombinding.md index c0e3ad9cb476f..6f2d10fb9a508 100644 --- a/docs/framework/configure-apps/file-schema/wcf/custombinding.md +++ b/docs/framework/configure-apps/file-schema/wcf/custombinding.md @@ -178,7 +178,7 @@ The following sections describe attributes, child elements, and parent elements |Attribute|Description| |---------------|-----------------| |closeTimeout|A value that specifies the interval of time provided for a close operation to complete. This value should be greater than or equal to . The default is 00:01:00.| -|name|A string that contains the configuration name of the binding. This value is a user-defined string that acts as the identification string for the custom binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| +|name|A string that contains the configuration name of the binding. This value is a user-defined string that acts as the identification string for the custom binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services).| |openTimeout|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| |receiveTimeout|A value that specifies the interval of time provided for a receive operation to complete. This value should be greater than or equal to . The default is 00:01:00.| |sendTimeout|A value that specifies the interval of time provided for a send operation to complete. This value should be greater than or equal to . The default is 00:01:00.| diff --git a/docs/framework/configure-apps/file-schema/wcf/issuedtokenparameters.md b/docs/framework/configure-apps/file-schema/wcf/issuedtokenparameters.md index 41545591f4041..cddf34a1657c9 100644 --- a/docs/framework/configure-apps/file-schema/wcf/issuedtokenparameters.md +++ b/docs/framework/configure-apps/file-schema/wcf/issuedtokenparameters.md @@ -80,7 +80,7 @@ Specifies the parameters for a security token issued in a Federated security sce - [Custom Bindings](../../../wcf/extending/custom-bindings.md) - [\](custombinding.md) - [How to: Create a Custom Binding Using the SecurityBindingElement](../../../wcf/feature-details/how-to-create-a-custom-binding-using-the-securitybindingelement.md) -- [Custom Binding Security](../../../wcf/samples/custom-binding-security.md) +- [Custom Binding Security](/previous-versions/dotnet/framework/wcf/samples/custom-binding-security) - [Service Identity and Authentication](../../../wcf/feature-details/service-identity-and-authentication.md) - [Federation and Issued Tokens](../../../wcf/feature-details/federation-and-issued-tokens.md) - [Security Capabilities with Custom Bindings](../../../wcf/feature-details/security-capabilities-with-custom-bindings.md) diff --git a/docs/framework/configure-apps/file-schema/wcf/issuer-of-issuedtokenparameters.md b/docs/framework/configure-apps/file-schema/wcf/issuer-of-issuedtokenparameters.md index 10cf7af2ee358..c3221c2deff0c 100644 --- a/docs/framework/configure-apps/file-schema/wcf/issuer-of-issuedtokenparameters.md +++ b/docs/framework/configure-apps/file-schema/wcf/issuer-of-issuedtokenparameters.md @@ -60,4 +60,4 @@ Specifies the Security Token Service (STS) that issues security tokens. - [Custom Bindings](../../../wcf/extending/custom-bindings.md) - [\](custombinding.md) - [How to: Create a Custom Binding Using the SecurityBindingElement](../../../wcf/feature-details/how-to-create-a-custom-binding-using-the-securitybindingelement.md) -- [Custom Binding Security](../../../wcf/samples/custom-binding-security.md) +- [Custom Binding Security](/previous-versions/dotnet/framework/wcf/samples/custom-binding-security) diff --git a/docs/framework/configure-apps/file-schema/wcf/issuermetadata-of-issuedtokenparameters.md b/docs/framework/configure-apps/file-schema/wcf/issuermetadata-of-issuedtokenparameters.md index 888cc27ab1672..192366754fd63 100644 --- a/docs/framework/configure-apps/file-schema/wcf/issuermetadata-of-issuedtokenparameters.md +++ b/docs/framework/configure-apps/file-schema/wcf/issuermetadata-of-issuedtokenparameters.md @@ -58,4 +58,4 @@ ms.assetid: 1a85ca37-496d-4fa3-8d44-d6c9383d735c - [Custom Bindings](../../../wcf/extending/custom-bindings.md) - [\](custombinding.md) - [How to: Create a Custom Binding Using the SecurityBindingElement](../../../wcf/feature-details/how-to-create-a-custom-binding-using-the-securitybindingelement.md) -- [Custom Binding Security](../../../wcf/samples/custom-binding-security.md) +- [Custom Binding Security](/previous-versions/dotnet/framework/wcf/samples/custom-binding-security) diff --git a/docs/framework/configure-apps/file-schema/wcf/localclientsettings-element.md b/docs/framework/configure-apps/file-schema/wcf/localclientsettings-element.md index 537cdf12b69ac..2d61c031a77a6 100644 --- a/docs/framework/configure-apps/file-schema/wcf/localclientsettings-element.md +++ b/docs/framework/configure-apps/file-schema/wcf/localclientsettings-element.md @@ -81,4 +81,4 @@ Specifies the security settings of a local client for this binding. - [Custom Bindings](../../../wcf/extending/custom-bindings.md) - [\](custombinding.md) - [How to: Create a Custom Binding Using the SecurityBindingElement](../../../wcf/feature-details/how-to-create-a-custom-binding-using-the-securitybindingelement.md) -- [Custom Binding Security](../../../wcf/samples/custom-binding-security.md) +- [Custom Binding Security](/previous-versions/dotnet/framework/wcf/samples/custom-binding-security) diff --git a/docs/framework/configure-apps/file-schema/wcf/localservicesettings-element.md b/docs/framework/configure-apps/file-schema/wcf/localservicesettings-element.md index 24f5806dbce0b..ff10f5fc9dc9b 100644 --- a/docs/framework/configure-apps/file-schema/wcf/localservicesettings-element.md +++ b/docs/framework/configure-apps/file-schema/wcf/localservicesettings-element.md @@ -99,4 +99,4 @@ Specifies the security settings of a local service for this binding. - [Custom Bindings](../../../wcf/extending/custom-bindings.md) - [\](custombinding.md) - [How to: Create a Custom Binding Using the SecurityBindingElement](../../../wcf/feature-details/how-to-create-a-custom-binding-using-the-securitybindingelement.md) -- [Custom Binding Security](../../../wcf/samples/custom-binding-security.md) +- [Custom Binding Security](/previous-versions/dotnet/framework/wcf/samples/custom-binding-security) diff --git a/docs/framework/configure-apps/file-schema/wcf/mexhttpbinding.md b/docs/framework/configure-apps/file-schema/wcf/mexhttpbinding.md index 9c2802eb4304a..902d4bf4f8eef 100644 --- a/docs/framework/configure-apps/file-schema/wcf/mexhttpbinding.md +++ b/docs/framework/configure-apps/file-schema/wcf/mexhttpbinding.md @@ -35,7 +35,7 @@ Specifies the settings for a binding used for the WS-MetadataExchange (WS-MEX) m |Attribute|Description| |---------------|-----------------| |`closeTimeout`|A value that specifies the interval of time provided for a close operation to complete. This value should be greater than or equal to . The default is 00:01:00.| -|`name`|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| +|`name`|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services).| |`openTimeout`|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| |`receiveTimeout`|A value that specifies the interval of time provided for a receive operation to complete. This value should be greater than or equal to . The default is 00:10:00.| |`sendTimeout`|A value that specifies the interval of time provided for a send operation to complete. This value should be greater than or equal to . The default is 00:01:00.| diff --git a/docs/framework/configure-apps/file-schema/wcf/mexhttpsbinding.md b/docs/framework/configure-apps/file-schema/wcf/mexhttpsbinding.md index b7a8d40b2b3bf..3137eb066c4c8 100644 --- a/docs/framework/configure-apps/file-schema/wcf/mexhttpsbinding.md +++ b/docs/framework/configure-apps/file-schema/wcf/mexhttpsbinding.md @@ -35,7 +35,7 @@ Specifies the settings for a binding used for the WS-MetadataExchange (WS-MEX) m |Attribute|Description| |---------------|-----------------| |`closeTimeout`|A value that specifies the interval of time provided for a close operation to complete. This value should be greater than or equal to . The default is 00:01:00.| -|`name`|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| +|`name`|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services).| |`openTimeout`|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| |`receiveTimeout`|A value that specifies the interval of time provided for a receive operation to complete. This value should be greater than or equal to . The default is 00:10:00.| |`sendTimeout`|A value that specifies the interval of time provided for a send operation to complete. This value should be greater than or equal to . The default is 00:01:00.| @@ -52,7 +52,7 @@ Specifies the settings for a binding used for the WS-MetadataExchange (WS-MEX) m ## Remarks - This binding is essentially a `WSHttpBinding` binding that supports transport-level security using certificates. For more information about configuring and using such a metadata endpoint, see [How to: Configure a Custom WS-Metadata Exchange Binding](../../../wcf/extending/how-to-configure-a-custom-ws-metadata-exchange-binding.md), [How to: Retrieve Metadata Over a non-MEX Binding](../../../wcf/extending/how-to-retrieve-metadata-over-a-non-mex-binding.md), and the sample [Custom Secure Metadata Endpoint](../../../wcf/samples/custom-secure-metadata-endpoint.md). + This binding is essentially a `WSHttpBinding` binding that supports transport-level security using certificates. For more information about configuring and using such a metadata endpoint, see [How to: Configure a Custom WS-Metadata Exchange Binding](../../../wcf/extending/how-to-configure-a-custom-ws-metadata-exchange-binding.md), [How to: Retrieve Metadata Over a non-MEX Binding](../../../wcf/extending/how-to-retrieve-metadata-over-a-non-mex-binding.md), and the sample [Custom Secure Metadata Endpoint](/previous-versions/dotnet/framework/wcf/samples/custom-secure-metadata-endpoint). ## See also @@ -62,7 +62,7 @@ Specifies the settings for a binding used for the WS-MetadataExchange (WS-MEX) m - [Publishing and Retrieving Metadata Over a Custom Binding](../../../wcf/extending/publishing-and-retrieving-metadata-over-a-custom-binding.md) - [How to: Configure a Custom WS-Metadata Exchange Binding](../../../wcf/extending/how-to-configure-a-custom-ws-metadata-exchange-binding.md) - [How to: Retrieve Metadata Over a non-MEX Binding](../../../wcf/extending/how-to-retrieve-metadata-over-a-non-mex-binding.md) -- [Custom Secure Metadata Endpoint](../../../wcf/samples/custom-secure-metadata-endpoint.md) +- [Custom Secure Metadata Endpoint](/previous-versions/dotnet/framework/wcf/samples/custom-secure-metadata-endpoint) - [Metadata](../../../wcf/feature-details/metadata.md) - [Bindings](../../../wcf/bindings.md) - [Configuring System-Provided Bindings](../../../wcf/feature-details/configuring-system-provided-bindings.md) diff --git a/docs/framework/configure-apps/file-schema/wcf/mexnamedpipebinding.md b/docs/framework/configure-apps/file-schema/wcf/mexnamedpipebinding.md index 441b556d64bb4..37d7c5ad66e8e 100644 --- a/docs/framework/configure-apps/file-schema/wcf/mexnamedpipebinding.md +++ b/docs/framework/configure-apps/file-schema/wcf/mexnamedpipebinding.md @@ -35,7 +35,7 @@ Specifies the settings for a binding used for the WS-MetadataExchange (WS-MEX) m |Attribute|Description| |---------------|-----------------| |`closeTimeout`|A value that specifies the interval of time provided for a close operation to complete. This value should be greater than or equal to . The default is 00:01:00.| -|`name`|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| +|`name`|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services).| |`openTimeout`|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| |`receiveTimeout`|A value that specifies the interval of time provided for a receive operation to complete. This value should be greater than or equal to . The default is 00:10:00.| |`sendTimeout`|A value that specifies the interval of time provided for a send operation to complete. This value should be greater than or equal to . The default is 00:01:00.| diff --git a/docs/framework/configure-apps/file-schema/wcf/mextcpbinding.md b/docs/framework/configure-apps/file-schema/wcf/mextcpbinding.md index e598751f1c530..23b41d61600ea 100644 --- a/docs/framework/configure-apps/file-schema/wcf/mextcpbinding.md +++ b/docs/framework/configure-apps/file-schema/wcf/mextcpbinding.md @@ -35,7 +35,7 @@ Specifies the settings for a binding used for the WS-MetadataExchange (WS-MEX) m |Attribute|Description| |---------------|-----------------| |`closeTimeout`|A value that specifies the interval of time provided for a close operation to complete. This value should be greater than or equal to . The default is 00:01:00.| -|`name`|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| +|`name`|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services).| |`openTimeout`|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| |`receiveTimeout`|A value that specifies the interval of time provided for a receive operation to complete. This value should be greater than or equal to . The default is 00:10:00.| |`sendTimeout`|A value that specifies the interval of time provided for a send operation to complete. This value should be greater than or equal to . The default is 00:01:00.| diff --git a/docs/framework/configure-apps/file-schema/wcf/msmqintegrationbinding.md b/docs/framework/configure-apps/file-schema/wcf/msmqintegrationbinding.md index 3bdeee56edf03..9e881241cbd92 100644 --- a/docs/framework/configure-apps/file-schema/wcf/msmqintegrationbinding.md +++ b/docs/framework/configure-apps/file-schema/wcf/msmqintegrationbinding.md @@ -59,7 +59,7 @@ Defines a binding that provides queuing support by routing messages through MSMQ |exactlyOnce|A Boolean value that indicates whether each message is delivered only once. The sender will then be notified of delivery failures. When `durable` is `false`, this attribute is ignored and messages are transferred without delivery assurance. The default is `true`. For more information, see .| |maxReceivedMessageSize|A positive integer that defines the maximum message size, in bytes, including headers, that is processed by this binding. The sender of a message exceeding this limit will receive a SOAP fault. The receiver drops the message and creates an entry of the event in the trace log. The default is 65536. This bound on message size is intended to limit exposure to Denial of Service (DoS) attacks.| |maxRetryCycles|An integer that indicates the number of retry cycles used by the poison-message detection feature. A message becomes a poison message when it fails all delivery attempts of all cycles. The default is 2. For more information, see .| -|name|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| +|name|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services).| |openTimeout|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| |receiveErrorHandling|A value that specifies how poison and nondispatchable messages are handled.| |receiveRetryCount|An integer that specifies the maximum number of immediate retries the queue manager should attempt if transmission of a message from the application queue to the application fails.

    If the maximum number of delivery attempts is reached and the message is not accessed by the application, then the message is sent to a retry queue for redelivery at a later time. The amount of time before the message is transferred back to the sending queue is controlled by `retryCycleDelay`. If retry cycles reach the `maxRetryCycles` value, then the message is either sent to the poison-message queue, or a negative acknowledgement is sent back to the sender.| diff --git a/docs/framework/configure-apps/file-schema/wcf/nethttpbinding.md b/docs/framework/configure-apps/file-schema/wcf/nethttpbinding.md index de0f820c9c8dd..0d697c82717c7 100644 --- a/docs/framework/configure-apps/file-schema/wcf/nethttpbinding.md +++ b/docs/framework/configure-apps/file-schema/wcf/nethttpbinding.md @@ -69,7 +69,7 @@ Represents a binding that a Windows Communication Foundation (WCF) service can u |`maxBufferSize`|An integer value that specifies the maximum size, in bytes, of a buffer that stores messages while they are processed for an endpoint configured with this binding. The default value is 65,536 bytes.| |`maxReceivedMessageSize`|A positive integer that defines the maximum message size, in bytes, including headers, for a message that can be received on a channel configured with this binding. The sender receives a SOAP fault if the message is too large for the receiver. The receiver drops the message and creates an entry of the event in the trace log. The default is 65,536 bytes.| |`messageEncoding`|Defines the encoder used to encode the SOAP message. Valid values include the following:

    - Text: Use a text message encoder.
    - Mtom: Use a Message Transmission Organization Mechanism 1.0 (MTOM) encoder.

    The default is Text. This attribute is of type .| -|`name`|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| +|`name`|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services).| |`openTimeout`|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| |`proxyAddress`|A URI that contains the address of the HTTP proxy. If `useSystemWebProxy` is set to `true`, this setting must be `null`. The default is `null`.| |`receiveTimeout`|A value that specifies the interval of time provided for a receive operation to complete. This value should be greater than or equal to . The default is 00:10:00.| @@ -172,7 +172,7 @@ Represents a binding that a Windows Communication Foundation (WCF) service can u
    ``` - For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md). + For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services). ## See also diff --git a/docs/framework/configure-apps/file-schema/wcf/nethttpsbinding.md b/docs/framework/configure-apps/file-schema/wcf/nethttpsbinding.md index f9852926db8af..8c9d756f9352c 100644 --- a/docs/framework/configure-apps/file-schema/wcf/nethttpsbinding.md +++ b/docs/framework/configure-apps/file-schema/wcf/nethttpsbinding.md @@ -6,16 +6,16 @@ ms.assetid: ff122116-6042-4792-9f21-275b4f97a105 --- # \ -Represents a binding that a Windows Communication Foundation (WCF) service can use to configure and expose endpoints that are able to communicate over HTTPS. When used with a duplex contract, Web Sockets will be used, otherwise HTTPS will be used. - +Represents a binding that a Windows Communication Foundation (WCF) service can use to configure and expose endpoints that are able to communicate over HTTPS. When used with a duplex contract, Web Sockets will be used, otherwise HTTPS will be used. + [**\**](../configuration-element.md)\   [**\**](system-servicemodel.md)\     [**\**](bindings.md)\ -      **\** +      **\** + +## Syntax -## Syntax - -```xml +```xml -``` - -## Type - - `Type` - -## Attributes and Elements - - The following sections describe attributes, child elements, and parent elements. - -### Attributes - -|Attribute|Description| -|---------------|-----------------| -|`allowCookies`|A Boolean value that indicates whether the client accepts cookies and propagates them on future requests. The default is `false`.

    You can use this property when you interact with ASMX Web services that use cookies. In this way, you can be sure that the cookies returned from the server are automatically copied to all future client requests for that service.| -|`bypassProxyOnLocal`|A Boolean value that indicates whether to bypass the proxy server for local addresses. The default is `false`.

    An Internet resource is local if it has a local address. A local address is one that is on same computer, the local LAN or intranet and is identified, syntactically, by the lack of a period (.) as in the URIs `http://webserver/` and `http://localhost/`.

    Setting this attribute determines whether endpoints configured with the BasicHttpBinding use the proxy server when accessing local resources. If this attribute is `true`, requests to local Internet resources do not use the proxy server. Use the host name (rather than localhost) if you want clients to go through a proxy when talking to services on the same machine when this attribute is set to `true`.

    When this attribute is `false`, all Internet requests are made through the proxy server.| -|`closeTimeout`|A value that specifies the interval of time provided for a close operation to complete. This value should be greater than or equal to . The default is 00:01:00.| -|`hostNameComparisonMode`|Specifies the HTTP hostname comparison mode used to parse URIs. This attribute is of type , which indicates whether the hostname is used to reach the service when matching on the URI. The default value is , which ignores the hostname in the match.| -|`maxBufferPoolSize`|An integer value that specifies the maximum amount of memory that is allocated for use by the manager of the message buffers that receive messages from the channel. The default value is 524288 (0x80000) bytes.

    The Buffer Manager minimizes the cost of using buffers by using a buffer pool. Buffers are required to process messages by the service when they come out of the channel. If there is not sufficient memory in the buffer pool to process the message load, the Buffer Manager must allocate additional memory from the CLR heap, which increases the garbage collection overhead. Extensive allocation from the CLR garbage heap is an indication that the buffer pool size is too small and that performance can be improved with a larger allocation by increasing the limit specified by this attribute.| -|`maxBufferSize`|An integer value that specifies the maximum size, in bytes, of a buffer that stores messages while they are processed for an endpoint configured with this binding. The default value is 65,536 bytes.| -|`maxReceivedMessageSize`|A positive integer that defines the maximum message size, in bytes, including headers, for a message that can be received on a channel configured with this binding. The sender receives a SOAP fault if the message is too large for the receiver. The receiver drops the message and creates an entry of the event in the trace log. The default is 65,536 bytes.| -|`messageEncoding`|Defines the encoder used to encode the SOAP message. Valid values include the following:

    - Text: Use a text message encoder.
    - Mtom: Use a Message Transmission Organization Mechanism 1.0 (MTOM) encoder.

    The default is Text. This attribute is of type .| -|`name`|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| -|`openTimeout`|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| -|`proxyAddress`|A URI that contains the address of the HTTP proxy. If `useSystemWebProxy` is set to `true`, this setting must be `null`. The default is `null`.| -|`receiveTimeout`|A value that specifies the interval of time provided for a receive operation to complete. This value should be greater than or equal to . The default is 00:10:00.| -|`sendTimeout`|A value that specifies the interval of time provided for a send operation to complete. This value should be greater than or equal to . The default is 00:01:00.| -|`textEncoding`|Sets the character set encoding to be used for emitting messages on the binding. Valid values include the following:

    - BigEndianUnicode: Unicode BigEndian encoding.
    - Unicode: 16-bit encoding.
    - UTF8: 8-bit encoding

    The default is UTF8. This attribute is of type .| -|`transferMode`|A valid value that specifies whether messages are buffered or streamed on a request or response.| -|`useDefaultWebProxy`|A Boolean value that specifies whether the auto-configured HTTP proxy of the system should be used, if available. The default is `true`.| -||| - -### Child Elements - -|Element|Description| -|-------------|-----------------| -|[\](security-of-nethttpbinding.md)|Defines the security settings for the binding. This element is of type . | -|[\](/previous-versions/dotnet/netframework-4.0/ms731325(v=vs.100))|Defines the constraints on the complexity of SOAP messages that can be processed by endpoints configured with this binding. This element is of type .| - -### Parent Elements - -|Element|Description| -|-------------|-----------------| -|[\](bindings.md)|This element holds a collection of standard and custom bindings.| - -## Remarks - - The NetHttpsBinding uses HTTPS as the transport for sending messages. When used with a duplex contract, Web Sockets will be used. When used with a request-reply contract NetHttpsBinding will behave like a BasicHttpsBinding with a binary encoder. - - Security is turned off by default, but can be added setting the mode attribute of the [\](security-of-basichttpbinding.md) child element to a value other than `None`. It uses a "Text" message encoding and UTF-8 text encoding by default. - -## Example - - The following example demonstrates the use of that provides HTTPS communication and maximum interoperability with first- and second-generation Web services. The binding is specified in the configuration files for the client and service. The binding type is specified using the `binding` attribute of the `` element. If you want to configure the basic binding and change some of its settings, it is necessary to define a binding configuration. The endpoint must reference the binding configuration by name by using the `bindingConfiguration` attribute of the `` element, as shown in the following configuration code for the service. - -```xml +``` + +## Type + + `Type` + +## Attributes and Elements + + The following sections describe attributes, child elements, and parent elements. + +### Attributes + +|Attribute|Description| +|---------------|-----------------| +|`allowCookies`|A Boolean value that indicates whether the client accepts cookies and propagates them on future requests. The default is `false`.

    You can use this property when you interact with ASMX Web services that use cookies. In this way, you can be sure that the cookies returned from the server are automatically copied to all future client requests for that service.| +|`bypassProxyOnLocal`|A Boolean value that indicates whether to bypass the proxy server for local addresses. The default is `false`.

    An Internet resource is local if it has a local address. A local address is one that is on same computer, the local LAN or intranet and is identified, syntactically, by the lack of a period (.) as in the URIs `http://webserver/` and `http://localhost/`.

    Setting this attribute determines whether endpoints configured with the BasicHttpBinding use the proxy server when accessing local resources. If this attribute is `true`, requests to local Internet resources do not use the proxy server. Use the host name (rather than localhost) if you want clients to go through a proxy when talking to services on the same machine when this attribute is set to `true`.

    When this attribute is `false`, all Internet requests are made through the proxy server.| +|`closeTimeout`|A value that specifies the interval of time provided for a close operation to complete. This value should be greater than or equal to . The default is 00:01:00.| +|`hostNameComparisonMode`|Specifies the HTTP hostname comparison mode used to parse URIs. This attribute is of type , which indicates whether the hostname is used to reach the service when matching on the URI. The default value is , which ignores the hostname in the match.| +|`maxBufferPoolSize`|An integer value that specifies the maximum amount of memory that is allocated for use by the manager of the message buffers that receive messages from the channel. The default value is 524288 (0x80000) bytes.

    The Buffer Manager minimizes the cost of using buffers by using a buffer pool. Buffers are required to process messages by the service when they come out of the channel. If there is not sufficient memory in the buffer pool to process the message load, the Buffer Manager must allocate additional memory from the CLR heap, which increases the garbage collection overhead. Extensive allocation from the CLR garbage heap is an indication that the buffer pool size is too small and that performance can be improved with a larger allocation by increasing the limit specified by this attribute.| +|`maxBufferSize`|An integer value that specifies the maximum size, in bytes, of a buffer that stores messages while they are processed for an endpoint configured with this binding. The default value is 65,536 bytes.| +|`maxReceivedMessageSize`|A positive integer that defines the maximum message size, in bytes, including headers, for a message that can be received on a channel configured with this binding. The sender receives a SOAP fault if the message is too large for the receiver. The receiver drops the message and creates an entry of the event in the trace log. The default is 65,536 bytes.| +|`messageEncoding`|Defines the encoder used to encode the SOAP message. Valid values include the following:

    - Text: Use a text message encoder.
    - Mtom: Use a Message Transmission Organization Mechanism 1.0 (MTOM) encoder.

    The default is Text. This attribute is of type .| +|`name`|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services).| +|`openTimeout`|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| +|`proxyAddress`|A URI that contains the address of the HTTP proxy. If `useSystemWebProxy` is set to `true`, this setting must be `null`. The default is `null`.| +|`receiveTimeout`|A value that specifies the interval of time provided for a receive operation to complete. This value should be greater than or equal to . The default is 00:10:00.| +|`sendTimeout`|A value that specifies the interval of time provided for a send operation to complete. This value should be greater than or equal to . The default is 00:01:00.| +|`textEncoding`|Sets the character set encoding to be used for emitting messages on the binding. Valid values include the following:

    - BigEndianUnicode: Unicode BigEndian encoding.
    - Unicode: 16-bit encoding.
    - UTF8: 8-bit encoding

    The default is UTF8. This attribute is of type .| +|`transferMode`|A valid value that specifies whether messages are buffered or streamed on a request or response.| +|`useDefaultWebProxy`|A Boolean value that specifies whether the auto-configured HTTP proxy of the system should be used, if available. The default is `true`.| +||| + +### Child Elements + +|Element|Description| +|-------------|-----------------| +|[\](security-of-nethttpbinding.md)|Defines the security settings for the binding. This element is of type . | +|[\](/previous-versions/dotnet/netframework-4.0/ms731325(v=vs.100))|Defines the constraints on the complexity of SOAP messages that can be processed by endpoints configured with this binding. This element is of type .| + +### Parent Elements + +|Element|Description| +|-------------|-----------------| +|[\](bindings.md)|This element holds a collection of standard and custom bindings.| + +## Remarks + + The NetHttpsBinding uses HTTPS as the transport for sending messages. When used with a duplex contract, Web Sockets will be used. When used with a request-reply contract NetHttpsBinding will behave like a BasicHttpsBinding with a binary encoder. + + Security is turned off by default, but can be added setting the mode attribute of the [\](security-of-basichttpbinding.md) child element to a value other than `None`. It uses a "Text" message encoding and UTF-8 text encoding by default. + +## Example 1 + + The following example demonstrates the use of that provides HTTPS communication and maximum interoperability with first- and second-generation Web services. The binding is specified in the configuration files for the client and service. The binding type is specified using the `binding` attribute of the `` element. If you want to configure the basic binding and change some of its settings, it is necessary to define a binding configuration. The endpoint must reference the binding configuration by name by using the `bindingConfiguration` attribute of the `` element, as shown in the following configuration code for the service. + +```xml
    -``` - -## Example +``` + +## Example 2 + + Starting with .NET Framework 4, bindings and behaviors are not required to have a name. The functionality from the previous example can be accomplished by removing the bindingConfiguration from the endpoint address and the name from the binding. - Starting with .NET Framework 4, bindings and behaviors are not required to have a name. The functionality from the previous example can be accomplished by removing the bindingConfiguration from the endpoint address and the name from the binding. - -```xml +```xml -``` - - For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md). - +``` + + For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services). + ## See also - diff --git a/docs/framework/configure-apps/file-schema/wcf/netmsmqbinding.md b/docs/framework/configure-apps/file-schema/wcf/netmsmqbinding.md index 7b66d3b8d8f07..0dab67eb17475 100644 --- a/docs/framework/configure-apps/file-schema/wcf/netmsmqbinding.md +++ b/docs/framework/configure-apps/file-schema/wcf/netmsmqbinding.md @@ -72,7 +72,7 @@ Defines a queued binding suitable for cross-machine communication. |`maxBufferPoolSize`|An integer that specifies the maximum buffer pool size for this binding. The default is 8.| |`maxReceivedMessageSize`|A positive integer that defines the maximum message size, in bytes, including headers, that is processed by this binding. The sender of a message exceeding this limit will receive a SOAP fault. The receiver drops the message and creates an entry of the event in the trace log. The default is 65536. This bound on message size is intended to limit exposure to Denial of Service (DoS) attacks.| |`maxRetryCycles`|An integer that indicates the number of retry cycles used by the poison-message detection feature. A message becomes a poison message when it fails all delivery attempts of all cycles. The default is 3. For more information, see .| -|`name`|Required attribute. A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| +|`name`|Required attribute. A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services).| |`openTimeout`|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| |`QueueTransferProtocol`|A valid value that specifies the queued communication channel transport that this binding uses. MSMQ does not support Active Directory addressing when using SOAP Reliable Messaging Protocol. Therefore, you should not set this attribute to `Srmp` or `Srmps` when the `useActiveDirectory` attribute is set to `true`.| |`receiveErrorHandling`|A value that specifies how poison and nondispatchable messages are handled.| diff --git a/docs/framework/configure-apps/file-schema/wcf/netnamedpipebinding.md b/docs/framework/configure-apps/file-schema/wcf/netnamedpipebinding.md index 357bcb14df4a6..081a2c0274ae5 100644 --- a/docs/framework/configure-apps/file-schema/wcf/netnamedpipebinding.md +++ b/docs/framework/configure-apps/file-schema/wcf/netnamedpipebinding.md @@ -56,7 +56,7 @@ Defines a binding that is secure, reliable, optimized for on-machine cross proce |maxBufferSize|A positive integer that specifies the maximum size, in bytes, of the buffer used to store messages in memory. If the buffer is full, excess data remains in the underlying socket until the buffer has room again. This value cannot be less than `maxReceivedMessageSize` attribute. The default is 65536. For more information, see .| |maxConnections|An integer that specifies the maximum number of outbound and inbound connections the service will create/accept. Incoming and outgoing connections are counted against a separate limit specified by this attribute.

    Inbound connections in excess of the limit are queued until a space below the limit becomes available.

    Outbound connections in excess of the limit are queued until a space below the limit becomes available.

    The default is 10.| |maxReceivedMessageSize|A positive integer that specifies the maximum message size, in bytes, including headers, that can be received on a channel configured with this binding. The sender of a message exceeding this limit will receive a SOAP fault. The receiver drops the message and creates an entry of the event in the trace log. The default is 65536.| -|name|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| +|name|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services).| |openTimeout|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| |receiveTimeout|A value that specifies the interval of time provided for a receive operation to complete. This value should be greater than or equal to . The default is 00:10:00.| |sendTimeout|A value that specifies the interval of time provided for a send operation to complete. This value should be greater than or equal to . The default is 00:01:00.| diff --git a/docs/framework/configure-apps/file-schema/wcf/netpeertcpbinding.md b/docs/framework/configure-apps/file-schema/wcf/netpeertcpbinding.md index 7e0d994d3438d..fd8c719feb84f 100644 --- a/docs/framework/configure-apps/file-schema/wcf/netpeertcpbinding.md +++ b/docs/framework/configure-apps/file-schema/wcf/netpeertcpbinding.md @@ -47,7 +47,7 @@ Defines a binding for peer channel specific TCP messaging. |listenIPAddress|A string that specifies an IP address on which the peer node will listen for TCP messages. The default is `null`.| |maxBufferPoolSize|An integer that specifies the maximum buffer pool size for this binding. The default is 524,288 bytes (512 * 1024). Many parts of Windows Communication Foundation (WCF) use buffers. Creating and destroying buffers each time they are used is expensive, and garbage collection for buffers is also expensive. With buffer pools, you can take a buffer from the pool, use it, and return it to the pool once you are done. Thus the overhead in creating and destroying buffers is avoided.| |maxReceivedMessageSize|A positive integer that specifies the maximum message size, in bytes, including headers, that can be received on a channel configured with this binding. The sender of a message exceeding this limit will receive a SOAP fault. The receiver drops the message and creates an entry of the event in the trace log. The default is 65536.| -|name|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| +|name|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services).| |openTimeout|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| |port|An integer that specifies the network interface port on which this binding will process peer channel TCP messages. This value must be between and . The default is 0.| |receiveTimeout|A value that specifies the interval of time provided for a receive operation to complete. This value should be greater than or equal to . The default is 00:10:00.| diff --git a/docs/framework/configure-apps/file-schema/wcf/nettcpbinding.md b/docs/framework/configure-apps/file-schema/wcf/nettcpbinding.md index 865352275d690..27a28f49926b9 100644 --- a/docs/framework/configure-apps/file-schema/wcf/nettcpbinding.md +++ b/docs/framework/configure-apps/file-schema/wcf/nettcpbinding.md @@ -67,7 +67,7 @@ The following sections describe attributes, child elements, and parent elements. |`maxBufferSize`|A positive integer that specifies the maximum size, in bytes, of the buffer used to store messages in memory.

    If the `transferMode` attribute equals to `Buffered`, this attribute should be equal to the `maxReceivedMessageSize` attribute value.

    If the `transferMode` attribute equals to `Streamed`, this attribute cannot be more than the `maxReceivedMessageSize` attribute value, and should be at least the size of the headers.

    The default is 65536. For more information, see .| |`maxConnections`|An integer that specifies the maximum number of outbound and inbound connections the service will create/accept. Incoming and outgoing connections are counted against a separate limit specified by this attribute.

    Inbound connections in excess of the limit are queued until a space below the limit becomes available.

    Outbound connections in excess of the limit are queued until a space below the limit becomes available.

    The default is 10.| |`maxReceivedMessageSize`|A positive integer that specifies the maximum message size, in bytes, including headers, that can be received on a channel configured with this binding. The sender of a message exceeding this limit will receive a SOAP fault. The receiver drops the message and creates an entry of the event in the trace log. The default is 65536.| -|`name`|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| +|`name`|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services).| |`openTimeout`|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| |`portSharingEnabled`|A Boolean value that specifies whether TCP port sharing is enabled for this connection. If this is `false`, each binding uses its own exclusive port. This setting is relevant only to services, because clients are not affected.| |`receiveTimeout`|A value that specifies the interval of time provided for a receive operation to complete. This value should be greater than or equal to . The default is 00:10:00.| diff --git a/docs/framework/configure-apps/file-schema/wcf/nettcpcontextbinding.md b/docs/framework/configure-apps/file-schema/wcf/nettcpcontextbinding.md index 44ac4eda0818f..a933f93bc5055 100644 --- a/docs/framework/configure-apps/file-schema/wcf/nettcpcontextbinding.md +++ b/docs/framework/configure-apps/file-schema/wcf/nettcpcontextbinding.md @@ -73,7 +73,7 @@ Specifies a context for the that requir |maxBufferSize|A positive integer that specifies the maximum size, in bytes, of the buffer used to store messages in memory. If the buffer is full, excess data remains in the underlying socket until the buffer has room again. This value cannot be less than `maxReceivedMessageSize` attribute. The default is 65536. For more information, see .| |maxConnections|An integer that specifies the maximum number of outbound and inbound connections the service will create/accept. Incoming and outgoing connections are counted against a separate limit specified by this attribute.

    Inbound connections in excess of the limit are queued until a space below the limit becomes available.

    Outbound connections in excess of the limit are queued until a space below the limit becomes available.

    The default is 10.| |maxReceivedMessageSize|A positive integer that specifies the maximum message size, in bytes, including headers, that can be received on a channel configured with this binding. The sender of a message exceeding this limit will receive a SOAP fault. The receiver drops the message and creates an entry of the event in the trace log. The default is 65536.| -|name|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| +|name|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services).| |openTimeout|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| |portSharingEnabled|A Boolean value that specifies whether TCP port sharing is enabled for this connection. If this is `false`, each binding uses its own exclusive port. This setting is relevant only to services, because clients are not affected.| |receiveTimeout|A value that specifies the interval of time provided for a receive operation to complete. This value should be greater than or equal to . The default is 00:10:00.| diff --git a/docs/framework/configure-apps/file-schema/wcf/secureconversationbootstrap.md b/docs/framework/configure-apps/file-schema/wcf/secureconversationbootstrap.md index 3bebf31f4eef1..caba6103fdd73 100644 --- a/docs/framework/configure-apps/file-schema/wcf/secureconversationbootstrap.md +++ b/docs/framework/configure-apps/file-schema/wcf/secureconversationbootstrap.md @@ -83,4 +83,4 @@ Specifies the default values used for initiating a secure conversation service. - [Custom Bindings](../../../wcf/extending/custom-bindings.md) - [\](custombinding.md) - [How to: Create a Custom Binding Using the SecurityBindingElement](../../../wcf/feature-details/how-to-create-a-custom-binding-using-the-securitybindingelement.md) -- [Custom Binding Security](../../../wcf/samples/custom-binding-security.md) +- [Custom Binding Security](/previous-versions/dotnet/framework/wcf/samples/custom-binding-security) diff --git a/docs/framework/configure-apps/file-schema/wcf/security-of-custombinding.md b/docs/framework/configure-apps/file-schema/wcf/security-of-custombinding.md index 5b7e479eacfdc..30106e56d1831 100644 --- a/docs/framework/configure-apps/file-schema/wcf/security-of-custombinding.md +++ b/docs/framework/configure-apps/file-schema/wcf/security-of-custombinding.md @@ -109,7 +109,7 @@ Specifies the security options for a custom binding. The service configuration defines a custom binding that supports TCP communication protected using TLS/SSL protocol, and Windows message security. The custom binding uses a service certificate to authenticate the service on the transport level and to protect the messages during the transmission between client and service. This is accomplished by the [\](sslstreamsecurity.md) binding element. The service's certificate is configured using a service behavior. - Additionally, the custom binding uses message security with Windows credential type - this is the default credential type. This is accomplished by the [security](security-of-custombinding.md) binding element. Both client and service are authenticated using message-level security if Kerberos authentication mechanism is available. If the Kerberos authentication mechanism is not available, NTLM authentication is used. NTLM authenticates the client to the service but does not authenticate service to the client. The [security](security-of-custombinding.md) binding element is configured to use `SecureConversation` authenticationType, which results in the creation of a security session on both the client and the service. This is required to enable the service's duplex contract to work. For more information on running this example, see [Custom Binding Security](../../../wcf/samples/custom-binding-security.md). + Additionally, the custom binding uses message security with Windows credential type - this is the default credential type. This is accomplished by the [security](security-of-custombinding.md) binding element. Both client and service are authenticated using message-level security if Kerberos authentication mechanism is available. If the Kerberos authentication mechanism is not available, NTLM authentication is used. NTLM authenticates the client to the service but does not authenticate service to the client. The [security](security-of-custombinding.md) binding element is configured to use `SecureConversation` authenticationType, which results in the creation of a security session on both the client and the service. This is required to enable the service's duplex contract to work. For more information on running this example, see [Custom Binding Security](/previous-versions/dotnet/framework/wcf/samples/custom-binding-security). ```xml @@ -176,4 +176,4 @@ Specifies the security options for a custom binding. - [Custom Bindings](../../../wcf/extending/custom-bindings.md) - [\](custombinding.md) - [How to: Create a Custom Binding Using the SecurityBindingElement](../../../wcf/feature-details/how-to-create-a-custom-binding-using-the-securitybindingelement.md) -- [Custom Binding Security](../../../wcf/samples/custom-binding-security.md) +- [Custom Binding Security](/previous-versions/dotnet/framework/wcf/samples/custom-binding-security) diff --git a/docs/framework/configure-apps/file-schema/wcf/serviceauthorization-element.md b/docs/framework/configure-apps/file-schema/wcf/serviceauthorization-element.md index 4f0200725a67d..b3a131c25ef3a 100644 --- a/docs/framework/configure-apps/file-schema/wcf/serviceauthorization-element.md +++ b/docs/framework/configure-apps/file-schema/wcf/serviceauthorization-element.md @@ -92,14 +92,14 @@ The following code shows the `roleProviderName` used with the `principalPermissi
    ``` -For a detailed example of using this configuration element, see [Authorizing Access to Service Operations](../../../wcf/samples/authorizing-access-to-service-operations.md) and [Authorization Policy](../../../wcf/samples/authorization-policy.md). +For a detailed example of using this configuration element, see [Authorizing Access to Service Operations](/previous-versions/dotnet/framework/wcf/samples/authorizing-access-to-service-operations) and [Authorization Policy](/previous-versions/dotnet/framework/wcf/samples/authorization-policy). ## See also - - - [Security Behaviors](../../../wcf/feature-details/security-behaviors-in-wcf.md) -- [Authorizing Access to Service Operations](../../../wcf/samples/authorizing-access-to-service-operations.md) +- [Authorizing Access to Service Operations](/previous-versions/dotnet/framework/wcf/samples/authorizing-access-to-service-operations) - [How to: Create a Custom Authorization Manager for a Service](../../../wcf/extending/how-to-create-a-custom-authorization-manager-for-a-service.md) - [How to: Restrict Access with the PrincipalPermissionAttribute Class](../../../wcf/how-to-restrict-access-with-the-principalpermissionattribute-class.md) -- [Authorization Policy](../../../wcf/samples/authorization-policy.md) +- [Authorization Policy](/previous-versions/dotnet/framework/wcf/samples/authorization-policy) diff --git a/docs/framework/configure-apps/file-schema/wcf/servicedebug.md b/docs/framework/configure-apps/file-schema/wcf/servicedebug.md index 378510c048890..53ff34ca5e834 100644 --- a/docs/framework/configure-apps/file-schema/wcf/servicedebug.md +++ b/docs/framework/configure-apps/file-schema/wcf/servicedebug.md @@ -64,7 +64,7 @@ Specifies debugging and help information features for a Windows Communication Fo > [!CAUTION] > Returning managed exception information to clients can be a security risk because exception details expose information about the internal service implementation that could be used by unauthorized clients. Because of the security issues involved, it is strongly recommended that you only do so in controlled debugging scenarios. You should set `includeExceptionDetailInFaults` to `false` when deploying your application. - For details about the security issues related to managed exception, see [Specifying and Handling Faults in Contracts and Services](../../../wcf/specifying-and-handling-faults-in-contracts-and-services.md). For a code sample, see [Service Debug Behavior](../../../wcf/samples/service-debug-behavior.md). + For details about the security issues related to managed exception, see [Specifying and Handling Faults in Contracts and Services](../../../wcf/specifying-and-handling-faults-in-contracts-and-services.md). For a code sample, see [Service Debug Behavior](/previous-versions/dotnet/framework/wcf/samples/service-debug-behavior). You can also set `httpsHelpPageEnabled` and `httpsHelpPageUrl` to enable or disable the help page. Each service can optionally expose a help page that contains information about the service including the endpoint to get WSDL for the service. This can be enabled by setting `httpHelpPageEnabled` to `true`. This enables the help page to be returned to a GET request to the base address of the service. You can change this address by setting the `httpHelpPageUrl` attribute. In addition, you can make this secure by using HTTPS instead of HTTP. @@ -76,4 +76,4 @@ Specifies debugging and help information features for a Windows Communication Fo - - [Specifying and Handling Faults in Contracts and Services](../../../wcf/specifying-and-handling-faults-in-contracts-and-services.md) - [Handling Exceptions and Faults](../../../wcf/extending/handling-exceptions-and-faults.md) -- [Service Debug Behavior](../../../wcf/samples/service-debug-behavior.md) +- [Service Debug Behavior](/previous-versions/dotnet/framework/wcf/samples/service-debug-behavior) diff --git a/docs/framework/configure-apps/file-schema/wcf/servicemetadata.md b/docs/framework/configure-apps/file-schema/wcf/servicemetadata.md index cc7e104cea0b5..ee02b25fad712 100644 --- a/docs/framework/configure-apps/file-schema/wcf/servicemetadata.md +++ b/docs/framework/configure-apps/file-schema/wcf/servicemetadata.md @@ -63,7 +63,7 @@ Specifies the publication of service metadata and associated information. This configuration element allows you to control the metadata publishing features of a service. To prevent unintentional disclosure of potentially sensitive service metadata, the default configuration for Windows Communication Foundation (WCF) services disables metadata publishing. This behavior is secure by default, but also means that you cannot use a metadata import tool (such as Svcutil.exe) to generate the client code required to call the service unless the service’s metadata publishing behavior is explicitly enabled in configuration. Using this configuration element, you can enable this publishing behavior for your service. - For a detailed example of configuring this behavior, see [Metadata Publishing Behavior](../../../wcf/samples/metadata-publishing-behavior.md). + For a detailed example of configuring this behavior, see [Metadata Publishing Behavior](/previous-versions/dotnet/framework/wcf/samples/metadata-publishing-behavior). The optional `httpGetBinding` and `httpsGetBinding` attributes allow you to configure the bindings used for metadata retrieval via HTTP GET (or HTTPS GET). If they are not specified, the default bindings (`HttpTransportBindingElement`, in the case of HTTP and `HttpsTransportBindingElement`, in the case of HTTPS) are used for metadata retrieval as appropriate. Notice that you cannot use these attributes with the built-in WCF bindings. Only bindings with inner binding elements that support will be supported. Additionally, the property of the binding must be . @@ -122,4 +122,4 @@ Specifies the publication of service metadata and associated information. - - - [Security Behaviors](../../../wcf/feature-details/security-behaviors-in-wcf.md) -- [Metadata Publishing Behavior](../../../wcf/samples/metadata-publishing-behavior.md) +- [Metadata Publishing Behavior](/previous-versions/dotnet/framework/wcf/samples/metadata-publishing-behavior) diff --git a/docs/framework/configure-apps/file-schema/wcf/servicesecurityaudit.md b/docs/framework/configure-apps/file-schema/wcf/servicesecurityaudit.md index cdf64e441823f..de1994dad2a7a 100644 --- a/docs/framework/configure-apps/file-schema/wcf/servicesecurityaudit.md +++ b/docs/framework/configure-apps/file-schema/wcf/servicesecurityaudit.md @@ -51,7 +51,7 @@ Specifies settings that enable auditing of security events during service operat This configuration element is used to audit Windows Communication Foundation (WCF) authentication events. When auditing is enabled, either successful or failed authentication attempts (or both) can be audited. The events are written to one of three event logs: application, security, or the default log for the operating system version. The event logs can all be viewed using the Windows Event viewer. - For a detailed example of using this configuration element, see [Service Auditing Behavior](../../../wcf/samples/service-auditing-behavior.md). + For a detailed example of using this configuration element, see [Service Auditing Behavior](/previous-versions/dotnet/framework/wcf/samples/service-auditing-behavior). By default, on Windows XP the audit events can be seen in the Application Log; while on Windows Server 2003 and Windows Vista, the audit events can be seen in the Security Log. The location of audit events can be specified by setting the `auditLogLocation` attribute to 'Application' or 'Security'. For more information, see [How to: Audit Security Events](../../../wcf/feature-details/how-to-audit-wcf-security-events.md). If the events are written in the Security Log, the LocalSecurityPolicy-> Enable Object Access should be set for "Success" and "Failure". @@ -85,4 +85,4 @@ Specifies settings that enable auditing of security events during service operat - [Security Behaviors](../../../wcf/feature-details/security-behaviors-in-wcf.md) - [Auditing](../../../wcf/feature-details/auditing-security-events.md) - [How to: Audit Security Events](../../../wcf/feature-details/how-to-audit-wcf-security-events.md) -- [Service Auditing Behavior](../../../wcf/samples/service-auditing-behavior.md) +- [Service Auditing Behavior](/previous-versions/dotnet/framework/wcf/samples/service-auditing-behavior) diff --git a/docs/framework/configure-apps/file-schema/wcf/servicethrottling.md b/docs/framework/configure-apps/file-schema/wcf/servicethrottling.md index bace8539435e8..ddfd5cee5155f 100644 --- a/docs/framework/configure-apps/file-schema/wcf/servicethrottling.md +++ b/docs/framework/configure-apps/file-schema/wcf/servicethrottling.md @@ -53,7 +53,7 @@ Specifies the throttling mechanism of a Windows Communication Foundation (WCF) s ## Example - The following configuration example specifies that the service limits the maximum concurrent calls to 2, and the maximum number of concurrent instances to 10. For a detailed example of running this example, see [Throttling](../../../wcf/samples/throttling.md). + The following configuration example specifies that the service limits the maximum concurrent calls to 2, and the maximum number of concurrent instances to 10. For a detailed example of running this example, see [Throttling](/previous-versions/dotnet/framework/wcf/samples/throttling). ```xml diff --git a/docs/framework/configure-apps/file-schema/wcf/udpbinding.md b/docs/framework/configure-apps/file-schema/wcf/udpbinding.md index a4ecd0a3232da..59a0928cae6db 100644 --- a/docs/framework/configure-apps/file-schema/wcf/udpbinding.md +++ b/docs/framework/configure-apps/file-schema/wcf/udpbinding.md @@ -56,7 +56,7 @@ A configuration element used to configure the value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| |`receiveTimeout`|A value that specifies the interval of time provided for a receive operation to complete. This value should be greater than or equal to . The default is 00:10:00.| |`sendTimeout`|A value that specifies the interval of time provided for a send operation to complete. This value should be greater than or equal to . The default is 00:01:00.| diff --git a/docs/framework/configure-apps/file-schema/wcf/webhttpbinding.md b/docs/framework/configure-apps/file-schema/wcf/webhttpbinding.md index e8295d5f79a47..9f8164db3b1fa 100644 --- a/docs/framework/configure-apps/file-schema/wcf/webhttpbinding.md +++ b/docs/framework/configure-apps/file-schema/wcf/webhttpbinding.md @@ -61,7 +61,7 @@ Defines a binding element that is used to configure endpoints for Windows Commun |maxBufferPoolSize|An integer that specifies the maximum buffer pool size for this binding. The default is 524,288 bytes (512 * 1024). Many parts of Windows Communication Foundation (WCF) use buffers. Creating and destroying buffers each time they are used is expensive, and garbage collection for buffers is also expensive. With buffer pools, you can take a buffer from the pool, use it, and return it to the pool once you are done. Thus the overhead in creating and destroying buffers is avoided.| |maxBufferSize|An integer that specifies the maximum amount of memory that is allocated for use by the manager of the message buffers that receive messages from the channel. The default value is 524,288 (0x80000) bytes.| |maxReceivedMessageSize|A positive integer that specifies the maximum message size, in bytes, including headers, that can be received on a channel configured with this binding. The sender of a message exceeding this limit will receive a fault. The receiver drops the message and creates an entry of the event in the trace log. The default is 65536. **Note:** Increasing this value alone is not sufficient in ASP.NET compatible mode. You should also increase the value of `httpRuntime` (see [httpRuntime Element (ASP.NET Settings Schema)](/previous-versions/dotnet/netframework-4.0/e1f13641(v=vs.100))).| -|name|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| +|name|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services).| |openTimeout|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| |proxyAddress|A URI that specifies the address of the HTTP proxy. If `useSystemWebProxy` is `true`, this setting must be `null`. The default is `null`.| |receiveTimeout|A value that specifies the interval of time provided for a receive operation to complete. This value should be greater than or equal to . The default is 00:01:00.| diff --git a/docs/framework/configure-apps/file-schema/wcf/ws2007federationhttpbinding.md b/docs/framework/configure-apps/file-schema/wcf/ws2007federationhttpbinding.md index b014ad0ced62c..4d3a7f9a7e441 100644 --- a/docs/framework/configure-apps/file-schema/wcf/ws2007federationhttpbinding.md +++ b/docs/framework/configure-apps/file-schema/wcf/ws2007federationhttpbinding.md @@ -67,7 +67,7 @@ The following sections describe attributes, child elements, and parent elements. |`maxBufferPoolSize`|The maximum buffer pool size for this binding. The default is 524,288 bytes (512 * 1024). Many parts of Windows Communication Foundation (WCF) use buffers. Creating and destroying buffers each time they are used is expensive, and garbage collection for buffers is also expensive. With buffer pools, you can take a buffer from the pool, use it, and return it to the pool once you are done. Thus the overhead in creating and destroying buffers is avoided.| |`maxReceivedMessageSize`|The maximum message size, in bytes, including headers, that can be received on a channel configured with this binding. The sender of a message that exceeds this limit receives a SOAP fault. The receiver drops the message and creates an entry of the event in the trace log. The default is 65536.| |`messageEncoding`|Defines the encoder used to encode the message. Valid values include the following:

    - Text: Use a text message encoder.
    - Mtom: Use a Message Transmission Organization Mechanism 1.0 (MTOM) encoder.

    The default is Text.

    This attribute is of type .| -|`name`|The configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| +|`name`|The configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services).| |`openTimeout`|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| |`privacyNoticeAt`|A URI at which the privacy notice is located.| |`privacyNoticeVersion`|The version of the current privacy notice.| diff --git a/docs/framework/configure-apps/file-schema/wcf/ws2007httpbinding.md b/docs/framework/configure-apps/file-schema/wcf/ws2007httpbinding.md index bdb30e43cc59d..0d0f5e590418f 100644 --- a/docs/framework/configure-apps/file-schema/wcf/ws2007httpbinding.md +++ b/docs/framework/configure-apps/file-schema/wcf/ws2007httpbinding.md @@ -69,7 +69,7 @@ Defines an interoperable binding that provides support for the correct versions |`maxBufferPoolSize`|The maximum buffer pool size for this binding. The default is 524,288 bytes (512 × 1,024). Many parts of Windows Communication Foundation (WCF) use buffers. Creating and destroying buffers each time they are used is expensive, as is garbage collection for buffers. With buffer pools, you can take a buffer from the pool, use it, and return it to the pool when you are done. This avoids the overhead in creating and destroying buffers.| |`maxReceivedMessageSize`|The maximum message size, in bytes, including headers, which a channel configured with this binding, can receive. The sender of a message exceeding this limit receives a SOAP fault. The receiver drops the message and creates an entry of the event in the trace log. The default is 65536.| |`messageEncoding`|Defines the encoder used to encode the message. Valid values include the following:

    - `Text`: Use a text message encoder.
    - `Mtom`: Use a Message Transmission Organization Mechanism 1.0 (MTOM) encoder.

    The default is `Text`.

    This attribute is of type .| -|`name`|The configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| +|`name`|The configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services).| |`openTimeout`|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| |`proxyAddress`|A URI that specifies the address of the HTTP proxy. If `useSystemWebProxy` is `true`, this setting must be `null`. The default is `null`.| |`receiveTimeout`|A value that specifies the interval of time provided for a receive operation to complete. This value should be greater than or equal to . The default is 00:01:00.| diff --git a/docs/framework/configure-apps/file-schema/wcf/wsdualhttpbinding.md b/docs/framework/configure-apps/file-schema/wcf/wsdualhttpbinding.md index 33df4e7e2ad48..87fb7bcd67c0d 100644 --- a/docs/framework/configure-apps/file-schema/wcf/wsdualhttpbinding.md +++ b/docs/framework/configure-apps/file-schema/wcf/wsdualhttpbinding.md @@ -65,7 +65,7 @@ Defines a secure, reliable and interoperable binding that is suitable for duplex |maxBufferPoolSize|An integer that specifies the maximum buffer pool size for this binding. The default is 524,288 bytes (512 * 1024). Many parts of Windows Communication Foundation (WCF) use buffers. Creating and destroying buffers each time they are used is expensive, and garbage collection for buffers is also expensive. With buffer pools, you can take a buffer from the pool, use it, and return it to the pool once you are done. Thus the overhead in creating and destroying buffers is avoided.| |maxReceivedMessageSize|A positive integer that specifies the maximum message size, in bytes, including headers, that can be received on a channel configured with this binding. The sender of a message exceeding this limit will receive a SOAP fault. The receiver drops the message and creates an entry of the event in the trace log. The default is 65536.| |messageEncoding|Defines the encoder used to encode the message. Valid values include the following:

    - Text: Use a text message encoder.
    - Mtom: Use a Message Transmission Organization Mechanism 1.0 (MTOM) encoder.
    - The default is Text.

    This attribute is of type .| -|name|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| +|name|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services).| |openTimeout|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| |proxyAddress|A URI that specifies the address of the HTTP proxy. If `useDefaultWebProxy` is `true`, this setting must be `null`. The default is `null`.| |receiveTimeout|A value that specifies the interval of time provided for a receive operation to complete. This value should be greater than or equal to . The default is 00:01:00.| diff --git a/docs/framework/configure-apps/file-schema/wcf/wsfederationhttpbinding.md b/docs/framework/configure-apps/file-schema/wcf/wsfederationhttpbinding.md index 7bac06e35e5d2..78c5401077a4e 100644 --- a/docs/framework/configure-apps/file-schema/wcf/wsfederationhttpbinding.md +++ b/docs/framework/configure-apps/file-schema/wcf/wsfederationhttpbinding.md @@ -113,7 +113,7 @@ The following sections describe attributes, child elements, and parent elements. |maxBufferPoolSize|An integer that specifies the maximum buffer pool size for this binding. The default is 524,288 bytes (512 * 1024). Many parts of Windows Communication Foundation (WCF) use buffers. Creating and destroying buffers each time they are used is expensive, and garbage collection for buffers is also expensive. With buffer pools, you can take a buffer from the pool, use it, and return it to the pool once you are done. Thus the overhead in creating and destroying buffers is avoided.| |maxReceivedMessageSize|A positive integer that specifies the maximum message size, in bytes, including headers, that can be received on a channel configured with this binding. The sender of a message exceeding this limit will receive a SOAP fault. The receiver drops the message and creates an entry of the event in the trace log. The default is 65536.| |messageEncoding|Defines the encoder used to encode the message. Valid values include the following:

    - Text: Use a text message encoder.
    - Mtom: Use a Message Transmission Organization Mechanism 1.0 (MTOM) encoder.

    The default is Text.

    This attribute is of type .| -|name|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| +|name|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services).| |openTimeout|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| |privacyNoticeAt|A String that specifies a URI at which the privacy notice is located.| |privacyNoticeVersion|An integer that specifies the version of the current privacy notice.| diff --git a/docs/framework/configure-apps/file-schema/wcf/wshttpbinding.md b/docs/framework/configure-apps/file-schema/wcf/wshttpbinding.md index 85c9095d79c14..bb1b28a03e612 100644 --- a/docs/framework/configure-apps/file-schema/wcf/wshttpbinding.md +++ b/docs/framework/configure-apps/file-schema/wcf/wshttpbinding.md @@ -70,7 +70,7 @@ Defines a secure, reliable, interoperable binding suitable for non-duplex servic |maxBufferPoolSize|An integer that specifies the maximum buffer pool size for this binding. The default is 524,288 bytes (512 * 1024). Many parts of Windows Communication Foundation (WCF) use buffers. Creating and destroying buffers each time they are used is expensive, and garbage collection for buffers is also expensive. With buffer pools, you can take a buffer from the pool, use it, and return it to the pool once you are done. Thus the overhead in creating and destroying buffers is avoided.| |maxReceivedMessageSize|A positive integer that specifies the maximum message size, in bytes, including headers, that can be received on a channel configured with this binding. The sender of a message exceeding this limit will receive a SOAP fault. The receiver drops the message and creates an entry of the event in the trace log. The default is 65536.| |messageEncoding|Defines the encoder used to encode the message. Valid values include the following:

    - Text: Use a text message encoder.
    - Mtom: Use a Message Transmission Organization Mechanism 1.0 (MTOM) encoder.
    - The default is Text.

    This attribute is of type .| -|name|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| +|name|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services).| |openTimeout|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| |proxyAddress|A URI that specifies the address of the HTTP proxy. If `useSystemWebProxy` is `true`, this setting must be `null`. The default is `null`.| |receiveTimeout|A value that specifies the interval of time provided for a receive operation to complete. This value should be greater than or equal to . The default is 00:01:00.| diff --git a/docs/framework/configure-apps/file-schema/wcf/wshttpcontextbinding.md b/docs/framework/configure-apps/file-schema/wcf/wshttpcontextbinding.md index f637d75937b91..7b1192fc88f5f 100644 --- a/docs/framework/configure-apps/file-schema/wcf/wshttpcontextbinding.md +++ b/docs/framework/configure-apps/file-schema/wcf/wshttpcontextbinding.md @@ -73,7 +73,7 @@ Provides a context for the that require |maxBufferPoolSize|An integer that specifies the maximum buffer pool size for this binding. The default is 524,288 bytes (512 * 1024). Many parts of Windows Communication Foundation (WCF) use buffers. Creating and destroying buffers each time they are used is expensive, and garbage collection for buffers is also expensive. With buffer pools, you can take a buffer from the pool, use it, and return it to the pool once you are done. Thus the overhead in creating and destroying buffers is avoided.| |maxReceivedMessageSize|A positive integer that specifies the maximum message size, in bytes, including headers, that can be received on a channel configured with this binding. The sender of a message exceeding this limit will receive a SOAP fault. The receiver drops the message and creates an entry of the event in the trace log. The default is 65536.| |messageEncoding|Defines the encoder used to encode the message. Valid values include the following:

    - Text: Use a text message encoder.
    - Mtom: Use a Message Transmission Organization Mechanism 1.0 (MTOM) encoder.
    - The default is Text.

    This attribute is of type .| -|name|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](../../../wcf/samples/simplified-configuration-for-wcf-services.md).| +|name|A string that contains the configuration name of the binding. This value should be unique because it is used as an identification for the binding. Starting with .NET Framework 4, bindings and behaviors are not required to have a name. For more information about default configuration and nameless bindings and behaviors, see [Simplified Configuration](../../../wcf/simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services).| |openTimeout|A value that specifies the interval of time provided for an open operation to complete. This value should be greater than or equal to . The default is 00:01:00.| |proxyAddress|A URI that specifies the address of the HTTP proxy. If `useSystemWebProxy` is `true`, this setting must be `null`. The default is `null`.| |receiveTimeout|A value that specifies the interval of time provided for a receive operation to complete. This value should be greater than or equal to . The default is 00:01:00.| diff --git a/docs/framework/interop/how-to-migrate-managed-code-dcom-to-wcf.md b/docs/framework/interop/how-to-migrate-managed-code-dcom-to-wcf.md index b8c0656b8dd13..725ab83aa0360 100644 --- a/docs/framework/interop/how-to-migrate-managed-code-dcom-to-wcf.md +++ b/docs/framework/interop/how-to-migrate-managed-code-dcom-to-wcf.md @@ -80,7 +80,7 @@ public interface ICustomerManager Next you should create a data contract for the service, which will describe how the data will be exchanged between the service and its clients. Classes described in the data contract should be marked with the [] attribute. The individual properties or fields you want visible to both client and server should be marked with the [] attribute. If you want types derived from a class in the data contract to be allowed, you must identify them with the [] attribute. WCF will only serialize or deserialize types in the service interface and types identified as known types. If you attempt to use a type that is not a known type, an exception will occur. - For more information about data contracts, see [Data Contracts](../wcf/samples/data-contracts.md). + For more information about data contracts, see [Data Contracts](/previous-versions/dotnet/framework/wcf/samples/data-contracts). ```csharp [DataContract] diff --git a/docs/framework/performance/writing-large-responsive-apps.md b/docs/framework/performance/writing-large-responsive-apps.md index 904bb3c1f94a9..ef970a1c7ed71 100644 --- a/docs/framework/performance/writing-large-responsive-apps.md +++ b/docs/framework/performance/writing-large-responsive-apps.md @@ -40,7 +40,7 @@ The .NET Framework is highly productive for building apps. Powerful and safe lan Good tools let you drill quickly into the biggest performance issues (CPU, memory, or disk) and help you locate the code that causes those bottlenecks. Microsoft ships a variety of performance tools such as [Visual Studio Profiler](/visualstudio/profiling/beginners-guide-to-performance-profiling) and [PerfView](https://www.microsoft.com/download/details.aspx?id=28567). - PerfView is a free and amazingly powerful tool that helps you focus on deep issues such as disk I/O, GC events, and memory. You can capture performance-related [Event Tracing for Windows](../wcf/samples/etw-tracing.md) (ETW) events and view easily per app, per process, per stack, and per thread information. PerfView shows you how much and what kind of memory your app allocates, and which functions or call stacks contribute how much to the memory allocations. For details, see the rich help topics, demos, and videos included with the tool (such as the [PerfView tutorials](https://channel9.msdn.com/Series/PerfView-Tutorial) on Channel 9). + PerfView is a free and amazingly powerful tool that helps you focus on deep issues such as disk I/O, GC events, and memory. You can capture performance-related [Event Tracing for Windows](/previous-versions/dotnet/framework/wcf/samples/etw-tracing) (ETW) events and view easily per app, per process, per stack, and per thread information. PerfView shows you how much and what kind of memory your app allocates, and which functions or call stacks contribute how much to the memory allocations. For details, see the rich help topics, demos, and videos included with the tool (such as the [PerfView tutorials](https://channel9.msdn.com/Series/PerfView-Tutorial) on Channel 9). ### Fact 4: It’s all about allocations diff --git a/docs/framework/toc.yml b/docs/framework/toc.yml index 0b0c9162311a0..af1a7863cc079 100644 --- a/docs/framework/toc.yml +++ b/docs/framework/toc.yml @@ -278,7 +278,7 @@ items: href: migration-guide/mitigations.md - name: Custom IMessageFilter.PreFilterMessage implementations href: migration-guide/mitigation-custom-imessagefilter-prefiltermessage-implementations.md - - name: Deserializ objects across app domains + - name: Deserialize objects across app domains href: migration-guide/mitigation-deserialization-of-objects-across-app-domains.md - name: New 64-bit JIT compiler href: migration-guide/mitigation-new-64-bit-jit-compiler.md @@ -679,21 +679,5 @@ items: href: whats-new/obsolete-types.md - name: Obsolete members href: whats-new/obsolete-members.md -- name: Code access security - name: Code analysis href: code-analyzers.md -- name: Develop for multiple platforms - items: - - name: Overview - displayName: cross platform - href: cross-platform/index.md - - name: Portable Class Library - href: cross-platform/portable-class-library.md - - name: Use Portable Class Library with MVVM - href: cross-platform/using-portable-class-library-with-model-view-view-model.md - - name: App resources for libraries that target multiple platforms - href: cross-platform/app-resources-for-libraries-that-target-multiple-platforms.md - - name: .NET Framework support for Microsoft Store apps and Windows Runtime - href: cross-platform/support-for-windows-store-apps-and-windows-runtime.md - - name: Pass a URI to the Windows Runtime - href: cross-platform/passing-a-uri-to-the-windows-runtime.md diff --git a/docs/framework/wcf/basic-wcf-programming.md b/docs/framework/wcf/basic-wcf-programming.md index 70775f3065e0f..25eb54fb5bfb9 100644 --- a/docs/framework/wcf/basic-wcf-programming.md +++ b/docs/framework/wcf/basic-wcf-programming.md @@ -52,7 +52,7 @@ This section presents the fundamentals for creating Windows Communication Founda - [Getting Started Tutorial](getting-started-tutorial.md) - [Guidelines and Best Practices](guidelines-and-best-practices.md) - [Windows Communication Foundation Tools](tools.md) -- [Windows Communication Foundation (WCF) samples](./samples/index.md) -- [Getting Started](./samples/getting-started-sample.md) -- [IIS Hosting Using Inline Code](./samples/iis-hosting-using-inline-code.md) -- [Self-Host](./samples/self-host.md) +- [Windows Communication Foundation (WCF) samples](/previous-versions/dotnet/framework/wcf/samples/index) +- [Getting Started](/previous-versions/dotnet/framework/wcf/samples/getting-started-sample) +- [IIS Hosting Using Inline Code](/previous-versions/dotnet/framework/wcf/samples/iis-hosting-using-inline-code) +- [Self-Host](/previous-versions/dotnet/framework/wcf/samples/self-host) diff --git a/docs/framework/wcf/conceptual-overview.md b/docs/framework/wcf/conceptual-overview.md index ff116317786e8..d7d8ce5f87453 100644 --- a/docs/framework/wcf/conceptual-overview.md +++ b/docs/framework/wcf/conceptual-overview.md @@ -30,6 +30,6 @@ This topic summarizes information about the Windows Communication Foundation (WC - [Basic WCF Programming](basic-wcf-programming.md) - [Guidelines and Best Practices](guidelines-and-best-practices.md) -- [Windows Communication Foundation Samples](./samples/index.md) +- [Windows Communication Foundation Samples](/previous-versions/dotnet/framework/wcf/samples/index) - [Tools](./diagnostics/exceptions-reference/tools.md) - [General Reference](general-reference.md) diff --git a/docs/framework/wcf/configuring-bindings-for-wcf-services.md b/docs/framework/wcf/configuring-bindings-for-wcf-services.md index 8e69a1efd05d2..5ba344253e542 100644 --- a/docs/framework/wcf/configuring-bindings-for-wcf-services.md +++ b/docs/framework/wcf/configuring-bindings-for-wcf-services.md @@ -32,7 +32,7 @@ When creating an application, you often want to defer decisions to the administr ### ServiceModel Elements - You can use the section bounded by the `system.ServiceModel` element to configure a service type with one or more endpoints, as well as settings for a service. Each endpoint can then be configured with an address, a contract, and a binding. For more information about endpoints, see [Endpoint Creation Overview](endpoint-creation-overview.md). If no endpoints are specified, the runtime adds default endpoints. For more information about default endpoints, bindings, and behaviors, see [Simplified Configuration](simplified-configuration.md) and [Simplified Configuration for WCF Services](./samples/simplified-configuration-for-wcf-services.md). + You can use the section bounded by the `system.ServiceModel` element to configure a service type with one or more endpoints, as well as settings for a service. Each endpoint can then be configured with an address, a contract, and a binding. For more information about endpoints, see [Endpoint Creation Overview](endpoint-creation-overview.md). If no endpoints are specified, the runtime adds default endpoints. For more information about default endpoints, bindings, and behaviors, see [Simplified Configuration](simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services). A binding specifies transports (HTTP, TCP, pipes, Message Queuing) and protocols (Security, Reliability, Transaction flows) and consists of binding elements, each of which specifies an aspect of how an endpoint communicates with the world. diff --git a/docs/framework/wcf/configuring-services-using-configuration-files.md b/docs/framework/wcf/configuring-services-using-configuration-files.md index d7cacf0b90554..9a6cc7c2b82d0 100644 --- a/docs/framework/wcf/configuring-services-using-configuration-files.md +++ b/docs/framework/wcf/configuring-services-using-configuration-files.md @@ -12,7 +12,7 @@ Configuring a Windows Communication Foundation (WCF) service with a configuratio A WCF service is configurable using the .NET Framework configuration technology. Most commonly, XML elements are added to the Web.config file for an Internet Information Services (IIS) site that hosts a WCF service. The elements allow you to change details such as the endpoint addresses (the actual addresses used to communicate with the service) on a machine-by-machine basis. In addition, WCF includes several system-provided elements that allow you to quickly select the most basic features for a service. Starting with .NET Framework 4, WCF comes with a new default configuration model that simplifies WCF configuration requirements. If you do not provide any WCF configuration for a particular service, the runtime automatically configures your service with some standard endpoints and default binding/behavior. In practice, writing configuration is a major part of programming WCF applications. - For more information, see [Configuring Bindings for Services](configuring-bindings-for-wcf-services.md). For a list of the most commonly used elements, see [System-Provided Bindings](system-provided-bindings.md). For more information about default endpoints, bindings, and behaviors, see [Simplified Configuration](simplified-configuration.md) and [Simplified Configuration for WCF Services](./samples/simplified-configuration-for-wcf-services.md). + For more information, see [Configuring Bindings for Services](configuring-bindings-for-wcf-services.md). For a list of the most commonly used elements, see [System-Provided Bindings](system-provided-bindings.md). For more information about default endpoints, bindings, and behaviors, see [Simplified Configuration](simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services). > [!IMPORTANT] > When deploying side by side scenarios where two different versions of a service are deployed, it is necessary to specify partial names of assemblies referenced in configuration files. This is because the configuration file is shared across all versions of a service and they could be running under different versions of the .NET Framework. diff --git a/docs/framework/wcf/configuring-wcf-services-in-code.md b/docs/framework/wcf/configuring-wcf-services-in-code.md index 8f40b5bdccf89..ce5e46f841e90 100644 --- a/docs/framework/wcf/configuring-wcf-services-in-code.md +++ b/docs/framework/wcf/configuring-wcf-services-in-code.md @@ -95,7 +95,7 @@ public class Service1 : IService1 - [Configuring Services Using Configuration Files](configuring-services-using-configuration-files.md) - [Configuring Client Behaviors](configuring-client-behaviors.md) - [Simplified Configuration](simplified-configuration.md) -- [Configuration](./samples/configuration-sample.md) +- [Configuration](/previous-versions/dotnet/framework/wcf/samples/configuration-sample) - [Configuration-Based Activation in IIS and WAS](./feature-details/configuration-based-activation-in-iis-and-was.md) - [Configuration and Metadata Support](./extending/configuration-and-metadata-support.md) - [Configuration](./diagnostics/exceptions-reference/configuration.md) diff --git a/docs/framework/wcf/designing-service-contracts.md b/docs/framework/wcf/designing-service-contracts.md index 028126edfde5c..b3e5338738b7f 100644 --- a/docs/framework/wcf/designing-service-contracts.md +++ b/docs/framework/wcf/designing-service-contracts.md @@ -147,7 +147,7 @@ Sub Hello (ByVal greeting As String) To implement a duplex pattern, you must create a second interface that contains the method declarations that are called on the client. - For an example of creating a service, and a client that accesses that service, see [How to: Create a Duplex Contract](./feature-details/how-to-create-a-duplex-contract.md) and [How to: Access Services with a Duplex Contract](./feature-details/how-to-access-services-with-a-duplex-contract.md). For a working sample, see [Duplex](./samples/duplex.md). For more information about issues using duplex contracts, see [Duplex Services](./feature-details/duplex-services.md). + For an example of creating a service, and a client that accesses that service, see [How to: Create a Duplex Contract](./feature-details/how-to-create-a-duplex-contract.md) and [How to: Access Services with a Duplex Contract](./feature-details/how-to-access-services-with-a-duplex-contract.md). For a working sample, see [Duplex](/previous-versions/dotnet/framework/wcf/samples/duplex). For more information about issues using duplex contracts, see [Duplex Services](./feature-details/duplex-services.md). > [!CAUTION] > When a service receives a duplex message, it looks at the `ReplyTo` element in that incoming message to determine where to send the reply. If the channel that is used to receive the message is not secured, then an untrusted client could send a malicious message with a target machine's `ReplyTo`, leading to a denial of service (DOS) of that target machine. diff --git a/docs/framework/wcf/diagnostics/etw/determining-service-operation-duration.md b/docs/framework/wcf/diagnostics/etw/determining-service-operation-duration.md index d604c814f4381..e645ed70d01bd 100644 --- a/docs/framework/wcf/diagnostics/etw/determining-service-operation-duration.md +++ b/docs/framework/wcf/diagnostics/etw/determining-service-operation-duration.md @@ -14,7 +14,7 @@ If analytic tracing is enabled in a Windows Communication Foundation (WCF) appli 2. If you haven’t enabled analytic tracing, expand **Applications and Services Logs**, **Microsoft**, **Windows**, **Application Server-Applications**. Select **View**, **Show Analytic and Debug Logs**. Right-click **Analytic** and select **Enable Log**. Leave Event Viewer open so that traces can be viewed after the service operation is run. -3. Next, open a WCF application that includes a service project and a client project that interacts with that service. You can create such an application by following the [Getting Started Tutorial](../../getting-started-tutorial.md). If you have the WCF samples installed, you can open the [Getting Started](../../samples/getting-started-sample.md), which contains the completed project created in the tutorial. +3. Next, open a WCF application that includes a service project and a client project that interacts with that service. You can create such an application by following the [Getting Started Tutorial](../../getting-started-tutorial.md). If you have the WCF samples installed, you can open the [Getting Started](/previous-versions/dotnet/framework/wcf/samples/getting-started-sample), which contains the completed project created in the tutorial. 4. Execute the server application by pressing **F5**. Execute the client application by right-clicking on the **Client** project and selecting **Debug**, **Start New Instance**. diff --git a/docs/framework/wcf/diagnostics/etw/dynamically-enabling-analytic-tracing.md b/docs/framework/wcf/diagnostics/etw/dynamically-enabling-analytic-tracing.md index 1f9f424b9609b..9bd04e5a74972 100644 --- a/docs/framework/wcf/diagnostics/etw/dynamically-enabling-analytic-tracing.md +++ b/docs/framework/wcf/diagnostics/etw/dynamically-enabling-analytic-tracing.md @@ -12,7 +12,7 @@ Using tools that ship with the Windows operating system, you can enable or disab - **Logman** – A command line tool for configuring, controlling, and querying tracing data. For more information, see [Logman Create Trace](/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc788036(v=ws.10)) and [Logman Update Trace](/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc788128(v=ws.10)). -- **EventViewer** - Windows graphical management tool for viewing the results of tracing. For more information, see [WCF Services and Event Tracing for Windows](../../samples/wcf-services-and-event-tracing-for-windows.md) and [Event Viewer](/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc766042(v=ws.11)). +- **EventViewer** - Windows graphical management tool for viewing the results of tracing. For more information, see [WCF Services and Event Tracing for Windows](/previous-versions/dotnet/framework/wcf/samples/wcf-services-and-event-tracing-for-windows) and [Event Viewer](/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc766042(v=ws.11)). - **Perfmon** – Windows graphical management tool that uses counters to monitor tracing counters and the effects of tracing on performance. For more information, see [Create a Data Collector Set Manually](/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc766404(v=ws.11)). @@ -39,4 +39,4 @@ Using tools that ship with the Windows operating system, you can enable or disab ## See also -- [WCF Services and Event Tracing for Windows](../../samples/wcf-services-and-event-tracing-for-windows.md) +- [WCF Services and Event Tracing for Windows](/previous-versions/dotnet/framework/wcf/samples/wcf-services-and-event-tracing-for-windows) diff --git a/docs/framework/wcf/diagnostics/etw/index.md b/docs/framework/wcf/diagnostics/etw/index.md index 60b6780f655d0..fdaf3f034f66b 100644 --- a/docs/framework/wcf/diagnostics/etw/index.md +++ b/docs/framework/wcf/diagnostics/etw/index.md @@ -2,7 +2,7 @@ description: "Learn more about: Analytic Tracing with ETW" title: "Analytic Tracing with ETW" ms.date: "03/30/2017" -helpviewer_keywords: +helpviewer_keywords: - "diagnostics [WCF], analytic tracing" - "administration [WCF], analytic tracing" - "analytic tracing [WCF]" @@ -10,23 +10,23 @@ ms.assetid: 1d518e47-a38d-41e8-93d7-8c3b361f6a56 --- # Analytic Tracing with ETW -Windows Communication Foundation (WCF) analytic tracing offers a way to capture diagnostic information during the execution of a WCF service. WCF analytic tracing events are emitted at key points in the WCF stack to allow troubleshooting of WCF services in a production environment. Analytic tracing for WCF services has minimal impact on the performance of a product server that hosts [!INCLUDE[netfx_current_long](../../../../../includes/netfx-current-long-md.md)] WCF services as these events are very efficiently emitted to an Event Tracing for Windows (ETW) session. - -## In This Section - - [Analytic Tracing Overview](analytic-tracing-overview.md) - Discusses how WCF analytic tracing works in [!INCLUDE[netfx_current_long](../../../../../includes/netfx-current-long-md.md)]. - - [Dynamically Enabling Analytic Tracing](dynamically-enabling-analytic-tracing.md) - Discusses how to enable or disable tracing dynamically using ETW. - - [Configuring Message Flow Tracing](configuring-message-flow-tracing.md) - Describes how to configure message flow tracing. - - [Analytic Trace Event Reference](analytic-trace-event-reference.md) - Shows a table of event IDs with their event levels, event messages and keywords. - +Windows Communication Foundation (WCF) analytic tracing offers a way to capture diagnostic information during the execution of a WCF service. WCF analytic tracing events are emitted at key points in the WCF stack to allow troubleshooting of WCF services in a production environment. Analytic tracing for WCF services has minimal impact on the performance of a product server that hosts [!INCLUDE[netfx_current_long](../../../../../includes/netfx-current-long-md.md)] WCF services as these events are very efficiently emitted to an Event Tracing for Windows (ETW) session. + +## In This Section + + [Analytic Tracing Overview](analytic-tracing-overview.md) + Discusses how WCF analytic tracing works in [!INCLUDE[netfx_current_long](../../../../../includes/netfx-current-long-md.md)]. + + [Dynamically Enabling Analytic Tracing](dynamically-enabling-analytic-tracing.md) + Discusses how to enable or disable tracing dynamically using ETW. + + [Configuring Message Flow Tracing](configuring-message-flow-tracing.md) + Describes how to configure message flow tracing. + + [Analytic Trace Event Reference](analytic-trace-event-reference.md) + Shows a table of event IDs with their event levels, event messages and keywords. + ## See also -- [WCF Services and Event Tracing for Windows](../../samples/wcf-services-and-event-tracing-for-windows.md) +- [WCF Services and Event Tracing for Windows](/previous-versions/dotnet/framework/wcf/samples/wcf-services-and-event-tracing-for-windows) - [Tracking Events into Event Tracing in Windows](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/tracking-events-into-event-tracing-in-windows) diff --git a/docs/framework/wcf/diagnostics/message-flow-overview.md b/docs/framework/wcf/diagnostics/message-flow-overview.md index 00c7a00e32920..4947b03e2f485 100644 --- a/docs/framework/wcf/diagnostics/message-flow-overview.md +++ b/docs/framework/wcf/diagnostics/message-flow-overview.md @@ -22,7 +22,7 @@ In a distributed system containing interconnected services, it is necessary to d 2. If you haven’t enabled analytic tracing, expand **Applications and Services Logs**, **Microsoft**, **Windows**, **Application Server-Applications**. Select **View**, **Show Analytic and Debug Logs**. Right-click **Analytic** and select **Enable Log**. Leave Event Viewer open so that traces can be viewed. -3. Open the sample created in the [Getting Started Tutorial](../getting-started-tutorial.md) in Visual Studio 2012. Note that you must run Visual Studio 2012 as an administrator so that the service can be created. If you have the WCF samples installed, you can open the [Getting Started](../samples/getting-started-sample.md), which contains the completed project created in the tutorial. +3. Open the sample created in the [Getting Started Tutorial](../getting-started-tutorial.md) in Visual Studio 2012. Note that you must run Visual Studio 2012 as an administrator so that the service can be created. If you have the WCF samples installed, you can open the [Getting Started](/previous-versions/dotnet/framework/wcf/samples/getting-started-sample), which contains the completed project created in the tutorial. 4. Right-click the **Service** project and select **Add**, **New Item**. Select **Application Configuration File** and click **OK**. diff --git a/docs/framework/wcf/diagnostics/tracing/configuring-tracing.md b/docs/framework/wcf/diagnostics/tracing/configuring-tracing.md index da49c4f906ee9..442da6fd7a95a 100644 --- a/docs/framework/wcf/diagnostics/tracing/configuring-tracing.md +++ b/docs/framework/wcf/diagnostics/tracing/configuring-tracing.md @@ -131,7 +131,7 @@ This topic describes how you can enable tracing, configure trace sources to emit ``` - For more information about creating user-defined trace sources, see [Extending Tracing](../../samples/extending-tracing.md). + For more information about creating user-defined trace sources, see [Extending Tracing](/previous-versions/dotnet/framework/wcf/samples/extending-tracing). ## Configuring Trace Listeners to Consume Traces diff --git a/docs/framework/wcf/diagnostics/tracing/emitting-user-code-traces.md b/docs/framework/wcf/diagnostics/tracing/emitting-user-code-traces.md index 00de950849d7c..2947d005bb693 100644 --- a/docs/framework/wcf/diagnostics/tracing/emitting-user-code-traces.md +++ b/docs/framework/wcf/diagnostics/tracing/emitting-user-code-traces.md @@ -8,7 +8,7 @@ ms.assetid: fa54186a-8ffa-4332-b0e7-63867126fd49 In addition to enabling tracing in configuration to collect instrumentation data generated by Windows Communication Foundation (WCF), you can also emit traces programmatically in user code. In this way, you can proactively create instrumentation data that you can peruse later for diagnostic purpose. This topic discusses how you can do this. -In addition, the [Extending Tracing](../../samples/extending-tracing.md) sample includes all the code demonstrated in the following sections. +In addition, the [Extending Tracing](/previous-versions/dotnet/framework/wcf/samples/extending-tracing) sample includes all the code demonstrated in the following sections. ## Creating a Trace Source @@ -104,11 +104,11 @@ ts.TraceEvent(TraceEventType.Warning, 0, "Throwing exception " + "exceptionMessa ## Viewing User Traces in the Service Trace Viewer Tool -This section contains screenshots of traces generated by running the [Extending Tracing](../../samples/extending-tracing.md) sample, when viewed using the [Service Trace Viewer Tool (SvcTraceViewer.exe)](../../service-trace-viewer-tool-svctraceviewer-exe.md). +This section contains screenshots of traces generated by running the [Extending Tracing](/previous-versions/dotnet/framework/wcf/samples/extending-tracing) sample, when viewed using the [Service Trace Viewer Tool (SvcTraceViewer.exe)](../../service-trace-viewer-tool-svctraceviewer-exe.md). In the following diagram, the "Add request" activity created previously is selected on the left panel. It is listed with three other Math operation activities (Divide, Subtract, Multiply) that constitute the application client program. The user code has defined one new activity for each operation to isolate potential error occurrences in different requests. -To demonstrate the use of transfers in the [Extending Tracing](../../samples/extending-tracing.md) sample, a Calculator activity that encapsulates the four operation requests is also created. For each request, there is a transfer back and forth from the Calculator activity to the request activity (trace is highlighted in the upper right panel in the figure). +To demonstrate the use of transfers in the [Extending Tracing](/previous-versions/dotnet/framework/wcf/samples/extending-tracing) sample, a Calculator activity that encapsulates the four operation requests is also created. For each request, there is a transfer back and forth from the Calculator activity to the request activity (trace is highlighted in the upper right panel in the figure). When you select an activity on the left panel, the traces included by this activity are shown on the upper right panel. If `propagateActivity` is `true` at every endpoint in the request path, traces in the request activity are from all processes that participate in the request. In this example, you can see traces from both the client and service in the 4th column in the panel. @@ -147,4 +147,4 @@ Defining activities and propagating the activity ID enables us to perform direct ## See also -- [Extending Tracing](../../samples/extending-tracing.md) +- [Extending Tracing](/previous-versions/dotnet/framework/wcf/samples/extending-tracing) diff --git a/docs/framework/wcf/diagnostics/tracing/security-concerns-and-useful-tips-for-tracing.md b/docs/framework/wcf/diagnostics/tracing/security-concerns-and-useful-tips-for-tracing.md index 0d423b97a2a4a..ca5810872a56e 100644 --- a/docs/framework/wcf/diagnostics/tracing/security-concerns-and-useful-tips-for-tracing.md +++ b/docs/framework/wcf/diagnostics/tracing/security-concerns-and-useful-tips-for-tracing.md @@ -82,7 +82,7 @@ This topic describes how you can protect sensitive information from being expose The changes are effective only when the application starts or restarts. An event is logged at startup when both attributes are set to `true`. An event is also logged if `logKnownPii` is set to `true` but `enableLoggingKnownPii` is `false`. - For more information on PII logging, see [PII Security Lockdown](../../samples/pii-security-lockdown.md) sample. + For more information on PII logging, see [PII Security Lockdown](/previous-versions/dotnet/framework/wcf/samples/pii-security-lockdown) sample. The machine administrator and application deployer should exercise extreme caution when using these two switches. If PII logging is enabled, security keys and PII are logged. If it is disabled, sensitive and application-specific data is still logged in message headers and bodies. For a more thorough discussion on privacy and protecting PII from being exposed, see [User Privacy](/previous-versions/dotnet/articles/aa480490(v=msdn.10)). diff --git a/docs/framework/wcf/diagnostics/tracing/using-service-trace-viewer-for-viewing-correlated-traces-and-troubleshooting.md b/docs/framework/wcf/diagnostics/tracing/using-service-trace-viewer-for-viewing-correlated-traces-and-troubleshooting.md index 3a27a7edc7f2e..a7cfb1b199203 100644 --- a/docs/framework/wcf/diagnostics/tracing/using-service-trace-viewer-for-viewing-correlated-traces-and-troubleshooting.md +++ b/docs/framework/wcf/diagnostics/tracing/using-service-trace-viewer-for-viewing-correlated-traces-and-troubleshooting.md @@ -12,7 +12,7 @@ This topic describes the format of trace data, how to view it, and approaches th The Windows Communication Foundation (WCF) Service Trace Viewer tool helps you correlate diagnostic traces produced by WCF listeners to locate the root cause of an error. The tool gives you a way to easily view, group, and filter traces so that you can diagnose, repair and verify issues with WCF services. For more information about using this tool, see [Service Trace Viewer Tool (SvcTraceViewer.exe)](../../service-trace-viewer-tool-svctraceviewer-exe.md). -This topic contains screenshots of traces generated by running the [Tracing and Message Logging](../../samples/tracing-and-message-logging.md) sample, when viewed using the [Service Trace Viewer Tool (SvcTraceViewer.exe)](../../service-trace-viewer-tool-svctraceviewer-exe.md). This topic demonstrates how to understand trace content, activities and their correlation, and how to analyze large numbers of traces when troubleshooting. +This topic contains screenshots of traces generated by running the [Tracing and Message Logging](/previous-versions/dotnet/framework/wcf/samples/tracing-and-message-logging) sample, when viewed using the [Service Trace Viewer Tool (SvcTraceViewer.exe)](../../service-trace-viewer-tool-svctraceviewer-exe.md). This topic demonstrates how to understand trace content, activities and their correlation, and how to analyze large numbers of traces when troubleshooting. ## Viewing Trace Content @@ -110,7 +110,7 @@ An activity is a logical unit of processing that groups all traces related to th On the client, one WCF activity is created for each object model call (for example, Open ChannelFactory, Add, Divide, and so on.) Each of the operation calls is processed in a "Process Action" activity. -In the following screenshot, extracted from the [Tracing and Message Logging](../../samples/tracing-and-message-logging.md) sample the left panel displays the list of activities created in the client process, sorted by creation time. The following is a chronological list of activities: +In the following screenshot, extracted from the [Tracing and Message Logging](/previous-versions/dotnet/framework/wcf/samples/tracing-and-message-logging) sample the left panel displays the list of activities created in the client process, sorted by creation time. The following is a chronological list of activities: - Constructed the channel factory (ClientBase). diff --git a/docs/framework/wcf/endpoint-creation-overview.md b/docs/framework/wcf/endpoint-creation-overview.md index 52bcef0b628d4..c1a74113d1952 100644 --- a/docs/framework/wcf/endpoint-creation-overview.md +++ b/docs/framework/wcf/endpoint-creation-overview.md @@ -196,7 +196,7 @@ Dim echoUri As Uri = New Uri("http://localhost:8000/") serviceHost.Open() ``` - If endpoints are explicitly provided, the default endpoints can still be added by calling on the before calling . For more information about default endpoints, see [Simplified Configuration](simplified-configuration.md) and [Simplified Configuration for WCF Services](./samples/simplified-configuration-for-wcf-services.md). + If endpoints are explicitly provided, the default endpoints can still be added by calling on the before calling . For more information about default endpoints, see [Simplified Configuration](simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services). ## See also diff --git a/docs/framework/wcf/extending/client-channel-factories-and-channels.md b/docs/framework/wcf/extending/client-channel-factories-and-channels.md index b0b646755345d..75a5d5752db28 100644 --- a/docs/framework/wcf/extending/client-channel-factories-and-channels.md +++ b/docs/framework/wcf/extending/client-channel-factories-and-channels.md @@ -27,7 +27,7 @@ A channel factory creates channels. - The class implements . It takes care of basic state management. - The following discussion is based upon the [Transport: UDP](../samples/transport-udp.md) sample. + The following discussion is based upon the [Transport: UDP](/previous-versions/dotnet/framework/wcf/samples/transport-udp) sample. ### Creating a Channel Factory diff --git a/docs/framework/wcf/extending/configuration-and-metadata-support.md b/docs/framework/wcf/extending/configuration-and-metadata-support.md index acc575cd268a8..ea691c2ec1951 100644 --- a/docs/framework/wcf/extending/configuration-and-metadata-support.md +++ b/docs/framework/wcf/extending/configuration-and-metadata-support.md @@ -26,11 +26,11 @@ This topic describes how to enable configuration and metadata support for bindin To enable configuration file support for a channel, you must implement two configuration sections, , which enables configuration support for binding elements, and the and , which enable configuration support for bindings. - An easier way to do this is to use the [ConfigurationCodeGenerator](../samples/configurationcodegenerator.md) sample tool to generate configuration code for your bindings and binding elements. + An easier way to do this is to use the [ConfigurationCodeGenerator](/previous-versions/dotnet/framework/wcf/samples/configurationcodegenerator) sample tool to generate configuration code for your bindings and binding elements. ### Extending BindingElementExtensionElement - The following example code is taken from the [Transport: UDP](../samples/transport-udp.md) sample. The `UdpTransportElement` is a that exposes `UdpTransportBindingElement` to the configuration system. With a few basic overrides, the sample defines the configuration section name, the type of the binding element and how to create the binding element. Users can then register the extension section in a configuration file as follows. + The following example code is taken from the [Transport: UDP](/previous-versions/dotnet/framework/wcf/samples/transport-udp) sample. The `UdpTransportElement` is a that exposes `UdpTransportBindingElement` to the configuration system. With a few basic overrides, the sample defines the configuration section name, the type of the binding element and how to create the binding element. Users can then register the extension section in a configuration file as follows. ```xml @@ -123,7 +123,7 @@ protected override void OnApplyConfiguration(string configurationName) ### Adding WSDL Support - The transport binding element in a binding is responsible for exporting and importing addressing information in metadata. When using a SOAP binding, the transport binding element should also export a correct transport URI in metadata. The following example code is taken from the [Transport: UDP](../samples/transport-udp.md) sample. + The transport binding element in a binding is responsible for exporting and importing addressing information in metadata. When using a SOAP binding, the transport binding element should also export a correct transport URI in metadata. The following example code is taken from the [Transport: UDP](/previous-versions/dotnet/framework/wcf/samples/transport-udp) sample. #### WSDL Export @@ -183,7 +183,7 @@ if (transportBindingElement is UdpTransportBindingElement) ### Adding Policy Support - The custom binding element can export policy assertions in the WSDL binding for a service endpoint to express the capabilities of that binding element. The following example code is taken from the [Transport: UDP](../samples/transport-udp.md) sample. + The custom binding element can export policy assertions in the WSDL binding for a service endpoint to express the capabilities of that binding element. The following example code is taken from the [Transport: UDP](/previous-versions/dotnet/framework/wcf/samples/transport-udp) sample. #### Policy Export diff --git a/docs/framework/wcf/extending/creating-a-bindingelement.md b/docs/framework/wcf/extending/creating-a-bindingelement.md index d9ac1f68b49ee..4ce355aa30882 100644 --- a/docs/framework/wcf/extending/creating-a-bindingelement.md +++ b/docs/framework/wcf/extending/creating-a-bindingelement.md @@ -24,7 +24,7 @@ Bindings and binding elements (objects that extend has a similar implementation for creating `ChunkingChannelListener` and passing it the inner channel listener. - As another example using a transport channel, the [Transport: UDP](../samples/transport-udp.md) sample provides the following override. + As another example using a transport channel, the [Transport: UDP](/previous-versions/dotnet/framework/wcf/samples/transport-udp) sample provides the following override. In the sample, the binding element is `UdpTransportBindingElement`, which derives from . It overrides the following methods to build the factories associated with the channel. @@ -76,4 +76,4 @@ public IChannelListener BuildChannelListener(BindingContext - - [Developing Channels](developing-channels.md) -- [Transport: UDP](../samples/transport-udp.md) +- [Transport: UDP](/previous-versions/dotnet/framework/wcf/samples/transport-udp) diff --git a/docs/framework/wcf/extending/creating-user-defined-bindings.md b/docs/framework/wcf/extending/creating-user-defined-bindings.md index 78dab9063cdc4..74ac35a23af4b 100644 --- a/docs/framework/wcf/extending/creating-user-defined-bindings.md +++ b/docs/framework/wcf/extending/creating-user-defined-bindings.md @@ -54,7 +54,7 @@ Binding customBinding = new CustomBinding( ); ``` - How you write your new binding element depends on its exact functionality. One of the samples, [Transport: UDP](../samples/transport-udp.md), provides a detailed description of how to implement one kind of binding element. + How you write your new binding element depends on its exact functionality. One of the samples, [Transport: UDP](/previous-versions/dotnet/framework/wcf/samples/transport-udp), provides a detailed description of how to implement one kind of binding element. ## Creating a New Binding diff --git a/docs/framework/wcf/extending/custom-bindings.md b/docs/framework/wcf/extending/custom-bindings.md index c1963bf337168..e55b2d603e15f 100644 --- a/docs/framework/wcf/extending/custom-bindings.md +++ b/docs/framework/wcf/extending/custom-bindings.md @@ -76,4 +76,4 @@ In addition, you can define your own binding elements and insert them between an - [System-Provided Bindings](../system-provided-bindings.md) - [How to: Customize a System-Provided Binding](how-to-customize-a-system-provided-binding.md) - [\](../../configure-apps/file-schema/wcf/custombinding.md) -- [Custom Binding](../samples/custom-binding.md) +- [Custom Binding](/previous-versions/dotnet/framework/wcf/samples/custom-binding) diff --git a/docs/framework/wcf/extending/custom-encoders.md b/docs/framework/wcf/extending/custom-encoders.md index 484d84ff6a927..902388f2991b3 100644 --- a/docs/framework/wcf/extending/custom-encoders.md +++ b/docs/framework/wcf/extending/custom-encoders.md @@ -92,7 +92,7 @@ This topic discusses how to create custom encoders. Then connect your custom to the binding element stack used to configure the service or client by overriding the method to return an instance of this factory. - There are two samples provided with WCF that illustrate this process with sample code: [Custom Message Encoder: Custom Text Encoder](../samples/custom-message-encoder-custom-text-encoder.md) and [Custom Message Encoder: Compression Encoder](../samples/custom-message-encoder-compression-encoder.md). + There are two samples provided with WCF that illustrate this process with sample code: [Custom Message Encoder: Custom Text Encoder](/previous-versions/dotnet/framework/wcf/samples/custom-message-encoder-custom-text-encoder) and [Custom Message Encoder: Compression Encoder](/previous-versions/dotnet/framework/wcf/samples/custom-message-encoder-compression-encoder). ## See also diff --git a/docs/framework/wcf/extending/developing-channels.md b/docs/framework/wcf/extending/developing-channels.md index f8fee73367910..d8c3ae7f6bf28 100644 --- a/docs/framework/wcf/extending/developing-channels.md +++ b/docs/framework/wcf/extending/developing-channels.md @@ -6,7 +6,7 @@ ms.assetid: 0513af9f-a0c2-457b-9a50-5b6bfee48513 --- # Developing Channels -To develop a protocol or transport channel that can be used with the Windows Communication Foundation (WCF) application layer requires several steps. This topic describes those steps and points you to specific topics for more information. To understand the channel model and the various types that are mentioned in this topic, see [Channel Model Overview](channel-model-overview.md). For a complete transport channel sample, see [Transport: UDP](../samples/transport-udp.md). +To develop a protocol or transport channel that can be used with the Windows Communication Foundation (WCF) application layer requires several steps. This topic describes those steps and points you to specific topics for more information. To understand the channel model and the various types that are mentioned in this topic, see [Channel Model Overview](channel-model-overview.md). For a complete transport channel sample, see [Transport: UDP](/previous-versions/dotnet/framework/wcf/samples/transport-udp). ## The Channel Development Task List diff --git a/docs/framework/wcf/extending/exporting-custom-metadata-for-a-wcf-extension.md b/docs/framework/wcf/extending/exporting-custom-metadata-for-a-wcf-extension.md index 20b7efe6ac4c5..72b001b5dcec9 100644 --- a/docs/framework/wcf/extending/exporting-custom-metadata-for-a-wcf-extension.md +++ b/docs/framework/wcf/extending/exporting-custom-metadata-for-a-wcf-extension.md @@ -32,7 +32,7 @@ In Windows Communication Foundation (WCF), metadata export is the process of des The method is called on all implementations within the instance that is being exported. The method is called on all implementations with the instance that is being exported. - For more information, see [How to: Export Custom WSDL](how-to-export-custom-wsdl.md) and the sample [Custom WSDL Publication](../samples/custom-wsdl-publication.md). + For more information, see [How to: Export Custom WSDL](how-to-export-custom-wsdl.md) and the sample [Custom WSDL Publication](/previous-versions/dotnet/framework/wcf/samples/custom-wsdl-publication). ## Exporting Custom Policy Assertions diff --git a/docs/framework/wcf/extending/extending-clients.md b/docs/framework/wcf/extending/extending-clients.md index 7a034860ed6b5..9639db0e810a5 100644 --- a/docs/framework/wcf/extending/extending-clients.md +++ b/docs/framework/wcf/extending/extending-clients.md @@ -34,7 +34,7 @@ In a calling application, the service model layer is responsible for translating - Custom Data Model. A user may want to have a data or serialization model other than those supported by default in WCF (namely, , , and objects). This can be done by implementing the message formatter interfaces. For more information, see and the property. -- Custom Parameter Validation. A user may want to enforce that typed parameters are valid (as opposed to XML). This can be done using the parameter inspector interfaces. For an example, see [How to: Inspect or Modify Parameters](how-to-inspect-or-modify-parameters.md) or [Client Validation](../samples/client-validation.md). +- Custom Parameter Validation. A user may want to enforce that typed parameters are valid (as opposed to XML). This can be done using the parameter inspector interfaces. For an example, see [How to: Inspect or Modify Parameters](how-to-inspect-or-modify-parameters.md) or [Client Validation](/previous-versions/dotnet/framework/wcf/samples/client-validation). ### Using the ClientRuntime Class diff --git a/docs/framework/wcf/extending/extending-dispatchers.md b/docs/framework/wcf/extending/extending-dispatchers.md index b88467561db66..7201770ae345d 100644 --- a/docs/framework/wcf/extending/extending-dispatchers.md +++ b/docs/framework/wcf/extending/extending-dispatchers.md @@ -40,25 +40,25 @@ Use the to acquire the There a number of reasons to extend the dispatcher: -- Custom Message Validation. Users can enforce that a message is valid for a certain schema. This can be done by implementing the message interceptor interfaces. For an example, see [Message Inspectors](../samples/message-inspectors.md). +- Custom Message Validation. Users can enforce that a message is valid for a certain schema. This can be done by implementing the message interceptor interfaces. For an example, see [Message Inspectors](/previous-versions/dotnet/framework/wcf/samples/message-inspectors). - Custom Message Logging. Users can inspect and log some set of application messages that flow through an endpoint. This can also be accomplished with the message interceptor interfaces. - Custom Message Transformations. Users can apply certain transformations to the message in the runtime (for example, for versioning). This can be accomplished, again, with the message interceptor interfaces. -- Custom Data Model. Users can have a data serialization model other than those supported by default in WCF (namely, , , and raw messages). This can be done by implement the message formatter interfaces. For an example, see [Operation Formatter and Operation Selector](../samples/operation-formatter-and-operation-selector.md). +- Custom Data Model. Users can have a data serialization model other than those supported by default in WCF (namely, , , and raw messages). This can be done by implement the message formatter interfaces. For an example, see [Operation Formatter and Operation Selector](/previous-versions/dotnet/framework/wcf/samples/operation-formatter-and-operation-selector). - Custom Parameter Validation. Users can enforce that typed parameters are valid (as opposed to XML). This can be done using the parameter inspector interfaces. -- Custom Operation Dispatching. Users can implement dispatching on something other than action – for example, on the body element, or on a custom message property. This can be done using the interface. For an example, see [Operation Formatter and Operation Selector](../samples/operation-formatter-and-operation-selector.md). +- Custom Operation Dispatching. Users can implement dispatching on something other than action – for example, on the body element, or on a custom message property. This can be done using the interface. For an example, see [Operation Formatter and Operation Selector](/previous-versions/dotnet/framework/wcf/samples/operation-formatter-and-operation-selector). -- Object Pooling. Users can pool instances rather than allocating a new one for every call. This can be implemented using the instance provider interfaces. For an example, see [Pooling](../samples/pooling.md). +- Object Pooling. Users can pool instances rather than allocating a new one for every call. This can be implemented using the instance provider interfaces. For an example, see [Pooling](/previous-versions/dotnet/framework/wcf/samples/pooling). - Instance Leasing. Users can implement a leasing pattern for instance lifetime, similar to that of .NET Framework Remoting. This can be done using the instance context lifetime interfaces. - Custom Error Handling. Users can control how both local errors are processed and how faults are communicated back to clients. This can be implemented using the interfaces. -- Custom Authorization Behaviors. Users can implement custom access control by extending the Contract or Operation run-time pieces and adding security checks based upon the tokens present in the message. This can be accomplished using either the message interceptor or parameter interceptor interfaces. For examples, see [Security Extensibility](../samples/security-extensibility.md). +- Custom Authorization Behaviors. Users can implement custom access control by extending the Contract or Operation run-time pieces and adding security checks based upon the tokens present in the message. This can be accomplished using either the message interceptor or parameter interceptor interfaces. For examples, see [Security Extensibility](/previous-versions/dotnet/framework/wcf/samples/security-extensibility). > [!CAUTION] > Because altering security properties has the potential to compromise the security of WCF applications, it is strongly recommended that you undertake security-related modifications with care and test thoroughly prior to deployment. diff --git a/docs/framework/wcf/extending/how-to-configure-a-custom-ws-metadata-exchange-binding.md b/docs/framework/wcf/extending/how-to-configure-a-custom-ws-metadata-exchange-binding.md index 025b97fa01e90..02fc995602114 100644 --- a/docs/framework/wcf/extending/how-to-configure-a-custom-ws-metadata-exchange-binding.md +++ b/docs/framework/wcf/extending/how-to-configure-a-custom-ws-metadata-exchange-binding.md @@ -9,7 +9,7 @@ ms.assetid: cdba4d73-da64-4805-bc56-9822becfd1e4 --- # How to: Configure a Custom WS-Metadata Exchange Binding -This article explains how to configure a custom WS-Metadata exchange binding. Windows Communication Foundation (WCF) includes four system-defined metadata bindings, but you can publish metadata using any binding you want. This article shows you how to publish metadata using the `wsHttpBinding`. This binding gives you the option of exposing metadata in a secure way. The code in this article is based on the [Getting Started](../samples/getting-started-sample.md). +This article explains how to configure a custom WS-Metadata exchange binding. Windows Communication Foundation (WCF) includes four system-defined metadata bindings, but you can publish metadata using any binding you want. This article shows you how to publish metadata using the `wsHttpBinding`. This binding gives you the option of exposing metadata in a secure way. The code in this article is based on the [Getting Started](/previous-versions/dotnet/framework/wcf/samples/getting-started-sample). ### Using a configuration file @@ -111,8 +111,8 @@ This article explains how to configure a custom WS-Metadata exchange binding. Wi ## See also -- [Metadata Publishing Behavior](../samples/metadata-publishing-behavior.md) -- [Retrieve Metadata](../samples/retrieve-metadata.md) +- [Metadata Publishing Behavior](/previous-versions/dotnet/framework/wcf/samples/metadata-publishing-behavior) +- [Retrieve Metadata](/previous-versions/dotnet/framework/wcf/samples/retrieve-metadata) - [Metadata](../feature-details/metadata.md) - [Publishing Metadata](../feature-details/publishing-metadata.md) - [Publishing Metadata Endpoints](../publishing-metadata-endpoints.md) diff --git a/docs/framework/wcf/extending/how-to-create-a-custom-authorization-manager-for-a-service.md b/docs/framework/wcf/extending/how-to-create-a-custom-authorization-manager-for-a-service.md index c38601ae0d18a..474ecc0a15bbf 100644 --- a/docs/framework/wcf/extending/how-to-create-a-custom-authorization-manager-for-a-service.md +++ b/docs/framework/wcf/extending/how-to-create-a-custom-authorization-manager-for-a-service.md @@ -109,7 +109,7 @@ Registration of the custom authorization manager for a service can be done in co ## Example -The following code example demonstrates a basic implementation of a class that includes overriding the method. The example code examines the for a custom claim and returns `true` when the resource for that custom claim matches the action value from the . For a more complete implementation of a class, see [Authorization Policy](../samples/authorization-policy.md). +The following code example demonstrates a basic implementation of a class that includes overriding the method. The example code examines the for a custom claim and returns `true` when the resource for that custom claim matches the action value from the . For a more complete implementation of a class, see [Authorization Policy](/previous-versions/dotnet/framework/wcf/samples/authorization-policy). [!code-csharp[c_CustomAuthMgr#2](../../../../samples/snippets/csharp/VS_Snippets_CFX/c_customauthmgr/cs/c_customauthmgr.cs#2)] [!code-vb[c_CustomAuthMgr#2](../../../../samples/snippets/visualbasic/VS_Snippets_CFX/c_customauthmgr/vb/c_customauthmgr.vb#2)] @@ -117,4 +117,4 @@ The following code example demonstrates a basic implementation of a -- [Authorization Policy](../samples/authorization-policy.md) +- [Authorization Policy](/previous-versions/dotnet/framework/wcf/samples/authorization-policy) diff --git a/docs/framework/wcf/extending/how-to-create-a-custom-authorization-policy.md b/docs/framework/wcf/extending/how-to-create-a-custom-authorization-policy.md index f8fe2e7be3913..a873a7d966e3c 100644 --- a/docs/framework/wcf/extending/how-to-create-a-custom-authorization-policy.md +++ b/docs/framework/wcf/extending/how-to-create-a-custom-authorization-policy.md @@ -77,4 +77,4 @@ The Identity Model infrastructure in Windows Communication Foundation (WCF) supp - - [How to: Compare Claims](how-to-compare-claims.md) - [How to: Create a Custom Authorization Manager for a Service](how-to-create-a-custom-authorization-manager-for-a-service.md) -- [Authorization Policy](../samples/authorization-policy.md) +- [Authorization Policy](/previous-versions/dotnet/framework/wcf/samples/authorization-policy) diff --git a/docs/framework/wcf/extending/how-to-create-a-custom-client-identity-verifier.md b/docs/framework/wcf/extending/how-to-create-a-custom-client-identity-verifier.md index b4d73708fc0ff..302b6f3b00891 100644 --- a/docs/framework/wcf/extending/how-to-create-a-custom-client-identity-verifier.md +++ b/docs/framework/wcf/extending/how-to-create-a-custom-client-identity-verifier.md @@ -11,7 +11,7 @@ ms.assetid: f2d34e43-fa8b-46d2-91cf-d2960e13e16b The *identity* feature of Windows Communication Foundation (WCF) enables a client to specify in advance the expected identity of the service. Whenever a server authenticates itself to the client, the identity is checked against the expected identity. (For an explanation of identity and how it works, see [Service Identity and Authentication](../feature-details/service-identity-and-authentication.md).) - If needed, the verification can be customized using a custom identity verifier. For example, you can perform additional service identity verification checks. In this example, the custom identity verifier checks additional claims in the X.509 certificate returned from the server. For a sample application, see [Service Identity Sample](../samples/service-identity-sample.md). + If needed, the verification can be customized using a custom identity verifier. For example, you can perform additional service identity verification checks. In this example, the custom identity verifier checks additional claims in the X.509 certificate returned from the server. For a sample application, see [Service Identity Sample](/previous-versions/dotnet/framework/wcf/samples/service-identity-sample). ### To extend the EndpointIdentity class @@ -84,5 +84,5 @@ The *identity* feature of Windows Communication Foundation (WCF) enables a clien - - - -- [Service Identity Sample](../samples/service-identity-sample.md) -- [Authorization Policy](../samples/authorization-policy.md) +- [Service Identity Sample](/previous-versions/dotnet/framework/wcf/samples/service-identity-sample) +- [Authorization Policy](/previous-versions/dotnet/framework/wcf/samples/authorization-policy) diff --git a/docs/framework/wcf/extending/how-to-create-a-custom-token.md b/docs/framework/wcf/extending/how-to-create-a-custom-token.md index 9150c98d82e48..aaea6461fafc4 100644 --- a/docs/framework/wcf/extending/how-to-create-a-custom-token.md +++ b/docs/framework/wcf/extending/how-to-create-a-custom-token.md @@ -14,7 +14,7 @@ ms.assetid: 6d892973-1558-4115-a9e1-696777776125 --- # How to: Create a Custom Token -This topic shows how to create a custom security token using the class, and how to integrate it with a custom security token provider and authenticator. For a complete code example see the [Custom Token](../samples/custom-token.md) sample. +This topic shows how to create a custom security token using the class, and how to integrate it with a custom security token provider and authenticator. For a complete code example see the [Custom Token](/previous-versions/dotnet/framework/wcf/samples/custom-token) sample. A *security token* is essentially an XML element that is used by the Windows Communication Foundation (WCF) security framework to represent claims about a sender inside the SOAP message. WCF security provides various tokens for system-provided authentication modes. Examples include an X.509 certificate security token represented by the class or a Username security token represented by the class. @@ -143,7 +143,7 @@ This topic shows how to create a custom security token using the and inserting it into the client runtime. For more information, see [Extending Clients](extending-clients.md). The equivalent feature on the service is the . For a complete code example see the [Message Inspectors](../samples/message-inspectors.md) sample. +You can inspect or modify the incoming or outgoing messages across a WCF client by implementing a and inserting it into the client runtime. For more information, see [Extending Clients](extending-clients.md). The equivalent feature on the service is the . For a complete code example see the [Message Inspectors](/previous-versions/dotnet/framework/wcf/samples/message-inspectors) sample. ### To inspect or modify messages diff --git a/docs/framework/wcf/extending/how-to-lock-down-endpoints-in-the-enterprise.md b/docs/framework/wcf/extending/how-to-lock-down-endpoints-in-the-enterprise.md index 32ecc6bc649ae..eb47fbf4540fd 100644 --- a/docs/framework/wcf/extending/how-to-lock-down-endpoints-in-the-enterprise.md +++ b/docs/framework/wcf/extending/how-to-lock-down-endpoints-in-the-enterprise.md @@ -21,11 +21,11 @@ In this case, the validator is a client validator because this endpoint behavior ### To create the endpoint validator -1. Create an with the desired validation steps in the method. The following code provides an example. (The `InternetClientValidatorBehavior` is taken from the [Security Validation](../samples/security-validation.md) sample.) +1. Create an with the desired validation steps in the method. The following code provides an example. (The `InternetClientValidatorBehavior` is taken from the [Security Validation](/previous-versions/dotnet/framework/wcf/samples/security-validation) sample.) [!code-csharp[LockdownValidation#2](../../../../samples/snippets/csharp/VS_Snippets_CFX/lockdownvalidation/cs/internetclientvalidatorbehavior.cs#2)] -2. Create new that registers the endpoint validator created in step 1. The following code example shows this. (The original code for this example is in the [Security Validation](../samples/security-validation.md) sample.) +2. Create new that registers the endpoint validator created in step 1. The following code example shows this. (The original code for this example is in the [Security Validation](/previous-versions/dotnet/framework/wcf/samples/security-validation) sample.) [!code-csharp[LockdownValidation#3](../../../../samples/snippets/csharp/VS_Snippets_CFX/lockdownvalidation/cs/internetclientvalidatorelement.cs#3)] @@ -53,7 +53,7 @@ In this case, the validator is a client validator because this endpoint behavior ## Example -The following code example shows how to add a common behavior to the machine.config file and save a copy to the disk. The `InternetClientValidatorBehavior` is taken from the [Security Validation](../samples/security-validation.md) sample. +The following code example shows how to add a common behavior to the machine.config file and save a copy to the disk. The `InternetClientValidatorBehavior` is taken from the [Security Validation](/previous-versions/dotnet/framework/wcf/samples/security-validation) sample. [!code-csharp[LockdownValidation#1](../../../../samples/snippets/csharp/VS_Snippets_CFX/lockdownvalidation/cs/hostapplication.cs#1)] diff --git a/docs/framework/wcf/extending/how-to-retrieve-metadata-over-a-non-mex-binding.md b/docs/framework/wcf/extending/how-to-retrieve-metadata-over-a-non-mex-binding.md index 05432e6cbd70f..580d3284a3e76 100644 --- a/docs/framework/wcf/extending/how-to-retrieve-metadata-over-a-non-mex-binding.md +++ b/docs/framework/wcf/extending/how-to-retrieve-metadata-over-a-non-mex-binding.md @@ -6,7 +6,7 @@ ms.assetid: 2292e124-81b2-4317-b881-ce9c1ec66ecb --- # How to: Retrieve Metadata Over a non-MEX Binding -This topic describes how to retrieve metadata from a MEX endpoint over a non-MEX binding. The code in this sample is based on the [Custom Secure Metadata Endpoint](../samples/custom-secure-metadata-endpoint.md) sample. +This topic describes how to retrieve metadata from a MEX endpoint over a non-MEX binding. The code in this sample is based on the [Custom Secure Metadata Endpoint](/previous-versions/dotnet/framework/wcf/samples/custom-secure-metadata-endpoint) sample. ### To retrieve metadata over a non-MEX binding diff --git a/docs/framework/wcf/extending/overriding-the-identity-of-a-service-for-authentication.md b/docs/framework/wcf/extending/overriding-the-identity-of-a-service-for-authentication.md index 7e965c9e5c85f..6bf2fc922926f 100644 --- a/docs/framework/wcf/extending/overriding-the-identity-of-a-service-for-authentication.md +++ b/docs/framework/wcf/extending/overriding-the-identity-of-a-service-for-authentication.md @@ -13,7 +13,7 @@ Typically, you do not have to set the identity on a service because the selectio The following Web Services Description Language (WSDL) fragment shows the identity for the endpoint previously defined. In this example, the service is running as a self-hosted service under a particular user account (username@contoso.com) and therefore the user principal name (UPN) identity contains the account name. The UPN is also known as the user sign-in name in a Windows domain. - For a sample application that demonstrates identity setting, see [Service Identity Sample](../samples/service-identity-sample.md). For more information about service identity, see [Service Identity and Authentication](../feature-details/service-identity-and-authentication.md). + For a sample application that demonstrates identity setting, see [Service Identity Sample](/previous-versions/dotnet/framework/wcf/samples/service-identity-sample). For more information about service identity, see [Service Identity and Authentication](../feature-details/service-identity-and-authentication.md). ## Kerberos Authentication and Identity diff --git a/docs/framework/wcf/extending/publishing-and-retrieving-metadata-over-a-custom-binding.md b/docs/framework/wcf/extending/publishing-and-retrieving-metadata-over-a-custom-binding.md index 5870b5739f77f..38ee07529c796 100644 --- a/docs/framework/wcf/extending/publishing-and-retrieving-metadata-over-a-custom-binding.md +++ b/docs/framework/wcf/extending/publishing-and-retrieving-metadata-over-a-custom-binding.md @@ -24,7 +24,7 @@ The endpoint to require authentication and encryption. The sample [Custom Secure Metadata Endpoint](../samples/custom-secure-metadata-endpoint.md) demonstrates this scenario. + When publishing metadata over a custom binding, ensure that the binding provides the security support that your metadata requires. For example, to prevent information disclosure and ensure your client has the right to obtain the metadata, you can make your metadata and your application more secure by configuring your endpoint to require authentication and encryption. The sample [Custom Secure Metadata Endpoint](/previous-versions/dotnet/framework/wcf/samples/custom-secure-metadata-endpoint) demonstrates this scenario. ## See also diff --git a/docs/framework/wcf/extending/service-channel-listeners-and-channels.md b/docs/framework/wcf/extending/service-channel-listeners-and-channels.md index 1ecc02825207c..75ab25412746a 100644 --- a/docs/framework/wcf/extending/service-channel-listeners-and-channels.md +++ b/docs/framework/wcf/extending/service-channel-listeners-and-channels.md @@ -30,7 +30,7 @@ WCF provides base class helpers for this process. For a diagram of the channel h - The class implements . It takes care of basic state management. -The following discussion is based upon the [Transport: UDP](../samples/transport-udp.md) sample. +The following discussion is based upon the [Transport: UDP](/previous-versions/dotnet/framework/wcf/samples/transport-udp) sample. ## Creating a channel listener diff --git a/docs/framework/wcf/extending/specifying-a-custom-crypto-algorithm.md b/docs/framework/wcf/extending/specifying-a-custom-crypto-algorithm.md index 8a73165920409..a22de8c4ef58f 100644 --- a/docs/framework/wcf/extending/specifying-a-custom-crypto-algorithm.md +++ b/docs/framework/wcf/extending/specifying-a-custom-crypto-algorithm.md @@ -122,7 +122,7 @@ WSHttpBinding binding = new WSHttpBinding(); binding.Security.Message.AlgorithmSuite = new MyCustomAlgorithmSuite(); ``` - For a complete code example, see the [Cryptographic Agility in WCF Security](../samples/cryptographic-agility-in-wcf-security.md) sample. + For a complete code example, see the [Cryptographic Agility in WCF Security](/previous-versions/dotnet/framework/wcf/samples/cryptographic-agility-in-wcf-security) sample. ## See also diff --git a/docs/framework/wcf/feature-details/accessing-services-using-a-client.md b/docs/framework/wcf/feature-details/accessing-services-using-a-client.md index 3a3751d90e370..b52b960d83ec0 100644 --- a/docs/framework/wcf/feature-details/accessing-services-using-a-client.md +++ b/docs/framework/wcf/feature-details/accessing-services-using-a-client.md @@ -51,7 +51,7 @@ Client applications must create, configure, and use WCF client or channel object Handling exceptions in client applications is straightforward. If a channel is opened, used, and closed inside a try block, then the conversation has succeeded, unless an exception is thrown. Typically, if an exception is thrown the conversation is aborted. > [!NOTE] -> Use of the `using` statement (`Using` in Visual Basic) is not recommended. This is because the end of the `using` statement can cause exceptions that can mask other exceptions you may need to know about. For more information, see [Use Close and Abort to release WCF client resources](../samples/use-close-abort-release-wcf-client-resources.md). +> Use of the `using` statement (`Using` in Visual Basic) is not recommended. This is because the end of the `using` statement can cause exceptions that can mask other exceptions you may need to know about. For more information, see [Use Close and Abort to release WCF client resources](/previous-versions/dotnet/framework/wcf/samples/use-close-abort-release-wcf-client-resources). The following code example shows the recommended client pattern using a try/catch block and not the `using` statement. @@ -63,7 +63,7 @@ Client applications must create, configure, and use WCF client or channel object Datagram channels never fault even if exceptions occur when they are closed. In addition, non-duplex clients that fail to authenticate using a secure conversation typically throw a . However if the duplex client using a secure conversation fails to authenticate, the client receives a instead. - For more complete information about working with error information at the application level, see [Specifying and Handling Faults in Contracts and Services](../specifying-and-handling-faults-in-contracts-and-services.md). [Expected Exceptions](../samples/expected-exceptions.md) describes expected exceptions and shows how to handle them. For more information about how to handle errors when developing channels, see [Handling Exceptions and Faults](../extending/handling-exceptions-and-faults.md). + For more complete information about working with error information at the application level, see [Specifying and Handling Faults in Contracts and Services](../specifying-and-handling-faults-in-contracts-and-services.md). [Expected Exceptions](/previous-versions/dotnet/framework/wcf/samples/expected-exceptions) describes expected exceptions and shows how to handle them. For more information about how to handle errors when developing channels, see [Handling Exceptions and Faults](../extending/handling-exceptions-and-faults.md). ### Client Blocking and Performance diff --git a/docs/framework/wcf/feature-details/best-practices-for-queued-communication.md b/docs/framework/wcf/feature-details/best-practices-for-queued-communication.md index 98d4966161802..a3b5304ad615d 100644 --- a/docs/framework/wcf/feature-details/best-practices-for-queued-communication.md +++ b/docs/framework/wcf/feature-details/best-practices-for-queued-communication.md @@ -53,9 +53,9 @@ This topic provides recommended practices for queued communication in Windows Co - Transacted batching. Transacted batching ensures that many messages can be read in a single transaction. This optimizes transaction commits, increasing overall performance. The cost of batching is that if a failure occurs in a single message within a batch, then the entire batch is rolled back and the messages must be processed one at a time until it is safe to batch again. In most cases, poison messages are rare, so batching is the preferred way to increase system performance, particularly when you have other resource managers that participate in the transaction. For more information, see [Batching Messages in a Transaction](batching-messages-in-a-transaction.md). -- Concurrency. Concurrency increases throughput, but concurrency also affects contention to shared resources. For more information, see [Concurrency](../samples/concurrency.md). +- Concurrency. Concurrency increases throughput, but concurrency also affects contention to shared resources. For more information, see [Concurrency](/previous-versions/dotnet/framework/wcf/samples/concurrency). -- Throttling. For optimal performance, throttle the number of messages in the dispatcher pipeline. For an example of how to do this, see [Throttling](../samples/throttling.md). +- Throttling. For optimal performance, throttle the number of messages in the dispatcher pipeline. For an example of how to do this, see [Throttling](/previous-versions/dotnet/framework/wcf/samples/throttling). When using batching, be aware that concurrency and throttling translate to concurrent batches. diff --git a/docs/framework/wcf/feature-details/choosing-a-message-encoder.md b/docs/framework/wcf/feature-details/choosing-a-message-encoder.md index 1ea926f44a1f7..fb279c5697f55 100644 --- a/docs/framework/wcf/feature-details/choosing-a-message-encoder.md +++ b/docs/framework/wcf/feature-details/choosing-a-message-encoder.md @@ -30,7 +30,7 @@ This article discusses criteria for choosing among the message encoders that are |Factor|Description|Encoders that support this factor| |------------|-----------------|---------------------------------------| -|Supported Character Sets| and support only the UTF8 and UTF16 Unicode (*big-endian* and *little-endian*) encodings. If other encodings are required, such as UTF7 or ASCII, a custom encoder must be used. For a sample custom encoder, see [Custom Message Encoder](../samples/custom-message-encoder-custom-text-encoder.md).|Text| +|Supported Character Sets| and support only the UTF8 and UTF16 Unicode (*big-endian* and *little-endian*) encodings. If other encodings are required, such as UTF7 or ASCII, a custom encoder must be used. For a sample custom encoder, see [Custom Message Encoder](/previous-versions/dotnet/framework/wcf/samples/custom-message-encoder-custom-text-encoder).|Text| |Inspection|Inspection is the ability to examine messages during transmission. Text encodings, either with or without the use of SOAP, allow messages to be inspected and analyzed by many applications without the use of specialized tools. The use of transfer security, at either the message or transport level, affects your ability to inspect messages. Confidentiality protects a message from being examined and integrity protects a message from being modified.|Text| |Reliability|Reliability is the resiliency of an encoder to transmission errors. Reliability can also be provided at the message, transport, or application layer. All of the standard WCF encoders assume that another layer is providing reliability. The encoder has little ability to recover from a transmission error.|None| |Simplicity|Simplicity represents the ease with which you can create encoders and decoders for an encoding specification. Text encodings are particularly advantageous for simplicity, and the POX text encoding has the additional advantage of not requiring support for processing SOAP.|Text (POX)| diff --git a/docs/framework/wcf/feature-details/clients.md b/docs/framework/wcf/feature-details/clients.md index 5564517fa455e..c74817df9aabe 100644 --- a/docs/framework/wcf/feature-details/clients.md +++ b/docs/framework/wcf/feature-details/clients.md @@ -24,4 +24,4 @@ The topics in this section cover the client architecture, how to access a Window ## See also -- [Client Samples](../samples/client.md) +- [Client Samples](/previous-versions/dotnet/framework/wcf/samples/client) diff --git a/docs/framework/wcf/feature-details/controlling-serialization-and-deserialization-with-serializationbinder.md b/docs/framework/wcf/feature-details/controlling-serialization-and-deserialization-with-serializationbinder.md index eebf6219c62be..b2a7b6d8def3e 100644 --- a/docs/framework/wcf/feature-details/controlling-serialization-and-deserialization-with-serializationbinder.md +++ b/docs/framework/wcf/feature-details/controlling-serialization-and-deserialization-with-serializationbinder.md @@ -9,7 +9,7 @@ ms.assetid: ba8dcecf-acc7-467c-939d-021bbac797d4 > [!WARNING] > is not secure and can ***not*** be made secure. For more information, see the [BinaryFormatter security guide](../../../standard/serialization/binaryformatter-security-guide.md). -During serialization, a formatter transmits the information required to create an instance of an object of the correct type and version. This information generally includes the full type name and assembly name of the object. By default, deserialization uses this information to create an instance of an identical object. Some users may need to control which class to serialize and deserialize, either because the original class may not exist on the machine performing deserialization, the original class has moved between assemblies, or a different version of the class is required on the server and client. For more information, see [Usage of Serialization Binder](../samples/usage-of-serialization-binder.md). +During serialization, a formatter transmits the information required to create an instance of an object of the correct type and version. This information generally includes the full type name and assembly name of the object. By default, deserialization uses this information to create an instance of an identical object. Some users may need to control which class to serialize and deserialize, either because the original class may not exist on the machine performing deserialization, the original class has moved between assemblies, or a different version of the class is required on the server and client. For more information, see [Usage of Serialization Binder](/previous-versions/dotnet/framework/wcf/samples/usage-of-serialization-binder). > [!WARNING] > This functionality is only available when using the or the . @@ -21,4 +21,4 @@ During serialization, a formatter transmits the information required to create a ## See also - [Serialization and Deserialization](serialization-and-deserialization.md) -- [Usage of Serialization Binder](../samples/usage-of-serialization-binder.md) +- [Usage of Serialization Binder](/previous-versions/dotnet/framework/wcf/samples/usage-of-serialization-binder) diff --git a/docs/framework/wcf/feature-details/creating-a-custom-header-that-is-signed-and-or-encrypted.md b/docs/framework/wcf/feature-details/creating-a-custom-header-that-is-signed-and-or-encrypted.md index 5742abf24671c..fb62328271ff1 100644 --- a/docs/framework/wcf/feature-details/creating-a-custom-header-that-is-signed-and-or-encrypted.md +++ b/docs/framework/wcf/feature-details/creating-a-custom-header-that-is-signed-and-or-encrypted.md @@ -55,6 +55,6 @@ public class MyMessageContract ## See also -- [Default Message Contract](../samples/default-message-contract.md) -- [Message Contracts](../samples/message-contracts.md) +- [Default Message Contract](/previous-versions/dotnet/framework/wcf/samples/default-message-contract) +- [Message Contracts](/previous-versions/dotnet/framework/wcf/samples/message-contracts) - [Using Message Contracts](using-message-contracts.md) diff --git a/docs/framework/wcf/feature-details/creating-wcf-ajax-services-without-aspnet.md b/docs/framework/wcf/feature-details/creating-wcf-ajax-services-without-aspnet.md index 14df2652b7497..e580caebd169b 100644 --- a/docs/framework/wcf/feature-details/creating-wcf-ajax-services-without-aspnet.md +++ b/docs/framework/wcf/feature-details/creating-wcf-ajax-services-without-aspnet.md @@ -56,7 +56,7 @@ Windows Communication Foundation (WCF) AJAX services can be accessed from any Ja ``` - For a working example, see the [AJAX Service with JSON and XML](../samples/ajax-service-with-json-and-xml-sample.md). + For a working example, see the [AJAX Service with JSON and XML](/previous-versions/dotnet/framework/wcf/samples/ajax-service-with-json-and-xml-sample). ## Creating an AJAX-Compatible Service Contract @@ -107,4 +107,4 @@ string[] GetCities(string firstLetters, int maxNumber); HTTP GET requests contain all the request parameters in the URL itself. - It is up to the user to decide how to create the HTTP request to the endpoint. Also, the user has full control over constructing the JSON that forms the body of the request. For an example of creating a request from JavaScript, see the [AJAX Service with JSON and XML](../samples/ajax-service-with-json-and-xml-sample.md). + It is up to the user to decide how to create the HTTP request to the endpoint. Also, the user has full control over constructing the JSON that forms the body of the request. For an example of creating a request from JavaScript, see the [AJAX Service with JSON and XML](/previous-versions/dotnet/framework/wcf/samples/ajax-service-with-json-and-xml-sample). diff --git a/docs/framework/wcf/feature-details/creating-wcf-services-for-aspnet-ajax.md b/docs/framework/wcf/feature-details/creating-wcf-services-for-aspnet-ajax.md index e66b434ebd3ff..a4be24b357d8a 100644 --- a/docs/framework/wcf/feature-details/creating-wcf-services-for-aspnet-ajax.md +++ b/docs/framework/wcf/feature-details/creating-wcf-services-for-aspnet-ajax.md @@ -51,7 +51,7 @@ The Web Programming Model described in the [WCF Web HTTP Programming Model Overv - To take advantage of ASP.NET features, for example, URL-based authentication and accessing the ASP.NET session information, you may want to enable the ASP.NET Compatibility Mode through configuration. -AJAX endpoints in WCF may even be consumed without the ASP.NET AJAX framework. Doing so requires an understanding of the support architecture of AJAX support in WCF. For a discussion of this architecture, see [WCF Web HTTP Programming Object Model](wcf-web-http-programming-object-model.md). For a code sample demonstrating this approach, see the [AJAX Service with JSON and XML](../samples/ajax-service-with-json-and-xml-sample.md). +AJAX endpoints in WCF may even be consumed without the ASP.NET AJAX framework. Doing so requires an understanding of the support architecture of AJAX support in WCF. For a discussion of this architecture, see [WCF Web HTTP Programming Object Model](wcf-web-http-programming-object-model.md). For a code sample demonstrating this approach, see the [AJAX Service with JSON and XML](/previous-versions/dotnet/framework/wcf/samples/ajax-service-with-json-and-xml-sample). ## See also diff --git a/docs/framework/wcf/feature-details/data-contract-known-types.md b/docs/framework/wcf/feature-details/data-contract-known-types.md index 23ecc31649a46..e9f3c47060498 100644 --- a/docs/framework/wcf/feature-details/data-contract-known-types.md +++ b/docs/framework/wcf/feature-details/data-contract-known-types.md @@ -13,7 +13,7 @@ ms.assetid: 1a0baea1-27b7-470d-9136-5bbad86c4337 --- # Data Contract Known Types -The class allows you to specify, in advance, the types that should be included for consideration during deserialization. For a working example, see the [Known Types](../samples/known-types.md) example. +The class allows you to specify, in advance, the types that should be included for consideration during deserialization. For a working example, see the [Known Types](/previous-versions/dotnet/framework/wcf/samples/known-types) example. Normally, when passing parameters and return values between a client and a service, both endpoints share all of the data contracts of the data to be transmitted. However, this is not the case in the following circumstances: @@ -180,6 +180,6 @@ The class allows you to s - - - -- [Known Types](../samples/known-types.md) +- [Known Types](/previous-versions/dotnet/framework/wcf/samples/known-types) - [Data Contract Equivalence](data-contract-equivalence.md) - [Designing Service Contracts](../designing-service-contracts.md) diff --git a/docs/framework/wcf/feature-details/delegation-and-impersonation-with-wcf.md b/docs/framework/wcf/feature-details/delegation-and-impersonation-with-wcf.md index 540ab78262224..f33af228c6748 100644 --- a/docs/framework/wcf/feature-details/delegation-and-impersonation-with-wcf.md +++ b/docs/framework/wcf/feature-details/delegation-and-impersonation-with-wcf.md @@ -12,7 +12,7 @@ ms.assetid: 110e60f7-5b03-4b69-b667-31721b8e3152 --- # Delegation and Impersonation with WCF -*Impersonation* is a common technique that services use to restrict client access to a service domain's resources. Service domain resources can either be machine resources, such as local files (impersonation), or a resource on another machine, such as a file share (delegation). For a sample application, see [Impersonating the Client](../samples/impersonating-the-client.md). For an example of how to use impersonation, see [How to: Impersonate a Client on a Service](../how-to-impersonate-a-client-on-a-service.md). +*Impersonation* is a common technique that services use to restrict client access to a service domain's resources. Service domain resources can either be machine resources, such as local files (impersonation), or a resource on another machine, such as a file share (delegation). For a sample application, see [Impersonating the Client](/previous-versions/dotnet/framework/wcf/samples/impersonating-the-client). For an example of how to use impersonation, see [How to: Impersonate a Client on a Service](../how-to-impersonate-a-client-on-a-service.md). > [!IMPORTANT] > Be aware that when impersonating a client on a service, the service runs with the client's credentials, which may have higher privileges than the server process. @@ -226,6 +226,6 @@ sh.Credentials.ClientCertificate.Authentication.MapClientCertificateToWindowsAcc - - - [Using Impersonation with Transport Security](using-impersonation-with-transport-security.md) -- [Impersonating the Client](../samples/impersonating-the-client.md) +- [Impersonating the Client](/previous-versions/dotnet/framework/wcf/samples/impersonating-the-client) - [How to: Impersonate a Client on a Service](../how-to-impersonate-a-client-on-a-service.md) - [ServiceModel Metadata Utility Tool (Svcutil.exe)](../servicemodel-metadata-utility-tool-svcutil-exe.md) diff --git a/docs/framework/wcf/feature-details/discovery-find-and-findcriteria.md b/docs/framework/wcf/feature-details/discovery-find-and-findcriteria.md index f82f91eb490a9..e5cbcd85dcd94 100644 --- a/docs/framework/wcf/feature-details/discovery-find-and-findcriteria.md +++ b/docs/framework/wcf/feature-details/discovery-find-and-findcriteria.md @@ -67,5 +67,5 @@ Console.WriteLine("Found {0} ICalculatorService endpoint(s).", findResponse.Endp - [WCF Discovery Overview](wcf-discovery-overview.md) - [Using the Discovery Client Channel](using-the-discovery-client-channel.md) -- [Discovery with Scopes](../samples/discovery-with-scopes-sample.md) -- [Basic](../samples/basic-sample.md) +- [Discovery with Scopes](/previous-versions/dotnet/framework/wcf/samples/discovery-with-scopes-sample) +- [Basic](/previous-versions/dotnet/framework/wcf/samples/basic-sample) diff --git a/docs/framework/wcf/feature-details/discoveryclient-and-dynamicendpoint.md b/docs/framework/wcf/feature-details/discoveryclient-and-dynamicendpoint.md index b91541ccc6302..645168759e4e8 100644 --- a/docs/framework/wcf/feature-details/discoveryclient-and-dynamicendpoint.md +++ b/docs/framework/wcf/feature-details/discoveryclient-and-dynamicendpoint.md @@ -105,5 +105,5 @@ Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result); ## See also -- [Discovery with Scopes](../samples/discovery-with-scopes-sample.md) -- [Basic](../samples/basic-sample.md) +- [Discovery with Scopes](/previous-versions/dotnet/framework/wcf/samples/discovery-with-scopes-sample) +- [Basic](/previous-versions/dotnet/framework/wcf/samples/basic-sample) diff --git a/docs/framework/wcf/feature-details/duplex-services.md b/docs/framework/wcf/feature-details/duplex-services.md index 01c32b104e66d..436680d267187 100644 --- a/docs/framework/wcf/feature-details/duplex-services.md +++ b/docs/framework/wcf/feature-details/duplex-services.md @@ -86,6 +86,6 @@ The following sample code shows how to specify the client endpoint address in co ## See also -- [Duplex](../samples/duplex.md) +- [Duplex](/previous-versions/dotnet/framework/wcf/samples/duplex) - [Specifying Client Run-Time Behavior](../specifying-client-run-time-behavior.md) - [How to: Create a Channel Factory and Use it to Create and Manage Channels](how-to-create-a-channel-factory-and-use-it-to-create-and-manage-channels.md) diff --git a/docs/framework/wcf/feature-details/federation.md b/docs/framework/wcf/feature-details/federation.md index 8f56cada7f52a..d0fd063c83ce2 100644 --- a/docs/framework/wcf/feature-details/federation.md +++ b/docs/framework/wcf/feature-details/federation.md @@ -12,7 +12,7 @@ ms.assetid: 2f1e646f-8361-48d4-9d5d-1b961f31ede4 --- # Federation -This topic provides a brief overview of the concept of federated security. It also describes Windows Communication Foundation (WCF) support for deploying federated security architectures. For a sample application that demonstrates federation, see [Federation Sample](../samples/federation-sample.md). +This topic provides a brief overview of the concept of federated security. It also describes Windows Communication Foundation (WCF) support for deploying federated security architectures. For a sample application that demonstrates federation, see [Federation Sample](/previous-versions/dotnet/framework/wcf/samples/federation-sample). ## Definition of Federated Security diff --git a/docs/framework/wcf/feature-details/grouping-queued-messages-in-a-session.md b/docs/framework/wcf/feature-details/grouping-queued-messages-in-a-session.md index 94903ecc21255..0f77808d1a6ed 100644 --- a/docs/framework/wcf/feature-details/grouping-queued-messages-in-a-session.md +++ b/docs/framework/wcf/feature-details/grouping-queued-messages-in-a-session.md @@ -83,5 +83,5 @@ Windows Communication Foundation (WCF) provides a session that allows you to gro ## See also -- [Sessions and Queues](../samples/sessions-and-queues.md) +- [Sessions and Queues](/previous-versions/dotnet/framework/wcf/samples/sessions-and-queues) - [Queues Overview](queues-overview.md) diff --git a/docs/framework/wcf/feature-details/hosting-in-a-managed-application.md b/docs/framework/wcf/feature-details/hosting-in-a-managed-application.md index 1d17f87ea73e9..190789576845e 100644 --- a/docs/framework/wcf/feature-details/hosting-in-a-managed-application.md +++ b/docs/framework/wcf/feature-details/hosting-in-a-managed-application.md @@ -10,7 +10,7 @@ Windows Communication Foundation (WCF) services can be hosted in any .NET Framew To create a self-hosted service, create and open an instance of the , which starts a service listening for messages. For more information, see [How to: Host a WCF Service in a Managed Application](../how-to-host-a-wcf-service-in-a-managed-application.md). - For a complete example on how to define a contract, implement the contract, and host a service inside of a managed application see the [Getting Started Tutorial](../getting-started-tutorial.md) and the [Self-Host](../samples/self-host.md). + For a complete example on how to define a contract, implement the contract, and host a service inside of a managed application see the [Getting Started Tutorial](../getting-started-tutorial.md) and the [Self-Host](/previous-versions/dotnet/framework/wcf/samples/self-host). The following sections describe common scenarios that use this hosting option. diff --git a/docs/framework/wcf/feature-details/hosting-in-a-windows-service-application.md b/docs/framework/wcf/feature-details/hosting-in-a-windows-service-application.md index c4d0ef663d7a4..b30ab804f045a 100644 --- a/docs/framework/wcf/feature-details/hosting-in-a-windows-service-application.md +++ b/docs/framework/wcf/feature-details/hosting-in-a-windows-service-application.md @@ -37,6 +37,6 @@ Windows services (formerly known as Windows NT services) provide a process model - - [Walkthrough: Creating a Windows Service Application in the Component Designer](https://go.microsoft.com/fwlink/?LinkId=94875) - [How to: Host a WCF Service in a Managed Windows Service](how-to-host-a-wcf-service-in-a-managed-windows-service.md) -- [Windows Service Host](../samples/windows-service-host.md) +- [Windows Service Host](/previous-versions/dotnet/framework/wcf/samples/windows-service-host) - [Service Application Programming Architecture](https://go.microsoft.com/fwlink/?LinkId=94876) - [Windows Server App Fabric Hosting Features](/previous-versions/appfabric/ee677189(v=azure.10)) diff --git a/docs/framework/wcf/feature-details/how-to-access-a-wse-3-0-service-with-a-wcf-client.md b/docs/framework/wcf/feature-details/how-to-access-a-wse-3-0-service-with-a-wcf-client.md index 1c96dc4d69732..7d51098fb7007 100644 --- a/docs/framework/wcf/feature-details/how-to-access-a-wse-3-0-service-with-a-wcf-client.md +++ b/docs/framework/wcf/feature-details/how-to-access-a-wse-3-0-service-with-a-wcf-client.md @@ -11,7 +11,7 @@ ms.assetid: 1f9bcd9b-8f8f-47fa-8f1e-0d47236eb800 Windows Communication Foundation (WCF) clients are wire-level compatible with Web Services Enhancements (WSE) 3.0 for Microsoft .NET services when WCF clients are configured to use the August 2004 version of the WS-Addressing specification. However, WSE 3.0 services do not support the metadata exchange (MEX) protocol, so when you use the [ServiceModel Metadata Utility Tool (Svcutil.exe)](../servicemodel-metadata-utility-tool-svcutil-exe.md) to create a WCF client class, the security settings are not applied to the generated WCF client. Therefore, you must specify the security settings that the WSE 3.0 service requires after the WCF client is generated. - You can apply these security settings by using a custom binding to take into account the WSE 3.0 service's requirements and the interoperable requirements between a WSE 3.0 service and a WCF client. These interoperability requirements include the aforementioned use of the August 2004 WS-Addressing specification and the WSE 3.0default message protection of . The default message protection for WCF is . This topic details how to create a WCF binding that interoperates with a WSE 3.0 service. WCF also provides a sample that incorporates this binding. For more information about this sample, see [Interoperating with ASMX Web Services](../samples/interoperating-with-asmx-web-services.md). + You can apply these security settings by using a custom binding to take into account the WSE 3.0 service's requirements and the interoperable requirements between a WSE 3.0 service and a WCF client. These interoperability requirements include the aforementioned use of the August 2004 WS-Addressing specification and the WSE 3.0default message protection of . The default message protection for WCF is . This topic details how to create a WCF binding that interoperates with a WSE 3.0 service. WCF also provides a sample that incorporates this binding. For more information about this sample, see [Interoperating with ASMX Web Services](/previous-versions/dotnet/framework/wcf/samples/interoperating-with-asmx-web-services). ### To access a WSE 3.0 Web service with a WCF client diff --git a/docs/framework/wcf/feature-details/how-to-add-an-aspnet-ajax-endpoint-without-using-configuration.md b/docs/framework/wcf/feature-details/how-to-add-an-aspnet-ajax-endpoint-without-using-configuration.md index 28c82536f9628..c34905bd5eae9 100644 --- a/docs/framework/wcf/feature-details/how-to-add-an-aspnet-ajax-endpoint-without-using-configuration.md +++ b/docs/framework/wcf/feature-details/how-to-add-an-aspnet-ajax-endpoint-without-using-configuration.md @@ -10,7 +10,7 @@ Windows Communication Foundation (WCF) allows you to create a service that expos To create services with ASP.NET AJAX endpoints without configuration, the services must be hosted by Internet Information Services (IIS). To activate an ASP.NET AJAX endpoint using this approach, specify the as the Factory parameter in the [\@ServiceHost](../../configure-apps/file-schema/wcf-directive/servicehost.md) directive in the .svc file. This custom factory is the component that automatically configures an ASP.NET AJAX endpoint so that it can be called from JavaScript on a client Web site. - For a working example, see the [AJAX Service Without Configuration](../samples/ajax-service-without-configuration.md). + For a working example, see the [AJAX Service Without Configuration](/previous-versions/dotnet/framework/wcf/samples/ajax-service-without-configuration). For an outline of how to configure an ASP.NET AJAX endpoint using configuration elements, see [How to: Use Configuration to Add an ASP.NET AJAX Endpoint](how-to-use-configuration-to-add-an-aspnet-ajax-endpoint.md). @@ -70,7 +70,7 @@ Windows Communication Foundation (WCF) allows you to create a service that expos ### To call the service -1. The endpoint is configured at an empty address relative to the .svc file, so the service is now available and can be invoked by sending requests to service.svc/\ - for example, service.svc/Add for the `Add` operation. You can use it by entering the service URL into the Scripts collection of the ASP.NET AJAX Script Manager control. For an example, see the [AJAX Service Without Configuration](../samples/ajax-service-without-configuration.md). +1. The endpoint is configured at an empty address relative to the .svc file, so the service is now available and can be invoked by sending requests to service.svc/\ - for example, service.svc/Add for the `Add` operation. You can use it by entering the service URL into the Scripts collection of the ASP.NET AJAX Script Manager control. For an example, see the [AJAX Service Without Configuration](/previous-versions/dotnet/framework/wcf/samples/ajax-service-without-configuration). ## Example diff --git a/docs/framework/wcf/feature-details/how-to-authenticate-with-a-user-name-and-password.md b/docs/framework/wcf/feature-details/how-to-authenticate-with-a-user-name-and-password.md index 076f73c3497f9..8f742924985f8 100644 --- a/docs/framework/wcf/feature-details/how-to-authenticate-with-a-user-name-and-password.md +++ b/docs/framework/wcf/feature-details/how-to-authenticate-with-a-user-name-and-password.md @@ -8,7 +8,7 @@ ms.assetid: a5415be2-0ef3-464c-9f76-c255cb8165a4 --- # How to: Authenticate with a User Name and Password -This topic demonstrates how to enable a Windows Communication Foundation (WCF) service to authenticate a client with a Windows domain username and password. It assumes you have a working, self-hosted WCF service. For an example of creating a basic self-hosted WCF service see, [Getting Started Tutorial](../getting-started-tutorial.md). This topic assumes the service is configured in code. If you would like to see an example of configuring a similar service using a configuration file, see [Message Security User Name](../samples/message-security-user-name.md). +This topic demonstrates how to enable a Windows Communication Foundation (WCF) service to authenticate a client with a Windows domain username and password. It assumes you have a working, self-hosted WCF service. For an example of creating a basic self-hosted WCF service see, [Getting Started Tutorial](../getting-started-tutorial.md). This topic assumes the service is configured in code. If you would like to see an example of configuring a similar service using a configuration file, see [Message Security User Name](/previous-versions/dotnet/framework/wcf/samples/message-security-user-name). To configure a service to authenticate its clients using Windows Domain username and passwords use the and set its `Security.Mode` property to `Message`. In addition you must specify an X509 certificate that will be used to encrypt the username and password as they are sent from the client to the service. @@ -27,7 +27,7 @@ On the client, you must prompt the user for the username and password and specif // ... ``` -2. Specify the server certificate used to encrypt the username and password information sent over the wire. This code should immediately follow the code above. The following example uses the certificate that is created by the setup.bat file from the [Message Security User Name](../samples/message-security-user-name.md) sample: +2. Specify the server certificate used to encrypt the username and password information sent over the wire. This code should immediately follow the code above. The following example uses the certificate that is created by the setup.bat file from the [Message Security User Name](/previous-versions/dotnet/framework/wcf/samples/message-security-user-name) sample: ```csharp // ... diff --git a/docs/framework/wcf/feature-details/how-to-configure-an-iis-hosted-wcf-service-with-ssl.md b/docs/framework/wcf/feature-details/how-to-configure-an-iis-hosted-wcf-service-with-ssl.md index cf9fb5587ee29..10be0393574c8 100644 --- a/docs/framework/wcf/feature-details/how-to-configure-an-iis-hosted-wcf-service-with-ssl.md +++ b/docs/framework/wcf/feature-details/how-to-configure-an-iis-hosted-wcf-service-with-ssl.md @@ -144,6 +144,6 @@ This topic describes how to set up an IIS-hosted WCF service to use HTTP transpo ## See also - [Hosting in Internet Information Services](hosting-in-internet-information-services.md) -- [Internet Information Service Hosting Instructions](../samples/internet-information-service-hosting-instructions.md) +- [Internet Information Service Hosting Instructions](/previous-versions/dotnet/framework/wcf/samples/internet-information-service-hosting-instructions) - [Internet Information Services Hosting Best Practices](internet-information-services-hosting-best-practices.md) -- [IIS Hosting Using Inline Code](../samples/iis-hosting-using-inline-code.md) +- [IIS Hosting Using Inline Code](/previous-versions/dotnet/framework/wcf/samples/iis-hosting-using-inline-code) diff --git a/docs/framework/wcf/feature-details/how-to-configure-credentials-on-a-federation-service.md b/docs/framework/wcf/feature-details/how-to-configure-credentials-on-a-federation-service.md index cfb884509e51e..addefaa1e65c2 100644 --- a/docs/framework/wcf/feature-details/how-to-configure-credentials-on-a-federation-service.md +++ b/docs/framework/wcf/feature-details/how-to-configure-credentials-on-a-federation-service.md @@ -72,7 +72,7 @@ In Windows Communication Foundation (WCF), creating a federated service consists - [Federation](federation.md) - [Federation and Trust](federation-and-trust.md) -- [Federation Sample](../samples/federation-sample.md) +- [Federation Sample](/previous-versions/dotnet/framework/wcf/samples/federation-sample) - [How to: Disable Secure Sessions on a WSFederationHttpBinding](how-to-disable-secure-sessions-on-a-wsfederationhttpbinding.md) - [How to: Create a WSFederationHttpBinding](how-to-create-a-wsfederationhttpbinding.md) - [How to: Create a Federated Client](how-to-create-a-federated-client.md) diff --git a/docs/framework/wcf/feature-details/how-to-configure-tracking-with-workflowservicehost.md b/docs/framework/wcf/feature-details/how-to-configure-tracking-with-workflowservicehost.md index 6f6873da1316b..ca570c4310e1d 100644 --- a/docs/framework/wcf/feature-details/how-to-configure-tracking-with-workflowservicehost.md +++ b/docs/framework/wcf/feature-details/how-to-configure-tracking-with-workflowservicehost.md @@ -66,6 +66,6 @@ This topic explains how to configure tracking for a [!INCLUDE[netfx_current_long ## See also -- [Simplified Configuration for WCF Services](../samples/simplified-configuration-for-wcf-services.md) +- [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services) - [Workflow Services](workflow-services.md) - [Tracking Profiles](../../windows-workflow-foundation/tracking-profiles.md) diff --git a/docs/framework/wcf/feature-details/how-to-control-service-instancing.md b/docs/framework/wcf/feature-details/how-to-control-service-instancing.md index ea841a9dec4a4..88475c6ef7118 100644 --- a/docs/framework/wcf/feature-details/how-to-control-service-instancing.md +++ b/docs/framework/wcf/feature-details/how-to-control-service-instancing.md @@ -9,7 +9,7 @@ ms.assetid: e0b12b34-8004-443a-a46d-83a5c00f2601 --- # How to: Control Service Instancing -Setting the instance mode of a service enables you to specify when a (and its associated user-defined service object) is created. See the enumeration for the possible modes. For more information about behaviors, see [Configuring and Extending the Runtime with Behaviors](../extending/configuring-and-extending-the-runtime-with-behaviors.md). For working examples, see [Behaviors](../samples/behaviors.md). +Setting the instance mode of a service enables you to specify when a (and its associated user-defined service object) is created. See the enumeration for the possible modes. For more information about behaviors, see [Configuring and Extending the Runtime with Behaviors](../extending/configuring-and-extending-the-runtime-with-behaviors.md). For working examples, see [Behaviors](/previous-versions/dotnet/framework/wcf/samples/behaviors). ### To control the service instance lifetime using code @@ -32,4 +32,4 @@ Setting the instance mode of a service enables you to specify when a - - -- [Service: Behaviors Samples](../samples/behaviors.md) +- [Service: Behaviors Samples](/previous-versions/dotnet/framework/wcf/samples/behaviors) diff --git a/docs/framework/wcf/feature-details/how-to-create-a-basic-data-contract-for-a-class-or-structure.md b/docs/framework/wcf/feature-details/how-to-create-a-basic-data-contract-for-a-class-or-structure.md index 889f7389db188..0054c87db6561 100644 --- a/docs/framework/wcf/feature-details/how-to-create-a-basic-data-contract-for-a-class-or-structure.md +++ b/docs/framework/wcf/feature-details/how-to-create-a-basic-data-contract-for-a-class-or-structure.md @@ -15,7 +15,7 @@ ms.assetid: bc464889-3070-4a2f-91d2-e788a0f686a7 This topic shows the basic steps to create a data contract using a class or structure. For more information about data contracts and how they are used, see [Using Data Contracts](using-data-contracts.md). - For a tutorial that walks through the steps of creating a basic Windows Communication Foundation (WCF) service and client, see the [Getting Started Tutorial](../getting-started-tutorial.md). For a working sample application that consists of a basic service and client, see [Basic Data Contract](../samples/basic-data-contract.md). + For a tutorial that walks through the steps of creating a basic Windows Communication Foundation (WCF) service and client, see the [Getting Started Tutorial](../getting-started-tutorial.md). For a working sample application that consists of a basic service and client, see [Basic Data Contract](/previous-versions/dotnet/framework/wcf/samples/basic-data-contract). ### To create a basic data contract for a class or structure @@ -39,4 +39,4 @@ This topic shows the basic steps to create a data contract using a class or stru - - [Using Data Contracts](using-data-contracts.md) - [Getting Started Tutorial](../getting-started-tutorial.md) -- [Getting Started](../samples/getting-started-sample.md) +- [Getting Started](/previous-versions/dotnet/framework/wcf/samples/getting-started-sample) diff --git a/docs/framework/wcf/feature-details/how-to-create-a-custom-reliable-session-binding-with-https.md b/docs/framework/wcf/feature-details/how-to-create-a-custom-reliable-session-binding-with-https.md index ecb50810f8f31..05fed7896491a 100644 --- a/docs/framework/wcf/feature-details/how-to-create-a-custom-reliable-session-binding-with-https.md +++ b/docs/framework/wcf/feature-details/how-to-create-a-custom-reliable-session-binding-with-https.md @@ -11,7 +11,7 @@ This topic demonstrates the use of Secure Sockets Layer (SSL) transport security The key part of this procedure is that the **\** configuration element contain a `bindingConfiguration` attribute that references a custom binding configuration named `reliableSessionOverHttps`. The [**\**](../../configure-apps/file-schema/wcf/bindings.md) configuration element references this name to specify that a reliable session and the HTTPS transport are used by including **\** and **\** elements. -For the source copy of this example, see [Custom Binding Reliable Session over HTTPS](../samples/custom-binding-reliable-session-over-https.md). +For the source copy of this example, see [Custom Binding Reliable Session over HTTPS](/previous-versions/dotnet/framework/wcf/samples/custom-binding-reliable-session-over-https). ### Configure the service with a CustomBinding to use a reliable session with HTTPS diff --git a/docs/framework/wcf/feature-details/how-to-create-a-duplex-contract.md b/docs/framework/wcf/feature-details/how-to-create-a-duplex-contract.md index 3f83554c6b328..8ed57502242fc 100644 --- a/docs/framework/wcf/feature-details/how-to-create-a-duplex-contract.md +++ b/docs/framework/wcf/feature-details/how-to-create-a-duplex-contract.md @@ -11,7 +11,7 @@ ms.assetid: 500a75b6-998a-47d5-8e3b-24e3aba2a434 --- # How to: Create a Duplex Contract -This topic shows the basic steps to create methods that use a duplex (two-way) contract. A duplex contract allows clients and servers to communicate with each other independently so that either can initiate calls to the other. The duplex contract is one of three message patterns available to Windows Communication Foundation (WCF) services. The other two message patterns are one-way and request-reply. A duplex contract consists of two one-way contracts between the client and the server and does not require that the method calls be correlated. Use this kind of contract when your service must query the client for more information or explicitly raise events on the client. For more information about creating a client application for a duplex contract, see [How to: Access Services with a Duplex Contract](how-to-access-services-with-a-duplex-contract.md). For a working sample, see the [Duplex](../samples/duplex.md) sample. +This topic shows the basic steps to create methods that use a duplex (two-way) contract. A duplex contract allows clients and servers to communicate with each other independently so that either can initiate calls to the other. The duplex contract is one of three message patterns available to Windows Communication Foundation (WCF) services. The other two message patterns are one-way and request-reply. A duplex contract consists of two one-way contracts between the client and the server and does not require that the method calls be correlated. Use this kind of contract when your service must query the client for more information or explicitly raise events on the client. For more information about creating a client application for a duplex contract, see [How to: Access Services with a Duplex Contract](how-to-access-services-with-a-duplex-contract.md). For a working sample, see the [Duplex](/previous-versions/dotnet/framework/wcf/samples/duplex) sample. ### To create a duplex contract @@ -69,7 +69,7 @@ This topic shows the basic steps to create methods that use a duplex (two-way) c - - - [How to: Access Services with a Duplex Contract](how-to-access-services-with-a-duplex-contract.md) -- [Duplex](../samples/duplex.md) +- [Duplex](/previous-versions/dotnet/framework/wcf/samples/duplex) - [Designing and Implementing Services](../designing-and-implementing-services.md) - [How to: Define a Service Contract](../how-to-define-a-wcf-service-contract.md) -- [Session](../samples/session.md) +- [Session](/previous-versions/dotnet/framework/wcf/samples/session) diff --git a/docs/framework/wcf/feature-details/how-to-create-a-federated-client.md b/docs/framework/wcf/feature-details/how-to-create-a-federated-client.md index 38be02de5050d..56b419993a883 100644 --- a/docs/framework/wcf/feature-details/how-to-create-a-federated-client.md +++ b/docs/framework/wcf/feature-details/how-to-create-a-federated-client.md @@ -162,7 +162,7 @@ In Windows Communication Foundation (WCF), creating a client for a *federated se ## See also -- [Federation Sample](../samples/federation-sample.md) +- [Federation Sample](/previous-versions/dotnet/framework/wcf/samples/federation-sample) - [How to: Disable Secure Sessions on a WSFederationHttpBinding](how-to-disable-secure-sessions-on-a-wsfederationhttpbinding.md) - [How to: Create a WSFederationHttpBinding](how-to-create-a-wsfederationhttpbinding.md) - [How to: Configure Credentials on a Federation Service](how-to-configure-credentials-on-a-federation-service.md) diff --git a/docs/framework/wcf/feature-details/how-to-create-a-one-way-contract.md b/docs/framework/wcf/feature-details/how-to-create-a-one-way-contract.md index 4716bc870603f..3d91887119466 100644 --- a/docs/framework/wcf/feature-details/how-to-create-a-one-way-contract.md +++ b/docs/framework/wcf/feature-details/how-to-create-a-one-way-contract.md @@ -11,7 +11,7 @@ ms.assetid: 85084cd9-31cc-4e95-b667-42ef01336622 This topic shows the basic steps to create methods that use a one-way contract. Such methods invoke operations on a Windows Communication Foundation (WCF) service from a client but do not expect a reply. This type of contract can be used, for example, to publish notifications to many subscribers. You can also use one-way contracts when creating a duplex (two-way) contract, which allows clients and servers to communicate with each other independently so that either can initiate calls to the other. This can allow, in particular, the server to make one-way calls to the client that the client can treat as events. For detailed information about specifying one-way methods, see the property and the class. - For more information about creating a client application for a duplex contract, see [How to: Access Services with One-Way and Request-Reply Contracts](how-to-access-wcf-services-with-one-way-and-request-reply-contracts.md). For a working sample, see the [One-Way](../samples/one-way.md) sample. + For more information about creating a client application for a duplex contract, see [How to: Access Services with One-Way and Request-Reply Contracts](how-to-access-wcf-services-with-one-way-and-request-reply-contracts.md). For a working sample, see the [One-Way](/previous-versions/dotnet/framework/wcf/samples/one-way) sample. ### To create a one-way contract @@ -34,5 +34,5 @@ This topic shows the basic steps to create methods that use a one-way contract. - - [Designing and Implementing Services](../designing-and-implementing-services.md) - [How to: Define a Service Contract](../how-to-define-a-wcf-service-contract.md) -- [Session](../samples/session.md) +- [Session](/previous-versions/dotnet/framework/wcf/samples/session) - [How to: Create a Duplex Contract](how-to-create-a-duplex-contract.md) diff --git a/docs/framework/wcf/feature-details/how-to-create-a-security-token-service.md b/docs/framework/wcf/feature-details/how-to-create-a-security-token-service.md index bb3035aeb6481..7eb26d725d366 100644 --- a/docs/framework/wcf/feature-details/how-to-create-a-security-token-service.md +++ b/docs/framework/wcf/feature-details/how-to-create-a-security-token-service.md @@ -98,7 +98,7 @@ A security token service implements the protocol defined in the WS-Trust specifi [!code-csharp[c_CreateSTS#4](../../../../samples/snippets/csharp/VS_Snippets_CFX/c_creatests/cs/source.cs#4)] [!code-vb[c_CreateSTS#4](../../../../samples/snippets/visualbasic/VS_Snippets_CFX/c_creatests/vb/source.vb#4)] - For more information, see [Federation Sample](../samples/federation-sample.md). + For more information, see [Federation Sample](/previous-versions/dotnet/framework/wcf/samples/federation-sample). ## Creating Response Messages @@ -112,7 +112,7 @@ A security token service implements the protocol defined in the WS-Trust specifi [!code-csharp[c_CreateSTS#6](../../../../samples/snippets/csharp/VS_Snippets_CFX/c_creatests/cs/source.cs#6)] [!code-vb[c_CreateSTS#6](../../../../samples/snippets/visualbasic/VS_Snippets_CFX/c_creatests/vb/source.vb#6)] - For more information about how to construct the proof token when the client and the security token service both provide key material for the shared key, see [Federation Sample](../samples/federation-sample.md). + For more information about how to construct the proof token when the client and the security token service both provide key material for the shared key, see [Federation Sample](/previous-versions/dotnet/framework/wcf/samples/federation-sample). The issued token references are constructed by creating instances of the class. @@ -123,7 +123,7 @@ A security token service implements the protocol defined in the WS-Trust specifi ## Example - For full code for a security token service, see [Federation Sample](../samples/federation-sample.md). + For full code for a security token service, see [Federation Sample](/previous-versions/dotnet/framework/wcf/samples/federation-sample). ## See also @@ -134,4 +134,4 @@ A security token service implements the protocol defined in the WS-Trust specifi - - - -- [Federation Sample](../samples/federation-sample.md) +- [Federation Sample](/previous-versions/dotnet/framework/wcf/samples/federation-sample) diff --git a/docs/framework/wcf/feature-details/how-to-create-a-service-endpoint-in-code.md b/docs/framework/wcf/feature-details/how-to-create-a-service-endpoint-in-code.md index 0ed95235b29cb..787859eeb937c 100644 --- a/docs/framework/wcf/feature-details/how-to-create-a-service-endpoint-in-code.md +++ b/docs/framework/wcf/feature-details/how-to-create-a-service-endpoint-in-code.md @@ -40,7 +40,7 @@ In this example, an `ICalculator` contract is defined for a calculator service, [!code-csharp[c_HowTo_CodeServiceBinding#7](../../../../samples/snippets/csharp/VS_Snippets_CFX/c_howto_codeservicebinding/cs/source.cs#7)] [!code-vb[c_HowTo_CodeServiceBinding#7](../../../../samples/snippets/visualbasic/VS_Snippets_CFX/c_howto_codeservicebinding/vb/source.vb#7)] - For more information about default endpoints, see [Simplified Configuration](../simplified-configuration.md) and [Simplified Configuration for WCF Services](../samples/simplified-configuration-for-wcf-services.md). + For more information about default endpoints, see [Simplified Configuration](../simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services). ## See also diff --git a/docs/framework/wcf/feature-details/how-to-create-a-service-endpoint-in-configuration.md b/docs/framework/wcf/feature-details/how-to-create-a-service-endpoint-in-configuration.md index 8c2fdb1c45327..6f2ef01c82c98 100644 --- a/docs/framework/wcf/feature-details/how-to-create-a-service-endpoint-in-configuration.md +++ b/docs/framework/wcf/feature-details/how-to-create-a-service-endpoint-in-configuration.md @@ -120,7 +120,7 @@ Endpoints provide clients with access to the functionality a Windows Communicati ## Example 7 - To use the default endpoints provided by the runtime, do not specify any service endpoints in either the code or the configuration file. In this example, the runtime creates the default endpoints when the service is opened. For more information about default endpoints, bindings, and behaviors, see [Simplified Configuration](../simplified-configuration.md) and [Simplified Configuration for WCF Services](../samples/simplified-configuration-for-wcf-services.md). + To use the default endpoints provided by the runtime, do not specify any service endpoints in either the code or the configuration file. In this example, the runtime creates the default endpoints when the service is opened. For more information about default endpoints, bindings, and behaviors, see [Simplified Configuration](../simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services). ```xml diff --git a/docs/framework/wcf/feature-details/how-to-create-a-wsfederationhttpbinding.md b/docs/framework/wcf/feature-details/how-to-create-a-wsfederationhttpbinding.md index 5a7d582069ff9..af2b0996238ac 100644 --- a/docs/framework/wcf/feature-details/how-to-create-a-wsfederationhttpbinding.md +++ b/docs/framework/wcf/feature-details/how-to-create-a-wsfederationhttpbinding.md @@ -104,5 +104,5 @@ The following code sample shows code for setting up a `WSFederationHttpBinding` ## See also - [Federation](federation.md) -- [Federation Sample](../samples/federation-sample.md) +- [Federation Sample](/previous-versions/dotnet/framework/wcf/samples/federation-sample) - [How to: Disable Secure Sessions on a WSFederationHttpBinding](how-to-disable-secure-sessions-on-a-wsfederationhttpbinding.md) diff --git a/docs/framework/wcf/feature-details/how-to-dynamic-update.md b/docs/framework/wcf/feature-details/how-to-dynamic-update.md index ae6551bb85a26..7997907e85beb 100644 --- a/docs/framework/wcf/feature-details/how-to-dynamic-update.md +++ b/docs/framework/wcf/feature-details/how-to-dynamic-update.md @@ -297,4 +297,4 @@ The following is a complete listing of the configuration file used in this examp ## See also -- [Routing Services](../samples/routing-services.md) +- [Routing Services](/previous-versions/dotnet/framework/wcf/samples/routing-services) diff --git a/docs/framework/wcf/feature-details/how-to-enable-streaming.md b/docs/framework/wcf/feature-details/how-to-enable-streaming.md index 6747a545494ae..debc0f7be9b1b 100644 --- a/docs/framework/wcf/feature-details/how-to-enable-streaming.md +++ b/docs/framework/wcf/feature-details/how-to-enable-streaming.md @@ -73,4 +73,4 @@ Windows Communication Foundation (WCF) can send messages using either buffered o ## See also - [Large Data and Streaming](large-data-and-streaming.md) -- [Stream](../samples/stream.md) +- [Stream](/previous-versions/dotnet/framework/wcf/samples/stream) diff --git a/docs/framework/wcf/feature-details/how-to-enable-the-net-tcp-port-sharing-service.md b/docs/framework/wcf/feature-details/how-to-enable-the-net-tcp-port-sharing-service.md index 0ba7f95dd3d31..a32b845121253 100644 --- a/docs/framework/wcf/feature-details/how-to-enable-the-net-tcp-port-sharing-service.md +++ b/docs/framework/wcf/feature-details/how-to-enable-the-net-tcp-port-sharing-service.md @@ -13,7 +13,7 @@ Windows Communication Foundation (WCF) uses a Windows service called the Net.TCP After you enable the Net.TCP Port Sharing Service and start it manually, see [How to: Configure a WCF Service to Use Port Sharing](how-to-configure-a-wcf-service-to-use-port-sharing.md) for information about how to configure your service to use this service. - For a sample that uses net.tcp:// port sharing, see the [Net.TCP Port Sharing Sample](../samples/net-tcp-port-sharing-sample.md). + For a sample that uses net.tcp:// port sharing, see the [Net.TCP Port Sharing Sample](/previous-versions/dotnet/framework/wcf/samples/net-tcp-port-sharing-sample). ### To enable the Net.TCP Port Sharing Service using MMC diff --git a/docs/framework/wcf/feature-details/how-to-exchange-messages-with-wcf-endpoints-and-message-queuing-applications.md b/docs/framework/wcf/feature-details/how-to-exchange-messages-with-wcf-endpoints-and-message-queuing-applications.md index 6fd65a080f8b9..dd94838671c9b 100644 --- a/docs/framework/wcf/feature-details/how-to-exchange-messages-with-wcf-endpoints-and-message-queuing-applications.md +++ b/docs/framework/wcf/feature-details/how-to-exchange-messages-with-wcf-endpoints-and-message-queuing-applications.md @@ -13,9 +13,9 @@ You can integrate existing Message Queuing (MSMQ) applications with Windows Comm In this section, we explain how to use for queued communication between (1) a WCF client and an MSMQ application service written using System.Messaging and (2) an MSMQ application client and a WCF service. - For a complete sample that demonstrates how to call a MSMQ receiver application from a WCF client, see the [Windows Communication Foundation to Message Queuing](../samples/wcf-to-message-queuing.md) sample. + For a complete sample that demonstrates how to call a MSMQ receiver application from a WCF client, see the [Windows Communication Foundation to Message Queuing](/previous-versions/dotnet/framework/wcf/samples/wcf-to-message-queuing) sample. - For a complete sample that demonstrates how to call a WCF service from a MSMQ client, see the [Message Queuing to Windows Communication Foundation](../samples/message-queuing-to-wcf.md) sample. + For a complete sample that demonstrates how to call a WCF service from a MSMQ client, see the [Message Queuing to Windows Communication Foundation](/previous-versions/dotnet/framework/wcf/samples/message-queuing-to-wcf) sample. ### To create a WCF service that receives messages from a MSMQ client @@ -58,7 +58,7 @@ You can integrate existing Message Queuing (MSMQ) applications with Windows Comm - [Queues Overview](queues-overview.md) - [How to: Exchange Queued Messages with WCF Endpoints](how-to-exchange-queued-messages-with-wcf-endpoints.md) -- [Windows Communication Foundation to Message Queuing](../samples/wcf-to-message-queuing.md) -- [Installing Message Queuing (MSMQ)](../samples/installing-message-queuing-msmq.md) -- [Message Queuing to Windows Communication Foundation](../samples/message-queuing-to-wcf.md) -- [Message Security over Message Queuing](../samples/message-security-over-message-queuing.md) +- [Windows Communication Foundation to Message Queuing](/previous-versions/dotnet/framework/wcf/samples/wcf-to-message-queuing) +- [Installing Message Queuing (MSMQ)](/previous-versions/dotnet/framework/wcf/samples/installing-message-queuing-msmq) +- [Message Queuing to Windows Communication Foundation](/previous-versions/dotnet/framework/wcf/samples/message-queuing-to-wcf) +- [Message Security over Message Queuing](/previous-versions/dotnet/framework/wcf/samples/message-security-over-message-queuing) diff --git a/docs/framework/wcf/feature-details/how-to-exchange-messages-within-a-reliable-session.md b/docs/framework/wcf/feature-details/how-to-exchange-messages-within-a-reliable-session.md index 88717a1d6ab52..525b0bb90038d 100644 --- a/docs/framework/wcf/feature-details/how-to-exchange-messages-within-a-reliable-session.md +++ b/docs/framework/wcf/feature-details/how-to-exchange-messages-within-a-reliable-session.md @@ -11,7 +11,7 @@ This topic outlines the steps required to enable a reliable session using one of The key part of this procedure is that the endpoint configuration element contain a `bindingConfiguration` attribute that references a binding configuration named `Binding1`. The [**\**](../../configure-apps/file-schema/wcf/bindings.md) configuration element references this name to enable reliable sessions by setting the `enabled` attribute of the [**\**](/previous-versions/dotnet/netframework-4.0/ms731302(v=vs.100)) element to `true`. You specify the ordered delivery assurances for the reliable session by setting the `ordered` attribute to `true`. -For the source copy of this example, see [WS Reliable Session](../samples/ws-reliable-session.md). +For the source copy of this example, see [WS Reliable Session](/previous-versions/dotnet/framework/wcf/samples/ws-reliable-session). ### Configure the service with a WSHttpBinding to use a reliable session diff --git a/docs/framework/wcf/feature-details/how-to-exchange-queued-messages-with-wcf-endpoints.md b/docs/framework/wcf/feature-details/how-to-exchange-queued-messages-with-wcf-endpoints.md index 89516abb733ea..ea4e8dad1107b 100644 --- a/docs/framework/wcf/feature-details/how-to-exchange-queued-messages-with-wcf-endpoints.md +++ b/docs/framework/wcf/feature-details/how-to-exchange-queued-messages-with-wcf-endpoints.md @@ -75,10 +75,10 @@ Queues ensure that reliable messaging can occur between a client and a Windows C ## See also - -- [Transacted MSMQ Binding](../samples/transacted-msmq-binding.md) +- [Transacted MSMQ Binding](/previous-versions/dotnet/framework/wcf/samples/transacted-msmq-binding) - [Queuing in WCF](queuing-in-wcf.md) - [How to: Exchange Messages with WCF Endpoints and Message Queuing Applications](how-to-exchange-messages-with-wcf-endpoints-and-message-queuing-applications.md) -- [Windows Communication Foundation to Message Queuing](../samples/wcf-to-message-queuing.md) -- [Installing Message Queuing (MSMQ)](../samples/installing-message-queuing-msmq.md) -- [Message Queuing to Windows Communication Foundation](../samples/message-queuing-to-wcf.md) -- [Message Security over Message Queuing](../samples/message-security-over-message-queuing.md) +- [Windows Communication Foundation to Message Queuing](/previous-versions/dotnet/framework/wcf/samples/wcf-to-message-queuing) +- [Installing Message Queuing (MSMQ)](/previous-versions/dotnet/framework/wcf/samples/installing-message-queuing-msmq) +- [Message Queuing to Windows Communication Foundation](/previous-versions/dotnet/framework/wcf/samples/message-queuing-to-wcf) +- [Message Security over Message Queuing](/previous-versions/dotnet/framework/wcf/samples/message-security-over-message-queuing) diff --git a/docs/framework/wcf/feature-details/how-to-host-a-wcf-service-in-a-managed-windows-service.md b/docs/framework/wcf/feature-details/how-to-host-a-wcf-service-in-a-managed-windows-service.md index be47bc31da258..0234e719ed1fc 100644 --- a/docs/framework/wcf/feature-details/how-to-host-a-wcf-service-in-a-managed-windows-service.md +++ b/docs/framework/wcf/feature-details/how-to-host-a-wcf-service-in-a-managed-windows-service.md @@ -107,7 +107,7 @@ The service code includes a service implementation of the service contract, a Wi Right click the App.config file in the **Solution Explorer** and select **Properties**. Under **Copy to Output Directory** select **Copy if Newer**. - This example explicitly specifies endpoints in the configuration file. If you do not add any endpoints to the service, the runtime adds default endpoints for you. In this example, because the service has a set to `true`, your service also has publishing metadata enabled. For more information about default endpoints, bindings, and behaviors, see [Simplified Configuration](../simplified-configuration.md) and [Simplified Configuration for WCF Services](../samples/simplified-configuration-for-wcf-services.md). + This example explicitly specifies endpoints in the configuration file. If you do not add any endpoints to the service, the runtime adds default endpoints for you. In this example, because the service has a set to `true`, your service also has publishing metadata enabled. For more information about default endpoints, bindings, and behaviors, see [Simplified Configuration](../simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services). ## Install and run the service diff --git a/docs/framework/wcf/feature-details/how-to-host-a-wcf-service-in-iis.md b/docs/framework/wcf/feature-details/how-to-host-a-wcf-service-in-iis.md index 8d67ff4ee31f5..2d6eee6e2cc71 100644 --- a/docs/framework/wcf/feature-details/how-to-host-a-wcf-service-in-iis.md +++ b/docs/framework/wcf/feature-details/how-to-host-a-wcf-service-in-iis.md @@ -13,7 +13,7 @@ This topic outlines the basic steps required to create a Windows Communication F For more information about how WCF and ASP.NET interact, see [WCF Services and ASP.NET](wcf-services-and-aspnet.md). For more information about configuring security, see [Security](security.md). - For the source copy of this example, see [IIS Hosting Using Inline Code](../samples/iis-hosting-using-inline-code.md). + For the source copy of this example, see [IIS Hosting Using Inline Code](/previous-versions/dotnet/framework/wcf/samples/iis-hosting-using-inline-code). ### To create a service hosted by IIS @@ -60,7 +60,7 @@ This topic outlines the basic steps required to create a Windows Communication F [!code-xml[c_HowTo_HostInIIS#100](../../../../samples/snippets/csharp/VS_Snippets_CFX/c_howto_hostiniis/common/web.config#100)] - This example explicitly specifies endpoints in the configuration file. If you do not add any endpoints to the service, the runtime adds default endpoints for you. For more information about default endpoints, bindings, and behaviors see [Simplified Configuration](../simplified-configuration.md) and [Simplified Configuration for WCF Services](../samples/simplified-configuration-for-wcf-services.md). + This example explicitly specifies endpoints in the configuration file. If you do not add any endpoints to the service, the runtime adds default endpoints for you. For more information about default endpoints, bindings, and behaviors see [Simplified Configuration](../simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services). 11. To make sure the service is hosted correctly, open an instance of Internet Explorer and browse to the service's URL: `http://localhost/IISHostedCalc/Service.svc` diff --git a/docs/framework/wcf/feature-details/how-to-host-a-wcf-service-in-was.md b/docs/framework/wcf/feature-details/how-to-host-a-wcf-service-in-was.md index 5e77412effea3..6a1c3f8515f3d 100644 --- a/docs/framework/wcf/feature-details/how-to-host-a-wcf-service-in-was.md +++ b/docs/framework/wcf/feature-details/how-to-host-a-wcf-service-in-was.md @@ -31,7 +31,7 @@ This topic outlines the basic steps required to create a Windows Process Activat Otherwise, the endpoint that is initialized first always determines the values of these properties, and endpoints added later throw a if they do not match those settings. - For the source copy of this example, see [TCP Activation](../samples/tcp-activation.md). + For the source copy of this example, see [TCP Activation](/previous-versions/dotnet/framework/wcf/samples/tcp-activation). ### To create a basic service hosted by WAS @@ -96,5 +96,5 @@ This topic outlines the basic steps required to create a Windows Process Activat ## See also -- [TCP Activation](../samples/tcp-activation.md) +- [TCP Activation](/previous-versions/dotnet/framework/wcf/samples/tcp-activation) - [Windows Server App Fabric Hosting Features](/previous-versions/appfabric/ee677189(v=azure.10)) diff --git a/docs/framework/wcf/feature-details/how-to-import-metadata-into-service-endpoints.md b/docs/framework/wcf/feature-details/how-to-import-metadata-into-service-endpoints.md index 364cc61a0ef27..b430135d60ca9 100644 --- a/docs/framework/wcf/feature-details/how-to-import-metadata-into-service-endpoints.md +++ b/docs/framework/wcf/feature-details/how-to-import-metadata-into-service-endpoints.md @@ -6,7 +6,7 @@ ms.assetid: b69dbe20-92a1-4911-89d8-ffbc3dad4663 --- # How to: Import Metadata into Service Endpoints -This topic explains how to import metadata into a collection of service endpoints and use the service defined in the [Getting Started](../samples/getting-started-sample.md). This topic show how to create a client application that imports metadata from the service and then calls the `Add` method on the service. +This topic explains how to import metadata into a collection of service endpoints and use the service defined in the [Getting Started](/previous-versions/dotnet/framework/wcf/samples/getting-started-sample). This topic show how to create a client application that imports metadata from the service and then calls the `Add` method on the service. ### To import metadata into service endpoints @@ -36,4 +36,4 @@ This topic explains how to import metadata into a collection of service endpoint ## See also - [Metadata](metadata.md) -- [Getting Started](../samples/getting-started-sample.md) +- [Getting Started](/previous-versions/dotnet/framework/wcf/samples/getting-started-sample) diff --git a/docs/framework/wcf/feature-details/how-to-install-and-configure-wcf-activation-components.md b/docs/framework/wcf/feature-details/how-to-install-and-configure-wcf-activation-components.md index 0bfad08b6ec3a..eacd914920a81 100644 --- a/docs/framework/wcf/feature-details/how-to-install-and-configure-wcf-activation-components.md +++ b/docs/framework/wcf/feature-details/how-to-install-and-configure-wcf-activation-components.md @@ -98,7 +98,7 @@ After installing and configuring WAS, see [How to: Host a WCF Service in WAS](ho ## See also -- [TCP Activation](../samples/tcp-activation.md) -- [MSMQ Activation](../samples/msmq-activation.md) -- [NamedPipe Activation](../samples/namedpipe-activation.md) +- [TCP Activation](/previous-versions/dotnet/framework/wcf/samples/tcp-activation) +- [MSMQ Activation](/previous-versions/dotnet/framework/wcf/samples/msmq-activation) +- [NamedPipe Activation](/previous-versions/dotnet/framework/wcf/samples/namedpipe-activation) - [Windows Server App Fabric Hosting Features](/previous-versions/appfabric/ee677189(v=azure.10)) diff --git a/docs/framework/wcf/feature-details/how-to-make-x-509-certificates-accessible-to-wcf.md b/docs/framework/wcf/feature-details/how-to-make-x-509-certificates-accessible-to-wcf.md index 945d557d8d5ec..154de8f2394fb 100644 --- a/docs/framework/wcf/feature-details/how-to-make-x-509-certificates-accessible-to-wcf.md +++ b/docs/framework/wcf/feature-details/how-to-make-x-509-certificates-accessible-to-wcf.md @@ -37,11 +37,11 @@ To make an X.509 certificate accessible to Windows Communication Foundation (WCF [!code-csharp[x509Accessible#1](../../../../samples/snippets/csharp/VS_Snippets_CFX/x509accessible/cs/source.cs#1)] [!code-vb[x509Accessible#1](../../../../samples/snippets/visualbasic/VS_Snippets_CFX/x509accessible/vb/source.vb#1)] - 3. Determine where the private key for the certificate is located on the computer by using the [FindPrivateKey](../samples/findprivatekey.md) tool. + 3. Determine where the private key for the certificate is located on the computer by using the [FindPrivateKey](/previous-versions/dotnet/framework/wcf/samples/findprivatekey) tool. - The [FindPrivateKey](../samples/findprivatekey.md) tool requires the certificate store name, certificate store location, and something that uniquely identifies the certificate. The tool accepts either the certificate's subject name or its thumbprint as a unique identifier. For more information about how to determine the thumbprint for a certificate, see [How to: Retrieve the Thumbprint of a Certificate](how-to-retrieve-the-thumbprint-of-a-certificate.md). + The [FindPrivateKey](/previous-versions/dotnet/framework/wcf/samples/findprivatekey) tool requires the certificate store name, certificate store location, and something that uniquely identifies the certificate. The tool accepts either the certificate's subject name or its thumbprint as a unique identifier. For more information about how to determine the thumbprint for a certificate, see [How to: Retrieve the Thumbprint of a Certificate](how-to-retrieve-the-thumbprint-of-a-certificate.md). - The following code example uses the [FindPrivateKey](../samples/findprivatekey.md) tool to determine the location of the private key for a certificate in the `My` store in `CurrentUser` with a thumbprint of `46 dd 0e 7a ed 0b 7a 31 9b 02 a3 a0 43 7a d8 3f 60 40 92 9d`. + The following code example uses the [FindPrivateKey](/previous-versions/dotnet/framework/wcf/samples/findprivatekey) tool to determine the location of the private key for a certificate in the `My` store in `CurrentUser` with a thumbprint of `46 dd 0e 7a ed 0b 7a 31 9b 02 a3 a0 43 7a d8 3f 60 40 92 9d`. ```console findprivatekey.exe My CurrentUser -t "46 dd 0e 7a ed 0b 7a 31 9b 02 a3 a0 43 7a d8 3f 60 40 92 9d" -a @@ -68,6 +68,6 @@ To make an X.509 certificate accessible to Windows Communication Foundation (WCF ## See also -- [FindPrivateKey](../samples/findprivatekey.md) +- [FindPrivateKey](/previous-versions/dotnet/framework/wcf/samples/findprivatekey) - [How to: Retrieve the Thumbprint of a Certificate](how-to-retrieve-the-thumbprint-of-a-certificate.md) - [Working with Certificates](working-with-certificates.md) diff --git a/docs/framework/wcf/feature-details/how-to-programmatically-add-discoverability-to-a-wcf-service-and-client.md b/docs/framework/wcf/feature-details/how-to-programmatically-add-discoverability-to-a-wcf-service-and-client.md index ec01bfacd03d3..9d80eefceb025 100644 --- a/docs/framework/wcf/feature-details/how-to-programmatically-add-discoverability-to-a-wcf-service-and-client.md +++ b/docs/framework/wcf/feature-details/how-to-programmatically-add-discoverability-to-a-wcf-service-and-client.md @@ -6,7 +6,7 @@ ms.assetid: 4f7ae7ab-6fc8-4769-9730-c14d43f7b9b1 --- # How to: Programmatically Add Discoverability to a WCF Service and Client -This topic explains how to make a Windows Communication Foundation (WCF) service discoverable. It is based on the [Self-Host](../samples/self-host.md) sample. +This topic explains how to make a Windows Communication Foundation (WCF) service discoverable. It is based on the [Self-Host](/previous-versions/dotnet/framework/wcf/samples/self-host) sample. ### To configure the existing Self-Host service sample for Discovery @@ -120,7 +120,7 @@ This topic explains how to make a Windows Communication Foundation (WCF) service This method uses the endpoint address returned from `FindCalculatorServiceAddress` to call the calculator service. -11. Inside the `InvokeCalculatorService` method, create an instance of the `CalculatorServiceClient` class. This class is defined by the [Self-Host](../samples/self-host.md) sample. It was generated using Svcutil.exe. +11. Inside the `InvokeCalculatorService` method, create an instance of the `CalculatorServiceClient` class. This class is defined by the [Self-Host](/previous-versions/dotnet/framework/wcf/samples/self-host) sample. It was generated using Svcutil.exe. ```csharp // Create a client @@ -217,7 +217,7 @@ This topic explains how to make a Windows Communication Foundation (WCF) service ## Example - The following is a listing of the code for this sample. Because this code is based on the [Self-Host](../samples/self-host.md) sample, only those files that are changed are listed. For more information about the Self-Host sample, see [Setup Instructions](../samples/set-up-instructions.md). + The following is a listing of the code for this sample. Because this code is based on the [Self-Host](/previous-versions/dotnet/framework/wcf/samples/self-host) sample, only those files that are changed are listed. For more information about the Self-Host sample, see [Setup Instructions](/previous-versions/dotnet/framework/wcf/samples/set-up-instructions). ```csharp // Service.cs diff --git a/docs/framework/wcf/feature-details/how-to-publish-metadata-for-a-service-using-a-configuration-file.md b/docs/framework/wcf/feature-details/how-to-publish-metadata-for-a-service-using-a-configuration-file.md index 753dac854014f..ed95af575efbf 100644 --- a/docs/framework/wcf/feature-details/how-to-publish-metadata-for-a-service-using-a-configuration-file.md +++ b/docs/framework/wcf/feature-details/how-to-publish-metadata-for-a-service-using-a-configuration-file.md @@ -9,7 +9,7 @@ ms.assetid: f061443f-92df-4824-b36a-609c4cd14a17 This is one of two how-to topics that demonstrate publishing metadata for a Windows Communication Foundation (WCF) service. There are two ways to specify how a service should publish metadata, using a configuration file and using code. This topic shows how to publish metadata for a service using a configuration file. > [!CAUTION] -> This topic shows how to publish metadata in an unsecure manner. Any client can retrieve the metadata from the service. If you require your service to publish metadata in a secure manner, see [Custom Secure Metadata Endpoint](../samples/custom-secure-metadata-endpoint.md). +> This topic shows how to publish metadata in an unsecure manner. Any client can retrieve the metadata from the service. If you require your service to publish metadata in a secure manner, see [Custom Secure Metadata Endpoint](/previous-versions/dotnet/framework/wcf/samples/custom-secure-metadata-endpoint). For more information about publishing metadata in code, see [How to: Publish Metadata for a Service Using Code](how-to-publish-metadata-for-a-service-using-code.md). Publishing metadata allows clients to retrieve the metadata using a WS-Transfer GET request or an HTTP/GET request using the `?wsdl` query string. To be sure that the code is working, create a basic WCF service. For simplicity, a basic self-hosted service is provided in the following code. @@ -175,7 +175,7 @@ namespace Metadata.Samples ``` - Because the service has a with the `httpGetEnabled` set to `true`, the service has publishing metadata enabled, and because no endpoints were explicitly added, the runtime adds the default endpoints. For more information about default endpoints, bindings, and behaviors, see [Simplified Configuration](../simplified-configuration.md) and [Simplified Configuration for WCF Services](../samples/simplified-configuration-for-wcf-services.md). + Because the service has a with the `httpGetEnabled` set to `true`, the service has publishing metadata enabled, and because no endpoints were explicitly added, the runtime adds the default endpoints. For more information about default endpoints, bindings, and behaviors, see [Simplified Configuration](../simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services). ## Example @@ -254,7 +254,7 @@ namespace Metadata.Samples - - [How to: Host a WCF Service in a Managed Application](../how-to-host-a-wcf-service-in-a-managed-application.md) -- [Self-Host](../samples/self-host.md) +- [Self-Host](/previous-versions/dotnet/framework/wcf/samples/self-host) - [Metadata Architecture Overview](metadata-architecture-overview.md) - [Using Metadata](using-metadata.md) - [How to: Publish Metadata for a Service Using Code](how-to-publish-metadata-for-a-service-using-code.md) diff --git a/docs/framework/wcf/feature-details/how-to-publish-metadata-for-a-service-using-code.md b/docs/framework/wcf/feature-details/how-to-publish-metadata-for-a-service-using-code.md index 31b217ccd4e40..2fd7cb78d632c 100644 --- a/docs/framework/wcf/feature-details/how-to-publish-metadata-for-a-service-using-code.md +++ b/docs/framework/wcf/feature-details/how-to-publish-metadata-for-a-service-using-code.md @@ -12,7 +12,7 @@ ms.assetid: 51407e6d-4d87-42d5-be7c-9887b8652006 This is one of two how-to topics that discuss publishing metadata for a Windows Communication Foundation (WCF) service. There are two ways to specify how a service should publish metadata, using a configuration file and using code. This topic shows how to publish metadata for a service using a code. > [!CAUTION] -> This topic shows how to publish metadata in an unsecure manner. Any client can retrieve the metadata from the service. If you require your service to publish metadata in a secure manner. see [Custom Secure Metadata Endpoint](../samples/custom-secure-metadata-endpoint.md). +> This topic shows how to publish metadata in an unsecure manner. Any client can retrieve the metadata from the service. If you require your service to publish metadata in a secure manner. see [Custom Secure Metadata Endpoint](/previous-versions/dotnet/framework/wcf/samples/custom-secure-metadata-endpoint). For more information about publishing metadata in a configuration file, see [How to: Publish Metadata for a Service Using a Configuration File](how-to-publish-metadata-for-a-service-using-a-configuration-file.md). Publishing metadata allows clients to retrieve the metadata using a WS-Transfer GET request or an HTTP/GET request using the `?wsdl` query string. To be sure that the code is working you must create a basic WCF service. A basic self-hosted service is provided in the following code. @@ -65,7 +65,7 @@ This is one of two how-to topics that discuss publishing metadata for a Windows [!code-vb[htPublishMetadataCode#9](../../../../samples/snippets/visualbasic/VS_Snippets_CFX/htpublishmetadatacode/vb/program.vb#9)] > [!NOTE] - > If you do not add any endpoints to the service, the runtime adds default endpoints for you. In this example, because the service has a set to `true`, the service has publishing metadata enabled. For more information about default endpoints, see [Simplified Configuration](../simplified-configuration.md) and [Simplified Configuration for WCF Services](../samples/simplified-configuration-for-wcf-services.md). + > If you do not add any endpoints to the service, the runtime adds default endpoints for you. In this example, because the service has a set to `true`, the service has publishing metadata enabled. For more information about default endpoints, see [Simplified Configuration](../simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services). 9. Open the service host and wait for incoming calls. When the user presses ENTER, close the service host. @@ -86,7 +86,7 @@ This is one of two how-to topics that discuss publishing metadata for a Windows ## See also - [How to: Host a WCF Service in a Managed Application](../how-to-host-a-wcf-service-in-a-managed-application.md) -- [Self-Host](../samples/self-host.md) +- [Self-Host](/previous-versions/dotnet/framework/wcf/samples/self-host) - [Metadata Architecture Overview](metadata-architecture-overview.md) - [Using Metadata](using-metadata.md) - [How to: Publish Metadata for a Service Using a Configuration File](how-to-publish-metadata-for-a-service-using-a-configuration-file.md) diff --git a/docs/framework/wcf/feature-details/how-to-secure-messages-within-reliable-sessions.md b/docs/framework/wcf/feature-details/how-to-secure-messages-within-reliable-sessions.md index 6ce939a4b62a5..1d913b116aa71 100644 --- a/docs/framework/wcf/feature-details/how-to-secure-messages-within-reliable-sessions.md +++ b/docs/framework/wcf/feature-details/how-to-secure-messages-within-reliable-sessions.md @@ -19,7 +19,7 @@ This procedure consists of the following three key tasks: It's important in the first task that the endpoint configuration element contain a `bindingConfiguration` attribute that references a binding configuration named (in this example) `MessageSecurity`. The [**\**](../../configure-apps/file-schema/wcf/bindings.md) configuration element then references this name to enable reliable sessions by setting the `enabled` attribute of the [**\**](/previous-versions/ms731375(v=vs.90)) element to `true`. You can require that the ordered delivery assurances are available within a reliable session by setting the `ordered` attribute to `true`. -For the source copy of the example on which this configuration procedure is based, see the [WS Reliable Session](../samples/ws-reliable-session.md). +For the source copy of the example on which this configuration procedure is based, see the [WS Reliable Session](/previous-versions/dotnet/framework/wcf/samples/ws-reliable-session). The essential items of the second task are accomplished by setting the `mode` attribute of the **\** element contained in the **\** element of the client and service to `Message`. diff --git a/docs/framework/wcf/feature-details/how-to-serialize-and-deserialize-json-data.md b/docs/framework/wcf/feature-details/how-to-serialize-and-deserialize-json-data.md index 8d355d74e608e..618d9f682d01d 100644 --- a/docs/framework/wcf/feature-details/how-to-serialize-and-deserialize-json-data.md +++ b/docs/framework/wcf/feature-details/how-to-serialize-and-deserialize-json-data.md @@ -15,7 +15,7 @@ This article demonstrates how to serialize .NET type objects into JSON-encoded d Normally, JSON serialization and deserialization are handled automatically by Windows Communication Foundation (WCF) when you use data contract types in service operations that are exposed over AJAX-enabled endpoints. However, in some cases you may need to work with JSON data directly. -This article is based on the [DataContractJsonSerializer sample](../samples/json-serialization.md). +This article is based on the [DataContractJsonSerializer sample](/previous-versions/dotnet/framework/wcf/samples/json-serialization). ## To define the data contract for a Person type diff --git a/docs/framework/wcf/feature-details/how-to-service-data-partitioning.md b/docs/framework/wcf/feature-details/how-to-service-data-partitioning.md index 7fbeec5ece6b2..7c9e1176ba9b4 100644 --- a/docs/framework/wcf/feature-details/how-to-service-data-partitioning.md +++ b/docs/framework/wcf/feature-details/how-to-service-data-partitioning.md @@ -172,4 +172,4 @@ This topic outlines the basic steps required to partition messages across multip ## See also -- [Routing Services](../samples/routing-services.md) +- [Routing Services](/previous-versions/dotnet/framework/wcf/samples/routing-services) diff --git a/docs/framework/wcf/feature-details/how-to-service-versioning.md b/docs/framework/wcf/feature-details/how-to-service-versioning.md index 911049a571bd3..49fee82bfcd7d 100644 --- a/docs/framework/wcf/feature-details/how-to-service-versioning.md +++ b/docs/framework/wcf/feature-details/how-to-service-versioning.md @@ -322,4 +322,4 @@ namespace Microsoft.Samples.AdvancedFilters ## See also -- [Routing Services](../samples/routing-services.md) +- [Routing Services](/previous-versions/dotnet/framework/wcf/samples/routing-services) diff --git a/docs/framework/wcf/feature-details/how-to-specify-channel-security-credentials.md b/docs/framework/wcf/feature-details/how-to-specify-channel-security-credentials.md index 339dbbf874ac7..ea65d86c6a1f4 100644 --- a/docs/framework/wcf/feature-details/how-to-specify-channel-security-credentials.md +++ b/docs/framework/wcf/feature-details/how-to-specify-channel-security-credentials.md @@ -11,7 +11,7 @@ The Windows Communication Foundation (WCF) Service Moniker allows COM applicatio > [!NOTE] > is an IDispatch-based interface and you will not get IntelliSense functionality in the Visual Studio environment. - This article will use the WCF service defined in the [Message Security Sample](../samples/message-security-sample.md). + This article will use the WCF service defined in the [Message Security Sample](/previous-versions/dotnet/framework/wcf/samples/message-security-sample). ### To specify a client certificate @@ -111,7 +111,7 @@ The Windows Communication Foundation (WCF) Service Moniker allows COM applicatio ### To specify an issue token -1. Issue tokens are used only for applications using federated security. For more information about federated security, see [Federation and Issued Tokens](federation-and-issued-tokens.md) and [Federation Sample](../samples/federation-sample.md). +1. Issue tokens are used only for applications using federated security. For more information about federated security, see [Federation and Issued Tokens](federation-and-issued-tokens.md) and [Federation Sample](/previous-versions/dotnet/framework/wcf/samples/federation-sample). The following Visual Basic code example illustrates how to call the method: diff --git a/docs/framework/wcf/feature-details/how-to-use-a-custom-user-name-and-password-validator.md b/docs/framework/wcf/feature-details/how-to-use-a-custom-user-name-and-password-validator.md index ded565213edad..086fd55c4a8f3 100644 --- a/docs/framework/wcf/feature-details/how-to-use-a-custom-user-name-and-password-validator.md +++ b/docs/framework/wcf/feature-details/how-to-use-a-custom-user-name-and-password-validator.md @@ -13,7 +13,7 @@ ms.assetid: 8e08b74b-fa44-4018-b63d-0d0805f85e3f By default, when a user name and password is used for authentication, Windows Communication Foundation (WCF) uses Windows to validate the user name and password. However, WCF allows for custom user name and password authentication schemes, also known as *validators*. To incorporate a custom user name and password validator, create a class that derives from and then configure it. -For a sample application, see [User Name Password Validator](../samples/user-name-password-validator.md). +For a sample application, see [User Name Password Validator](/previous-versions/dotnet/framework/wcf/samples/user-name-password-validator). ### To create a custom user name and password validator diff --git a/docs/framework/wcf/feature-details/how-to-use-a-service-moniker-with-wsdl-contracts.md b/docs/framework/wcf/feature-details/how-to-use-a-service-moniker-with-wsdl-contracts.md index 22764e20c57b0..9132e4fd770a7 100644 --- a/docs/framework/wcf/feature-details/how-to-use-a-service-moniker-with-wsdl-contracts.md +++ b/docs/framework/wcf/feature-details/how-to-use-a-service-moniker-with-wsdl-contracts.md @@ -52,5 +52,5 @@ There are situations when you may want to have a completely self-contained COM I ## See also -- [Getting Started](../samples/getting-started-sample.md) +- [Getting Started](/previous-versions/dotnet/framework/wcf/samples/getting-started-sample) - [Integrating with COM Applications Overview](integrating-with-com-applications-overview.md) diff --git a/docs/framework/wcf/feature-details/how-to-use-configuration-to-add-an-aspnet-ajax-endpoint.md b/docs/framework/wcf/feature-details/how-to-use-configuration-to-add-an-aspnet-ajax-endpoint.md index 7419cf5861a43..a20a094ca8dc7 100644 --- a/docs/framework/wcf/feature-details/how-to-use-configuration-to-add-an-aspnet-ajax-endpoint.md +++ b/docs/framework/wcf/feature-details/how-to-use-configuration-to-add-an-aspnet-ajax-endpoint.md @@ -8,7 +8,7 @@ ms.assetid: 7cd0099e-dc3a-47e4-a38c-6e10f997f6ea Windows Communication Foundation (WCF) allows you to create a service that makes an ASP.NET AJAX-enabled endpoint available that can be called from JavaScript on a client Web site. To create such an endpoint, you can either use a configuration file, as with all other Windows Communication Foundation (WCF) endpoints, or use a method that does not require any configuration elements. This topic demonstrates the configuration approach. - The part of the procedure that enables the service endpoint to become ASP.NET AJAX-enabled consists of configuring the endpoint to use the and to add the [\](../../configure-apps/file-schema/wcf/enablewebscript.md) endpoint behavior. After configuring the endpoint, the steps to implement and host the service are similar to those used by any WCF service. For a working example, see the [AJAX Service Using HTTP POST](../samples/ajax-service-using-http-post.md). + The part of the procedure that enables the service endpoint to become ASP.NET AJAX-enabled consists of configuring the endpoint to use the and to add the [\](../../configure-apps/file-schema/wcf/enablewebscript.md) endpoint behavior. After configuring the endpoint, the steps to implement and host the service are similar to those used by any WCF service. For a working example, see the [AJAX Service Using HTTP POST](/previous-versions/dotnet/framework/wcf/samples/ajax-service-using-http-post). For more information about how to configure an ASP.NET AJAX endpoint without using configuration, see [How to: Add an ASP.NET AJAX Endpoint Without Using Configuration](how-to-add-an-aspnet-ajax-endpoint-without-using-configuration.md). @@ -98,7 +98,7 @@ Windows Communication Foundation (WCF) allows you to create a service that makes ## To call the service -1. The endpoint is configured at an empty address relative to the .svc file, so the service is now available and can be invoked by sending requests to service.svc/\ - for example, service.svc/Add for the `Add` operation. You can use it by entering the endpoint URL into the Scripts collection of the ASP.NET AJAX Script Manager control. For an example, see the [AJAX Service Using HTTP POST](../samples/ajax-service-using-http-post.md). +1. The endpoint is configured at an empty address relative to the .svc file, so the service is now available and can be invoked by sending requests to service.svc/\ - for example, service.svc/Add for the `Add` operation. You can use it by entering the endpoint URL into the Scripts collection of the ASP.NET AJAX Script Manager control. For an example, see the [AJAX Service Using HTTP POST](/previous-versions/dotnet/framework/wcf/samples/ajax-service-using-http-post). ## See also diff --git a/docs/framework/wcf/feature-details/how-to-use-filters.md b/docs/framework/wcf/feature-details/how-to-use-filters.md index ebf24d6fcf00f..9f323be174b78 100644 --- a/docs/framework/wcf/feature-details/how-to-use-filters.md +++ b/docs/framework/wcf/feature-details/how-to-use-filters.md @@ -324,4 +324,4 @@ This topic outlines the basic steps required to create a routing configuration t ## See also -- [Routing Services](../samples/routing-services.md) +- [Routing Services](/previous-versions/dotnet/framework/wcf/samples/routing-services) diff --git a/docs/framework/wcf/feature-details/how-to-use-the-aspnet-membership-provider.md b/docs/framework/wcf/feature-details/how-to-use-the-aspnet-membership-provider.md index 7feb85e831025..5e7c4dd3bb7db 100644 --- a/docs/framework/wcf/feature-details/how-to-use-the-aspnet-membership-provider.md +++ b/docs/framework/wcf/feature-details/how-to-use-the-aspnet-membership-provider.md @@ -12,7 +12,7 @@ ms.assetid: 322c56e0-938f-4f19-a981-7b6530045b90 The ASP.NET membership provider is a feature that enables ASP.NET developers to create Web sites that allow users to create unique user name and password combinations. With this facility, any user can establish an account with the site, and sign in for exclusive access to the site and its services. This is in contrast to Windows security, which requires users to have accounts in a Windows domain. Instead, any user that supplies their credentials (the user name/password combination) can use the site and its services. -For a sample application, see [Membership and Role Provider](../samples/membership-and-role-provider.md). For information about using the ASP.NET role provider feature, see [How to: Use the ASP.NET Role Provider with a Service](how-to-use-the-aspnet-role-provider-with-a-service.md). +For a sample application, see [Membership and Role Provider](/previous-versions/dotnet/framework/wcf/samples/membership-and-role-provider). For information about using the ASP.NET role provider feature, see [How to: Use the ASP.NET Role Provider with a Service](how-to-use-the-aspnet-role-provider-with-a-service.md). The membership feature requires using a SQL Server database to store the user information. The feature also includes methods for prompting with a question any users who have forgotten their password. @@ -154,4 +154,4 @@ The following code shows the configuration for a service that uses the ASP membe ## See also - [How to: Use the ASP.NET Role Provider with a Service](how-to-use-the-aspnet-role-provider-with-a-service.md) -- [Membership and Role Provider](../samples/membership-and-role-provider.md) +- [Membership and Role Provider](/previous-versions/dotnet/framework/wcf/samples/membership-and-role-provider) diff --git a/docs/framework/wcf/feature-details/how-to-use-the-aspnet-role-provider-with-a-service.md b/docs/framework/wcf/feature-details/how-to-use-the-aspnet-role-provider-with-a-service.md index e73f501ee572f..528cb39ab8d06 100644 --- a/docs/framework/wcf/feature-details/how-to-use-the-aspnet-role-provider-with-a-service.md +++ b/docs/framework/wcf/feature-details/how-to-use-the-aspnet-role-provider-with-a-service.md @@ -8,7 +8,7 @@ ms.assetid: 88d33a81-8ac7-48de-978c-5c5b1257951e The ASP.NET role provider (in conjunction with the ASP.NET membership provider) is a feature that enables ASP.NET developers to create Web sites that allow users to create an account with a site and to be assigned roles for authorization purposes. With this feature, any user can establish an account with the site, and log in for exclusive access to the site and its services. This is in contrast to Windows security, which requires users to have accounts in a Windows domain. Instead, any user who supplies their credentials (the user name/password combination) can use the site and its services. -For a sample application, see [Membership and Role Provider](../samples/membership-and-role-provider.md). For more information about the ASP.NET membership provider feature, see [How to: Use the ASP.NET Membership Provider](how-to-use-the-aspnet-membership-provider.md). +For a sample application, see [Membership and Role Provider](/previous-versions/dotnet/framework/wcf/samples/membership-and-role-provider). For more information about the ASP.NET membership provider feature, see [How to: Use the ASP.NET Membership Provider](how-to-use-the-aspnet-membership-provider.md). The role provider feature uses a SQL Server database to store user information. Windows Communication Foundation (WCF) developers can take advantage of these features for security purposes. When integrated into a WCF application, users must supply a user name/password combination to the WCF client application. To enable WCF to use the database, you must create an instance of the class, set its property to , and add the instance to the collection of behaviors to the that is hosting the service. @@ -64,5 +64,5 @@ The role provider feature uses a SQL Server database to store user information. ## See also -- [Membership and Role Provider](../samples/membership-and-role-provider.md) +- [Membership and Role Provider](/previous-versions/dotnet/framework/wcf/samples/membership-and-role-provider) - [How to: Use the ASP.NET Membership Provider](how-to-use-the-aspnet-membership-provider.md) diff --git a/docs/framework/wcf/feature-details/http-post-and-http-get-requests-for-aspnet-ajax-endpoints.md b/docs/framework/wcf/feature-details/http-post-and-http-get-requests-for-aspnet-ajax-endpoints.md index 099fc4798ef83..19eb45cc2b07c 100644 --- a/docs/framework/wcf/feature-details/http-post-and-http-get-requests-for-aspnet-ajax-endpoints.md +++ b/docs/framework/wcf/feature-details/http-post-and-http-get-requests-for-aspnet-ajax-endpoints.md @@ -23,9 +23,9 @@ Windows Communication Foundation (WCF) allows you to create a service that expos An operation marked with the always uses a GET request. An operation marked with the , or not marked with any of the two attributes, uses a POST request. The allows the use of other HTTP verbs, other than GET and POST (such as PUT and DELETE) through the property. However, these verbs are not supported by ASP.NET AJAX. If you intend to use the service from ASP.NET pages using the Script Manager control, do not use the property. - For a working example of switching to GET, see the [Basic AJAX Service](../samples/basic-ajax-service.md) sample. + For a working example of switching to GET, see the [Basic AJAX Service](/previous-versions/dotnet/framework/wcf/samples/basic-ajax-service) sample. - For a sample that uses POST, see the [AJAX Service Using HTTP POST](../samples/ajax-service-using-http-post.md) sample. + For a sample that uses POST, see the [AJAX Service Using HTTP POST](/previous-versions/dotnet/framework/wcf/samples/ajax-service-using-http-post) sample. ## To create a WCF service that responds to HTTP GET or HTTP POST requests @@ -84,7 +84,7 @@ Windows Communication Foundation (WCF) allows you to create a service that expos 1. You can test your service's GET operations without any client code, by using the browser. For example, if your service is configured at the `http://example.com/service.svc` address, then typing `http://example.com/service.svc/LookUpArtist?album=SomeAlbum` into the browser address bar invokes the service and causes the response to be downloaded or displayed. -2. You can use services with GET operations in the same way as any other ASP.NET AJAX services - by entering the service URL into the Scripts collection of the ASP.NET AJAX Script Manager control. For an example, see the [Basic AJAX Service](../samples/basic-ajax-service.md). +2. You can use services with GET operations in the same way as any other ASP.NET AJAX services - by entering the service URL into the Scripts collection of the ASP.NET AJAX Script Manager control. For an example, see the [Basic AJAX Service](/previous-versions/dotnet/framework/wcf/samples/basic-ajax-service). ## See also diff --git a/docs/framework/wcf/feature-details/internet-information-services-hosting-best-practices.md b/docs/framework/wcf/feature-details/internet-information-services-hosting-best-practices.md index 69ffb9ca83aa3..0bcc2d1326153 100644 --- a/docs/framework/wcf/feature-details/internet-information-services-hosting-best-practices.md +++ b/docs/framework/wcf/feature-details/internet-information-services-hosting-best-practices.md @@ -87,5 +87,5 @@ This topic outlines some best practices for hosting Windows Communication Founda ## See also -- [Service Hosting Samples](../samples/hosting.md) +- [Service Hosting Samples](/previous-versions/dotnet/framework/wcf/samples/hosting) - [Windows Server App Fabric Hosting Features](/previous-versions/appfabric/ee677189(v=azure.10)) diff --git a/docs/framework/wcf/feature-details/large-data-and-streaming.md b/docs/framework/wcf/feature-details/large-data-and-streaming.md index 3342e8bf4e1e4..c154704d364bc 100644 --- a/docs/framework/wcf/feature-details/large-data-and-streaming.md +++ b/docs/framework/wcf/feature-details/large-data-and-streaming.md @@ -78,7 +78,7 @@ Windows Communication Foundation (WCF) is an XML-based communications infrastruc ### Enabling MTOM - When interoperability is a requirement and large binary data must be sent, then MTOM message encoding is the alternative encoding strategy that you can enable on the standard or bindings by setting the respective `MessageEncoding` property to or by composing the into a . The following example code, extracted from the [MTOM Encoding](../samples/mtom-encoding.md) sample demonstrates how to enable MTOM in configuration. + When interoperability is a requirement and large binary data must be sent, then MTOM message encoding is the alternative encoding strategy that you can enable on the standard or bindings by setting the respective `MessageEncoding` property to or by composing the into a . The following example code, extracted from the [MTOM Encoding](/previous-versions/dotnet/framework/wcf/samples/mtom-encoding) sample demonstrates how to enable MTOM in configuration. ```xml diff --git a/docs/framework/wcf/feature-details/message-security-with-a-certificate-client.md b/docs/framework/wcf/feature-details/message-security-with-a-certificate-client.md index aca9afa414b81..1413ac43bc867 100644 --- a/docs/framework/wcf/feature-details/message-security-with-a-certificate-client.md +++ b/docs/framework/wcf/feature-details/message-security-with-a-certificate-client.md @@ -13,7 +13,7 @@ The following scenario shows a Windows Communication Foundation (WCF) client and ![Screenshot that shows a client with certificate.](./media/message-security-with-a-certificate-client/client-with-certificate.gif) - For a sample application, see [Message Security Certificate](../samples/message-security-certificate.md). + For a sample application, see [Message Security Certificate](/previous-versions/dotnet/framework/wcf/samples/message-security-certificate). |Characteristic|Description| |--------------------|-----------------| diff --git a/docs/framework/wcf/feature-details/message-security-with-a-user-name-client.md b/docs/framework/wcf/feature-details/message-security-with-a-user-name-client.md index d13a8597c8c30..2f510b58fb899 100644 --- a/docs/framework/wcf/feature-details/message-security-with-a-user-name-client.md +++ b/docs/framework/wcf/feature-details/message-security-with-a-user-name-client.md @@ -11,7 +11,7 @@ ms.assetid: 36335cb9-76b8-4443-92c7-44f081eabb21 The following illustration shows an Windows Communication Foundation (WCF) service and client secured using message-level security. The service is authenticated with an X.509 certificate. The client authenticates using a user name and password. - For a sample application, see [Message Security User Name](../samples/message-security-user-name.md). + For a sample application, see [Message Security User Name](/previous-versions/dotnet/framework/wcf/samples/message-security-user-name). ![Message security using username authentication](media/1fb10a61-7e1d-42f5-b1af-195bfee5b3c6.gif "1fb10a61-7e1d-42f5-b1af-195bfee5b3c6") @@ -129,7 +129,7 @@ The following illustration shows an Windows Communication Foundation (WCF) servi ## See also - [Security Overview](security-overview.md) -- [Message Security User Name](../samples/message-security-user-name.md) +- [Message Security User Name](/previous-versions/dotnet/framework/wcf/samples/message-security-user-name) - [Service Identity and Authentication](service-identity-and-authentication.md) - [\](../../configure-apps/file-schema/wcf/identity.md) - [Security Model for Windows Server App Fabric](/previous-versions/appfabric/ee677202(v=azure.10)) diff --git a/docs/framework/wcf/feature-details/message-security-with-an-anonymous-client.md b/docs/framework/wcf/feature-details/message-security-with-an-anonymous-client.md index d137f6d8af6c9..f0604a167d8fe 100644 --- a/docs/framework/wcf/feature-details/message-security-with-an-anonymous-client.md +++ b/docs/framework/wcf/feature-details/message-security-with-an-anonymous-client.md @@ -12,7 +12,7 @@ ms.assetid: cad53e1a-b7c9-4064-bc87-508c3d1dce49 The following scenario shows a client and service secured by Windows Communication Foundation (WCF) message security. A design goal is to use message security rather than transport security, so that in the future it can support a richer claims-based model. For more information about using rich claims for authorization, see [Managing Claims and Authorization with the Identity Model](managing-claims-and-authorization-with-the-identity-model.md). -For a sample application, see [Message Security Anonymous](../samples/message-security-anonymous.md). +For a sample application, see [Message Security Anonymous](/previous-versions/dotnet/framework/wcf/samples/message-security-anonymous). ![Message security with an anonymous client](media/b361a565-831c-4c10-90d7-66d8eeece0a1.gif "b361a565-831c-4c10-90d7-66d8eeece0a1") @@ -138,6 +138,6 @@ The following code configures the client. - [Security Overview](security-overview.md) - [Distributed Application Security](distributed-application-security.md) -- [Message Security Anonymous](../samples/message-security-anonymous.md) +- [Message Security Anonymous](/previous-versions/dotnet/framework/wcf/samples/message-security-anonymous) - [Service Identity and Authentication](service-identity-and-authentication.md) - [Security Model for Windows Server App Fabric](/previous-versions/appfabric/ee677202(v=azure.10)) diff --git a/docs/framework/wcf/feature-details/metadata-architecture-overview.md b/docs/framework/wcf/feature-details/metadata-architecture-overview.md index a55a891eb1766..021c354e175eb 100644 --- a/docs/framework/wcf/feature-details/metadata-architecture-overview.md +++ b/docs/framework/wcf/feature-details/metadata-architecture-overview.md @@ -55,7 +55,7 @@ Windows Communication Foundation (WCF) provides a rich infrastructure for export > > You can work around this issue by either adding the in the configuration file or adding both the endpoint and in code. > -> For an example of adding in an application configuration file, see the [Getting Started](../samples/getting-started-sample.md). For an example of adding in code, see the [Self-Host](../samples/self-host.md) sample. +> For an example of adding in an application configuration file, see the [Getting Started](/previous-versions/dotnet/framework/wcf/samples/getting-started-sample). For an example of adding in code, see the [Self-Host](/previous-versions/dotnet/framework/wcf/samples/self-host) sample. > [!CAUTION] > When publishing metadata for a service that exposes two different service contracts in which each contain an operation of the same name an exception is thrown. For example, if you have a service that exposes a service contract called ICarService that has an operation Get(Car c) and the same service exposes a service contract called IBookService that has an operation Get(Book b), an exception is thrown or an error message is displayed when generating the service's metadata. To work around this issue do one of the following: diff --git a/docs/framework/wcf/feature-details/middle-tier-client-applications.md b/docs/framework/wcf/feature-details/middle-tier-client-applications.md index de75d3975dadd..42efc6b395abf 100644 --- a/docs/framework/wcf/feature-details/middle-tier-client-applications.md +++ b/docs/framework/wcf/feature-details/middle-tier-client-applications.md @@ -28,7 +28,7 @@ This topic discusses various issues specific to middle-tier client applications - You must handle faulted channels regardless of whether you share the channel. When channels are reused, however, a faulting channel can take down more than one pending request or send. - For an example that demonstrates best practices for reusing a client for multiple requests, see [Data Binding in an ASP.NET Client](../samples/data-binding-in-an-aspnet-client.md). + For an example that demonstrates best practices for reusing a client for multiple requests, see [Data Binding in an ASP.NET Client](/previous-versions/dotnet/framework/wcf/samples/data-binding-in-an-aspnet-client). In addition, you can increase the startup performance for those clients that use data types that are serializable using the generate and compile serialization code for those data types at runtime, which can result in slow start-up performance. The [ServiceModel Metadata Utility Tool (Svcutil.exe)](../servicemodel-metadata-utility-tool-svcutil-exe.md) can improve start-up performance for these applications by generating the necessary serialization code from the compiled assemblies for the application. For more information, see [How to: Improve the Startup Time of WCF Client Applications using the XmlSerializer](startup-time-of-wcf-client-applications-using-the-xmlserializer.md). diff --git a/docs/framework/wcf/feature-details/migrating-wse-3-0-web-services-to-wcf.md b/docs/framework/wcf/feature-details/migrating-wse-3-0-web-services-to-wcf.md index 3dbd822b493b7..ed8373515f236 100644 --- a/docs/framework/wcf/feature-details/migrating-wse-3-0-web-services-to-wcf.md +++ b/docs/framework/wcf/feature-details/migrating-wse-3-0-web-services-to-wcf.md @@ -75,7 +75,7 @@ The benefits of migrating WSE 3.0 Web services to Windows Communication Foundati When there is not a WCF authentication mode that is equivalent to a custom policy assertion that secures SOAP messages, derive a class from , or WCF classes and specify the equivalent binding element. For more details, see [How to: Create a Custom Binding Using the SecurityBindingElement](how-to-create-a-custom-binding-using-the-securitybindingelement.md). - To convert a custom policy assertion that does not secure a SOAP message, see [Filtering](filtering.md) and the sample [Custom Message Interceptor](../samples/custom-message-interceptor.md). + To convert a custom policy assertion that does not secure a SOAP message, see [Filtering](filtering.md) and the sample [Custom Message Interceptor](/previous-versions/dotnet/framework/wcf/samples/custom-message-interceptor). ### WSE 3.0 Custom Security Token @@ -120,7 +120,7 @@ The benefits of migrating WSE 3.0 Web services to Windows Communication Foundati ### TCP - By default, WSE 3.0 clients and Web services that send SOAP messages using the TCP transport do not interoperate with WCF clients and Web services. This incompatibility is due to differences in the framing used in the TCP protocol and for performance reasons. However, a WCF sample details how to implement a custom TCP session that interoperates with WSE 3.0. For details about this sample, see [Transport: WSE 3.0 TCP Interoperability](../samples/transport-wse-3-0-tcp-interoperability.md). + By default, WSE 3.0 clients and Web services that send SOAP messages using the TCP transport do not interoperate with WCF clients and Web services. This incompatibility is due to differences in the framing used in the TCP protocol and for performance reasons. However, a WCF sample details how to implement a custom TCP session that interoperates with WSE 3.0. For details about this sample, see [Transport: WSE 3.0 TCP Interoperability](/previous-versions/dotnet/framework/wcf/samples/transport-wse-3-0-tcp-interoperability). To specify that a WCF application uses the TCP transport, use the [\](../../configure-apps/file-schema/wcf/nettcpbinding.md). diff --git a/docs/framework/wcf/feature-details/one-way-services.md b/docs/framework/wcf/feature-details/one-way-services.md index 2456aa7ce78a0..9c93cd04d152e 100644 --- a/docs/framework/wcf/feature-details/one-way-services.md +++ b/docs/framework/wcf/feature-details/one-way-services.md @@ -37,7 +37,7 @@ public interface IOneWayCalculator } ``` - For a complete example, see the [One-Way](../samples/one-way.md) sample. + For a complete example, see the [One-Way](/previous-versions/dotnet/framework/wcf/samples/one-way) sample. ## Clients Blocking with One-Way Operations @@ -53,4 +53,4 @@ public interface IOneWayCalculator ## See also -- [One-Way](../samples/one-way.md) +- [One-Way](/previous-versions/dotnet/framework/wcf/samples/one-way) diff --git a/docs/framework/wcf/feature-details/ordered-processing-of-messages-in-single-concurrency-mode.md b/docs/framework/wcf/feature-details/ordered-processing-of-messages-in-single-concurrency-mode.md index 27bc873257807..39504faf67ec9 100644 --- a/docs/framework/wcf/feature-details/ordered-processing-of-messages-in-single-concurrency-mode.md +++ b/docs/framework/wcf/feature-details/ordered-processing-of-messages-in-single-concurrency-mode.md @@ -25,4 +25,4 @@ WCF makes no guarantees about the order in which messages are processed, unless ## See also - [Sessions, Instancing, and Concurrency](sessions-instancing-and-concurrency.md) -- [Concurrency](../samples/concurrency.md) +- [Concurrency](/previous-versions/dotnet/framework/wcf/samples/concurrency) diff --git a/docs/framework/wcf/feature-details/poison-message-handling.md b/docs/framework/wcf/feature-details/poison-message-handling.md index e41dcfafab4db..d9c2cadca57cd 100644 --- a/docs/framework/wcf/feature-details/poison-message-handling.md +++ b/docs/framework/wcf/feature-details/poison-message-handling.md @@ -60,7 +60,7 @@ The following are the maximum number of delivery attempts made for a message: When the service determines that a message is poison, the queued transport throws a that contains the `LookupId` of the poison message. - A receiving application can implement the interface to handle any errors that the application requires. For more information, see [Extending Control Over Error Handling and Reporting](../samples/extending-control-over-error-handling-and-reporting.md). + A receiving application can implement the interface to handle any errors that the application requires. For more information, see [Extending Control Over Error Handling and Reporting](/previous-versions/dotnet/framework/wcf/samples/extending-control-over-error-handling-and-reporting). The application may require some kind of automated handling of poison messages that moves the poison messages to a poison message queue so that the service can access the rest of the messages in the queue. The only scenario for using the error-handler mechanism to listen for poison-message exceptions is when the setting is set to . The poison-message sample for Message Queuing 3.0 demonstrates this behavior. The following outlines the steps to take to handle poison messages, including best practices: @@ -76,7 +76,7 @@ The following are the maximum number of delivery attempts made for a message: 4. Ensure that your service is annotated with the poison behavior attribute. - In addition, if the `ReceiveErrorHandling` is set to `Fault`, the `ServiceHost` faults when encountering the poison message. You can hook up to the faulted event and shut down the service, take corrective actions, and restart. For example, the `LookupId` in the propagated to the `IErrorHandler` can be noted and when the service host faults, you could use the `System.Messaging` API to receive the message from the queue using the `LookupId` to remove the message from the queue and store the message in some external store or another queue. You can then restart `ServiceHost` to resume normal processing. The [Poison Message Handling in MSMQ 4.0](../samples/poison-message-handling-in-msmq-4-0.md) demonstrates this behavior. + In addition, if the `ReceiveErrorHandling` is set to `Fault`, the `ServiceHost` faults when encountering the poison message. You can hook up to the faulted event and shut down the service, take corrective actions, and restart. For example, the `LookupId` in the propagated to the `IErrorHandler` can be noted and when the service host faults, you could use the `System.Messaging` API to receive the message from the queue using the `LookupId` to remove the message from the queue and store the message in some external store or another queue. You can then restart `ServiceHost` to resume normal processing. The [Poison Message Handling in MSMQ 4.0](/previous-versions/dotnet/framework/wcf/samples/poison-message-handling-in-msmq-4-0) demonstrates this behavior. ## Transaction Time-Out and Poison Messages diff --git a/docs/framework/wcf/feature-details/queues-overview.md b/docs/framework/wcf/feature-details/queues-overview.md index 1bab6f9c46016..3747d7d687020 100644 --- a/docs/framework/wcf/feature-details/queues-overview.md +++ b/docs/framework/wcf/feature-details/queues-overview.md @@ -77,10 +77,10 @@ This section introduces the general and core concepts behind queued communicatio ## See also - [Queuing in WCF](queuing-in-wcf.md) -- [Sessions and Queues](../samples/sessions-and-queues.md) -- [Dead Letter Queues](../samples/dead-letter-queues.md) -- [Volatile Queued Communication](../samples/volatile-queued-communication.md) -- [Windows Communication Foundation to Message Queuing](../samples/wcf-to-message-queuing.md) -- [Installing Message Queuing (MSMQ)](../samples/installing-message-queuing-msmq.md) -- [Message Queuing to Windows Communication Foundation](../samples/message-queuing-to-wcf.md) -- [Message Security over Message Queuing](../samples/message-security-over-message-queuing.md) +- [Sessions and Queues](/previous-versions/dotnet/framework/wcf/samples/sessions-and-queues) +- [Dead Letter Queues](/previous-versions/dotnet/framework/wcf/samples/dead-letter-queues) +- [Volatile Queued Communication](/previous-versions/dotnet/framework/wcf/samples/volatile-queued-communication) +- [Windows Communication Foundation to Message Queuing](/previous-versions/dotnet/framework/wcf/samples/wcf-to-message-queuing) +- [Installing Message Queuing (MSMQ)](/previous-versions/dotnet/framework/wcf/samples/installing-message-queuing-msmq) +- [Message Queuing to Windows Communication Foundation](/previous-versions/dotnet/framework/wcf/samples/message-queuing-to-wcf) +- [Message Security over Message Queuing](/previous-versions/dotnet/framework/wcf/samples/message-security-over-message-queuing) diff --git a/docs/framework/wcf/feature-details/queuing-in-wcf.md b/docs/framework/wcf/feature-details/queuing-in-wcf.md index dd7a68d3eb146..1117467eb7657 100644 --- a/docs/framework/wcf/feature-details/queuing-in-wcf.md +++ b/docs/framework/wcf/feature-details/queuing-in-wcf.md @@ -18,7 +18,7 @@ This section describes how to use queued communication in Windows Communication Caveats about queued binding in WCF include: -- All service operations must be one-way because the default queued binding in WCF does not support duplex communication using queues. A two-way communication sample ([Two-Way Communication](../samples/two-way-communication.md)) illustrates how to use two one-way contracts to implement duplex communication using queues. +- All service operations must be one-way because the default queued binding in WCF does not support duplex communication using queues. A two-way communication sample ([Two-Way Communication](/previous-versions/dotnet/framework/wcf/samples/two-way-communication)) illustrates how to use two one-way contracts to implement duplex communication using queues. - To generate a WCF client using metadata exchange requires an additional HTTP endpoint on the service so that it can be queried directly to generate the WCF client and obtain binding information to appropriately configure queued communication. @@ -36,7 +36,7 @@ This section describes how to use queued communication in Windows Communication MSMQ queues can also be secured using a Windows identity registered with the Active Directory directory service. When installing MSMQ, you can install Active Directory integration, which requires the computer to be part of a Windows domain network. - For more information about MSMQ, see [Installing Message Queuing (MSMQ)](../samples/installing-message-queuing-msmq.md). + For more information about MSMQ, see [Installing Message Queuing (MSMQ)](/previous-versions/dotnet/framework/wcf/samples/installing-message-queuing-msmq). ### NetMsmqBinding @@ -117,19 +117,19 @@ This section describes how to use queued communication in Windows Communication For a completed code sample illustrating the use of MSMQ in WCF see the following topics: -- [Transacted MSMQ Binding](../samples/transacted-msmq-binding.md) +- [Transacted MSMQ Binding](/previous-versions/dotnet/framework/wcf/samples/transacted-msmq-binding) -- [Volatile Queued Communication](../samples/volatile-queued-communication.md) +- [Volatile Queued Communication](/previous-versions/dotnet/framework/wcf/samples/volatile-queued-communication) -- [Dead Letter Queues](../samples/dead-letter-queues.md) +- [Dead Letter Queues](/previous-versions/dotnet/framework/wcf/samples/dead-letter-queues) -- [Sessions and Queues](../samples/sessions-and-queues.md) +- [Sessions and Queues](/previous-versions/dotnet/framework/wcf/samples/sessions-and-queues) -- [Two-Way Communication](../samples/two-way-communication.md) +- [Two-Way Communication](/previous-versions/dotnet/framework/wcf/samples/two-way-communication) -- [SRMP](../samples/srmp.md) +- [SRMP](/previous-versions/dotnet/framework/wcf/samples/srmp) -- [Message Security over Message Queuing](../samples/message-security-over-message-queuing.md) +- [Message Security over Message Queuing](/previous-versions/dotnet/framework/wcf/samples/message-security-over-message-queuing) ## See also diff --git a/docs/framework/wcf/feature-details/reliable-sessions-overview.md b/docs/framework/wcf/feature-details/reliable-sessions-overview.md index 2d82c3b35b1f0..eb99670dd06c6 100644 --- a/docs/framework/wcf/feature-details/reliable-sessions-overview.md +++ b/docs/framework/wcf/feature-details/reliable-sessions-overview.md @@ -124,4 +124,4 @@ If your scenario has any of the following characteristics, then you must serious ## See also - [Using Bindings to Configure Services and Clients](../using-bindings-to-configure-services-and-clients.md) -- [WS Reliable Session](../samples/ws-reliable-session.md) +- [WS Reliable Session](/previous-versions/dotnet/framework/wcf/samples/ws-reliable-session) diff --git a/docs/framework/wcf/feature-details/securing-messages-using-message-security.md b/docs/framework/wcf/feature-details/securing-messages-using-message-security.md index 9e2da7bbdef6c..a631cb1f0a355 100644 --- a/docs/framework/wcf/feature-details/securing-messages-using-message-security.md +++ b/docs/framework/wcf/feature-details/securing-messages-using-message-security.md @@ -68,6 +68,6 @@ This section discusses WCF message security when using . - A WCF service verifies that all messages it receives were addressed to the particular queue it is listening on. If the message’s destination queue does not match the queue it is found in, the service does not process the message. This is an issue that services listening to a dead-letter queue must address because any message in the dead-letter queue was meant to be delivered elsewhere. To read messages from a dead-letter queue, or from a poison queue, a `ServiceBehavior` with the parameter must be used. For an example, see [Dead Letter Queues](../samples/dead-letter-queues.md). + A WCF service verifies that all messages it receives were addressed to the particular queue it is listening on. If the message’s destination queue does not match the queue it is found in, the service does not process the message. This is an issue that services listening to a dead-letter queue must address because any message in the dead-letter queue was meant to be delivered elsewhere. To read messages from a dead-letter queue, or from a poison queue, a `ServiceBehavior` with the parameter must be used. For an example, see [Dead Letter Queues](/previous-versions/dotnet/framework/wcf/samples/dead-letter-queues). ## MsmqIntegrationBinding and Service Addressing diff --git a/docs/framework/wcf/feature-details/service-identity-and-authentication.md b/docs/framework/wcf/feature-details/service-identity-and-authentication.md index 8a4a50f2be870..7d8b45523ec70 100644 --- a/docs/framework/wcf/feature-details/service-identity-and-authentication.md +++ b/docs/framework/wcf/feature-details/service-identity-and-authentication.md @@ -13,7 +13,7 @@ ms.assetid: a4c8f52c-5b30-45c4-a545-63244aba82be A service's *endpoint identity* is a value generated from the service Web Services Description Language (WSDL). This value, propagated to any client, is used to authenticate the service. After the client initiates a communication to an endpoint and the service authenticates itself to the client, the client compares the endpoint identity value with the actual value the endpoint authentication process returned. If they match, the client is assured it has contacted the expected service endpoint. This functions as a protection against *phishing* by preventing a client from being redirected to an endpoint hosted by a malicious service. - For a sample application that demonstrates identity setting, see [Service Identity Sample](../samples/service-identity-sample.md). For more information about endpoints and endpoint addresses, see [Addresses](endpoint-addresses.md). + For a sample application that demonstrates identity setting, see [Service Identity Sample](/previous-versions/dotnet/framework/wcf/samples/service-identity-sample). For more information about endpoints and endpoint addresses, see [Addresses](endpoint-addresses.md). > [!NOTE] > When you use NT LanMan (NTLM) for authentication, the service identity is not checked because, under NTLM, the client is unable to authenticate the server. NTLM is used when computers are part of a Windows workgroup, or when running an older version of Windows that does not support Kerberos authentication. diff --git a/docs/framework/wcf/feature-details/sessions-instancing-and-concurrency.md b/docs/framework/wcf/feature-details/sessions-instancing-and-concurrency.md index fe0070afa69b0..95eeefe5fd02f 100644 --- a/docs/framework/wcf/feature-details/sessions-instancing-and-concurrency.md +++ b/docs/framework/wcf/feature-details/sessions-instancing-and-concurrency.md @@ -114,6 +114,6 @@ public class CalculatorService : ICalculatorConcurrency - [Using Sessions](../using-sessions.md) - [How to: Create a Service That Requires Sessions](how-to-create-a-service-that-requires-sessions.md) - [How to: Control Service Instancing](how-to-control-service-instancing.md) -- [Concurrency](../samples/concurrency.md) -- [Instancing](../samples/instancing.md) -- [Session](../samples/session.md) +- [Concurrency](/previous-versions/dotnet/framework/wcf/samples/concurrency) +- [Instancing](/previous-versions/dotnet/framework/wcf/samples/instancing) +- [Session](/previous-versions/dotnet/framework/wcf/samples/session) diff --git a/docs/framework/wcf/feature-details/stand-alone-json-serialization.md b/docs/framework/wcf/feature-details/stand-alone-json-serialization.md index dc2a257483881..bedd73698a93a 100644 --- a/docs/framework/wcf/feature-details/stand-alone-json-serialization.md +++ b/docs/framework/wcf/feature-details/stand-alone-json-serialization.md @@ -82,7 +82,7 @@ All collections, dictionaries, and arrays are represented in JSON as arrays. - If you would like to work with JSON directly (accessing keys and values dynamically, without pre-defining a rigid contract), you have several options: - - Consider using the [Weakly-typed JSON Serialization (AJAX)](../samples/weakly-typed-json-serialization-sample.md) sample. + - Consider using the [Weakly-typed JSON Serialization (AJAX)](/previous-versions/dotnet/framework/wcf/samples/weakly-typed-json-serialization-sample) sample. - Consider using the interface and deserialization constructors - these two mechanisms allow you to access JSON key/value pairs on serialization and deserialization respectively, but do not work in partial trust scenarios. diff --git a/docs/framework/wcf/feature-details/transport-security-with-an-anonymous-client.md b/docs/framework/wcf/feature-details/transport-security-with-an-anonymous-client.md index 9d577582f5280..853ec5a8a0aa8 100644 --- a/docs/framework/wcf/feature-details/transport-security-with-an-anonymous-client.md +++ b/docs/framework/wcf/feature-details/transport-security-with-an-anonymous-client.md @@ -11,7 +11,7 @@ ms.assetid: 056653a5-384e-4a02-ae3c-1b0157d2ccb4 This Windows Communication Foundation (WCF) scenario uses transport security (HTTPS) to ensure confidentiality and integrity. The server must be authenticated with a Secure Sockets Layer (SSL) certificate, and the clients must trust the server's certificate. The client is not authenticated by any mechanism and is, therefore, anonymous. -For a sample application, see [WS Transport Security](../samples/ws-transport-security.md). For more information about transport security, see [Transport Security Overview](transport-security-overview.md). +For a sample application, see [WS Transport Security](/previous-versions/dotnet/framework/wcf/samples/ws-transport-security). For more information about transport security, see [Transport Security Overview](transport-security-overview.md). For more information about using a certificate with a service, see [Working with Certificates](working-with-certificates.md) and [How to: Configure a Port with an SSL Certificate](how-to-configure-a-port-with-an-ssl-certificate.md). @@ -119,6 +119,6 @@ The following configuration can be used instead of the code to set up the servic ## See also - [Security Overview](security-overview.md) -- [WS Transport Security](../samples/ws-transport-security.md) +- [WS Transport Security](/previous-versions/dotnet/framework/wcf/samples/ws-transport-security) - [Transport Security Overview](transport-security-overview.md) - [Security Model for Windows Server App Fabric](/previous-versions/appfabric/ee677202(v=azure.10)) diff --git a/docs/framework/wcf/feature-details/uritemplate-and-uritemplatetable.md b/docs/framework/wcf/feature-details/uritemplate-and-uritemplatetable.md index 2a5a147b72e70..70632b4a68bbd 100644 --- a/docs/framework/wcf/feature-details/uritemplate-and-uritemplatetable.md +++ b/docs/framework/wcf/feature-details/uritemplate-and-uritemplatetable.md @@ -335,6 +335,6 @@ When a variable is given a default value of `null` there are some additional con - [WCF Web HTTP Programming Model Overview](wcf-web-http-programming-model-overview.md) - [WCF Web HTTP Programming Object Model](wcf-web-http-programming-object-model.md) -- [UriTemplate](../samples/uritemplate-sample.md) -- [UriTemplate Table](../samples/uritemplate-table-sample.md) -- [UriTemplate Table Dispatcher](../samples/uritemplate-table-dispatcher-sample.md) +- [UriTemplate](/previous-versions/dotnet/framework/wcf/samples/uritemplate-sample) +- [UriTemplate Table](/previous-versions/dotnet/framework/wcf/samples/uritemplate-table-sample) +- [UriTemplate Table Dispatcher](/previous-versions/dotnet/framework/wcf/samples/uritemplate-table-dispatcher-sample) diff --git a/docs/framework/wcf/feature-details/using-a-data-contract-resolver.md b/docs/framework/wcf/feature-details/using-a-data-contract-resolver.md index ebfb522de9bbb..2493a64d9780b 100644 --- a/docs/framework/wcf/feature-details/using-a-data-contract-resolver.md +++ b/docs/framework/wcf/feature-details/using-a-data-contract-resolver.md @@ -82,10 +82,10 @@ if (serializerBehavior == null) SerializerBehavior.DataContractResolver = new MyCustomerResolver(); ``` - You can declaratively specify a data contract resolver by implementing an attribute that can be applied to a service. For more information, see the [KnownAssemblyAttribute](../samples/knownassemblyattribute.md) sample. This sample implements an attribute called "KnownAssembly" that adds a custom data contract resolver to the service’s behavior. + You can declaratively specify a data contract resolver by implementing an attribute that can be applied to a service. For more information, see the [KnownAssemblyAttribute](/previous-versions/dotnet/framework/wcf/samples/knownassemblyattribute) sample. This sample implements an attribute called "KnownAssembly" that adds a custom data contract resolver to the service’s behavior. ## See also - [Data Contract Known Types](data-contract-known-types.md) -- [DataContractSerializer Sample](../samples/datacontractserializer-sample.md) -- [KnownAssemblyAttribute](../samples/knownassemblyattribute.md) +- [DataContractSerializer Sample](/previous-versions/dotnet/framework/wcf/samples/datacontractserializer-sample) +- [KnownAssemblyAttribute](/previous-versions/dotnet/framework/wcf/samples/knownassemblyattribute) diff --git a/docs/framework/wcf/feature-details/using-data-contracts.md b/docs/framework/wcf/feature-details/using-data-contracts.md index 44f6f29094a3d..97985d6a9c809 100644 --- a/docs/framework/wcf/feature-details/using-data-contracts.md +++ b/docs/framework/wcf/feature-details/using-data-contracts.md @@ -63,7 +63,7 @@ A *data contract* is a formal agreement between a service and a client that abst [!code-csharp[C_DataContract#4](../../../../samples/snippets/csharp/VS_Snippets_CFX/c_datacontract/cs/source.cs#4)] [!code-vb[C_DataContract#4](../../../../samples/snippets/visualbasic/VS_Snippets_CFX/c_datacontract/vb/source.vb#4)] - For a complete code sample of a WCF service that defines a data contract see the [Basic Data Contract](../samples/basic-data-contract.md) sample. + For a complete code sample of a WCF service that defines a data contract see the [Basic Data Contract](/previous-versions/dotnet/framework/wcf/samples/basic-data-contract) sample. ## See also diff --git a/docs/framework/wcf/feature-details/wcf-services-and-aspnet.md b/docs/framework/wcf/feature-details/wcf-services-and-aspnet.md index 00ea0f46123b3..3b9a82f0047ab 100644 --- a/docs/framework/wcf/feature-details/wcf-services-and-aspnet.md +++ b/docs/framework/wcf/feature-details/wcf-services-and-aspnet.md @@ -96,7 +96,7 @@ The following table illustrates how the application-wide compatibility mode sett > [!NOTE] > IIS 7.0 and WAS allows WCF services to communicate over protocols other than HTTP. However, WCF services running in applications that have enabled ASP.NET compatibility mode are not permitted to expose non-HTTP endpoints. Such a configuration generates an activation exception when the service receives its first message. -For more information about enabling ASP.NET compatibility mode for WCF services, see and the [ASP.NET Compatibility](../samples/aspnet-compatibility.md) sample. +For more information about enabling ASP.NET compatibility mode for WCF services, see and the [ASP.NET Compatibility](/previous-versions/dotnet/framework/wcf/samples/aspnet-compatibility) sample. ## See also diff --git a/docs/framework/wcf/feature-details/wcf-web-http-programming-object-model.md b/docs/framework/wcf/feature-details/wcf-web-http-programming-object-model.md index b4f314e08af6d..1f091c3a5b00b 100644 --- a/docs/framework/wcf/feature-details/wcf-web-http-programming-object-model.md +++ b/docs/framework/wcf/feature-details/wcf-web-http-programming-object-model.md @@ -91,7 +91,7 @@ The WCF WEB HTTP Programming Model allows developers to expose Windows Communic is extensible by using a number of virtual methods: , , , , and . Developers can derive a class from and override these methods to customize the default behavior. - The is an example of extending . enables Windows Communication Foundation (WCF) endpoints to receive HTTP requests from a browser-based ASP.NET AJAX client. The [AJAX Service Using HTTP POST](../samples/ajax-service-using-http-post.md) is an example of using this extensibility point. + The is an example of extending . enables Windows Communication Foundation (WCF) endpoints to receive HTTP requests from a browser-based ASP.NET AJAX client. The [AJAX Service Using HTTP POST](/previous-versions/dotnet/framework/wcf/samples/ajax-service-using-http-post) is an example of using this extensibility point. > [!WARNING] > When using the , are not supported within or attributes. diff --git a/docs/framework/wcf/feature-details/working-with-certificates.md b/docs/framework/wcf/feature-details/working-with-certificates.md index a9160a6847635..091348159f6b7 100644 --- a/docs/framework/wcf/feature-details/working-with-certificates.md +++ b/docs/framework/wcf/feature-details/working-with-certificates.md @@ -86,7 +86,7 @@ You can also set the property using configuration. The following elements are us The `CertificateValidationMode` property also enables you to customize how certificates are authenticated. By default, the level is set to `ChainTrust`. To use the value, you must also set the `CustomCertificateValidatorType` attribute to an assembly and type used to validate the certificate. To create a custom validator, you must inherit from the abstract class. -When creating a custom authenticator, the most important method to override is the method. For an example of custom authentication, see the [X.509 Certificate Validator](../samples/x-509-certificate-validator.md) sample. For more information, see [Custom Credential and Credential Validation](../extending/custom-credential-and-credential-validation.md). +When creating a custom authenticator, the most important method to override is the method. For an example of custom authentication, see the [X.509 Certificate Validator](/previous-versions/dotnet/framework/wcf/samples/x-509-certificate-validator) sample. For more information, see [Custom Credential and Credential Validation](../extending/custom-credential-and-credential-validation.md). ## Using the PowerShell New-SelfSignedCertificate Cmdlet to Build a Certificate Chain diff --git a/docs/framework/wcf/feature-details/wsdl-and-policy.md b/docs/framework/wcf/feature-details/wsdl-and-policy.md index 89bb2dc1a4c9d..747adcfb8754f 100644 --- a/docs/framework/wcf/feature-details/wsdl-and-policy.md +++ b/docs/framework/wcf/feature-details/wsdl-and-policy.md @@ -73,6 +73,6 @@ This topic covers Windows Communication Foundation (WCF) WSDL 1.1, WS-Policy and ## See also -- [Custom WSDL Publication](../samples/custom-wsdl-publication.md) +- [Custom WSDL Publication](/previous-versions/dotnet/framework/wcf/samples/custom-wsdl-publication) - [How to: Export Custom WSDL](../extending/how-to-export-custom-wsdl.md) - [How to: Import Custom WSDL](../extending/how-to-import-custom-wsdl.md) diff --git a/docs/framework/wcf/find-private-key-tool-findprivatekey-exe.md b/docs/framework/wcf/find-private-key-tool-findprivatekey-exe.md index 942496bb0167e..57dfdbfcde9fa 100644 --- a/docs/framework/wcf/find-private-key-tool-findprivatekey-exe.md +++ b/docs/framework/wcf/find-private-key-tool-findprivatekey-exe.md @@ -9,7 +9,7 @@ ms.topic: reference This command-line tool can be used to retrieve a private key from a certificate store. For example, *FindPrivateKey.exe* can be used to find the location and name of the private key file associated with a specific X.509 certificate in the certificate store. > [!IMPORTANT] -> The FindPrivateKey tool is shipped as a WCF sample. For more information about where to find the sample and how to build it, see [FindPrivateKey](./samples/findprivatekey.md). +> The FindPrivateKey tool is shipped as a WCF sample. For more information about where to find the sample and how to build it, see [FindPrivateKey](/previous-versions/dotnet/framework/wcf/samples/findprivatekey). ## Syntax diff --git a/docs/framework/wcf/getting-started-tutorial.md b/docs/framework/wcf/getting-started-tutorial.md index 23cb7c5d38a8e..8a8e5d86a77e1 100644 --- a/docs/framework/wcf/getting-started-tutorial.md +++ b/docs/framework/wcf/getting-started-tutorial.md @@ -14,7 +14,7 @@ The following series of tutorials introduce you to the Windows Communication Fou The tutorial assumes you're using Visual Studio as the development environment. If you're using another development environment, ignore the Visual Studio-specific instructions. -For sample WCF applications that you can download and run, see [Windows Communication Foundation samples](samples/index.md). For an introduction to the samples, see [Getting started sample](samples/getting-started-sample.md). +For sample WCF applications that you can download and run, see [Windows Communication Foundation samples](/previous-versions/dotnet/framework/wcf/samples/index). For an introduction to the samples, see [Getting started sample](/previous-versions/dotnet/framework/wcf/samples/getting-started-sample). For more in-depth information about creating services and clients, see [Basic WCF programming](basic-wcf-programming.md). @@ -64,6 +64,6 @@ The next two tutorials describe how to create, configure, and use a client appli - [How to: Use Svcutil.exe to download metadata documents](feature-details/how-to-use-svcutil-exe-to-download-metadata-documents.md) - [How to: Publish metadata for a service using a configuration file](feature-details/how-to-publish-metadata-for-a-service-using-a-configuration-file.md) - [Using bindings to configure services and clients](using-bindings-to-configure-services-and-clients.md) -- [Getting started sample](samples/getting-started-sample.md) -- [Windows Communication Foundation samples](samples/index.md) -- [Self-Host](samples/self-host.md) +- [Getting started sample](/previous-versions/dotnet/framework/wcf/samples/getting-started-sample) +- [Windows Communication Foundation samples](/previous-versions/dotnet/framework/wcf/samples/index) +- [Self-Host](/previous-versions/dotnet/framework/wcf/samples/self-host) diff --git a/docs/framework/wcf/guide-to-the-documentation.md b/docs/framework/wcf/guide-to-the-documentation.md index ec127571f6609..4837a9ac21216 100644 --- a/docs/framework/wcf/guide-to-the-documentation.md +++ b/docs/framework/wcf/guide-to-the-documentation.md @@ -13,7 +13,7 @@ Provided here is guidance about the Windows Communication Foundation (WCF) docum ## New to Windows Communication Foundation Programming -- If you are new to programming with WCF and you just want to see sample applications that work, see the topics listed in [Windows Communication Foundation Samples](./samples/index.md). +- If you are new to programming with WCF and you just want to see sample applications that work, see the topics listed in [Windows Communication Foundation Samples](/previous-versions/dotnet/framework/wcf/samples/index). - For a tutorial that walks through the basic steps of creating a WCF service and client, see [Getting Started Tutorial](getting-started-tutorial.md). @@ -59,7 +59,7 @@ Provided here is guidance about the Windows Communication Foundation (WCF) docum ## See also -- [Windows Communication Foundation Samples](./samples/index.md) +- [Windows Communication Foundation Samples](/previous-versions/dotnet/framework/wcf/samples/index) - [Conceptual Overview](conceptual-overview.md) - [Guidelines and Best Practices](guidelines-and-best-practices.md) - [Building Clients](building-clients.md) diff --git a/docs/framework/wcf/guidelines-and-best-practices.md b/docs/framework/wcf/guidelines-and-best-practices.md index 589fb5b08811b..fb91ee8f3e3c4 100644 --- a/docs/framework/wcf/guidelines-and-best-practices.md +++ b/docs/framework/wcf/guidelines-and-best-practices.md @@ -46,6 +46,6 @@ This section contains topics that provide guidelines for creating Windows Commun ## See also - [What Is Windows Communication Foundation](whats-wcf.md) -- [Windows Communication Foundation (WCF) samples](./samples/index.md) +- [Windows Communication Foundation (WCF) samples](/previous-versions/dotnet/framework/wcf/samples/index) - [Conceptual Overview](conceptual-overview.md) - [Building Clients](building-clients.md) diff --git a/docs/framework/wcf/how-to-host-a-wcf-service-in-a-managed-application.md b/docs/framework/wcf/how-to-host-a-wcf-service-in-a-managed-application.md index 50323b1983a73..e55d541bbbb7d 100644 --- a/docs/framework/wcf/how-to-host-a-wcf-service-in-a-managed-application.md +++ b/docs/framework/wcf/how-to-host-a-wcf-service-in-a-managed-application.md @@ -58,7 +58,7 @@ The following procedure demonstrates how to implement a self-hosted service in a [!code-vb[CFX_SelfHost4#4](../../../samples/snippets/visualbasic/VS_Snippets_CFX/cfx_selfhost4/vb/module1.vb#4)] > [!NOTE] - > This example uses default endpoints, and no configuration file is required for this service. If no endpoints are configured, then the runtime creates one endpoint for each base address for each service contract implemented by the service. For more information about default endpoints, see [Simplified Configuration](simplified-configuration.md) and [Simplified Configuration for WCF Services](./samples/simplified-configuration-for-wcf-services.md). + > This example uses default endpoints, and no configuration file is required for this service. If no endpoints are configured, then the runtime creates one endpoint for each base address for each service contract implemented by the service. For more information about default endpoints, see [Simplified Configuration](simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services). 7. Press **Ctrl**+**Shift**+**B** to build the solution. @@ -95,7 +95,7 @@ The following example creates a object to - - - [How to: Host a WCF Service in IIS](./feature-details/how-to-host-a-wcf-service-in-iis.md) -- [Self-Host](./samples/self-host.md) +- [Self-Host](/previous-versions/dotnet/framework/wcf/samples/self-host) - [Hosting Services](hosting-services.md) - [How to: Define a Service Contract](how-to-define-a-wcf-service-contract.md) - [How to: Implement a Service Contract](how-to-implement-a-wcf-contract.md) diff --git a/docs/framework/wcf/how-to-host-and-run-a-basic-wcf-service.md b/docs/framework/wcf/how-to-host-and-run-a-basic-wcf-service.md index c78b07d05797a..d5df6050824e2 100644 --- a/docs/framework/wcf/how-to-host-and-run-a-basic-wcf-service.md +++ b/docs/framework/wcf/how-to-host-and-run-a-basic-wcf-service.md @@ -208,11 +208,11 @@ The steps in the code you added to host the service are described as follows: - **Step 3**: Create a instance. A service endpoint is composed of an address, a binding, and a service contract. The constructor is composed of the service contract interface type, a binding, and an address. The service contract is `ICalculator`, which you defined and implement in the service type. The binding for this sample is , which is a built-in binding and connects to endpoints that conform to the WS-* specifications. For more information about WCF bindings, see [WCF bindings overview](bindings-overview.md). You append the address to the base address to identify the endpoint. The code specifies the address as CalculatorService and the fully qualified address for the endpoint as `http://localhost:8000/GettingStarted/CalculatorService`. > [!IMPORTANT] - > For .NET Framework Version 4 and later, adding a service endpoint is optional. For these versions, if you don't add your code or configuration, WCF adds one default endpoint for each combination of base address and contract implemented by the service. For more information about default endpoints, see [Specifying an endpoint address](specifying-an-endpoint-address.md). For more information about default endpoints, bindings, and behaviors, see [Simplified configuration](simplified-configuration.md) and [Simplified configuration for WCF services](samples/simplified-configuration-for-wcf-services.md). + > For .NET Framework Version 4 and later, adding a service endpoint is optional. For these versions, if you don't add your code or configuration, WCF adds one default endpoint for each combination of base address and contract implemented by the service. For more information about default endpoints, see [Specifying an endpoint address](specifying-an-endpoint-address.md). For more information about default endpoints, bindings, and behaviors, see [Simplified configuration](simplified-configuration.md) and [Simplified configuration for WCF services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services). - **Step 4**: Enable metadata exchange. Clients use metadata exchange to generate proxies for calling the service operations. To enable metadata exchange, create a instance, set its property to `true`, and add the `ServiceMetadataBehavior` object to the collection of the instance. -- **Step 5**: Open to listen for incoming messages. The application waits for you to press **Enter**. After the application instantiates , it executes a try/catch block. For more information about safely catching exceptions thrown by , see [Use Close and Abort to release WCF client resources](samples/use-close-abort-release-wcf-client-resources.md). +- **Step 5**: Open to listen for incoming messages. The application waits for you to press **Enter**. After the application instantiates , it executes a try/catch block. For more information about safely catching exceptions thrown by , see [Use Close and Abort to release WCF client resources](/previous-versions/dotnet/framework/wcf/samples/use-close-abort-release-wcf-client-resources). > [!IMPORTANT] > When you add a WCF service library, Visual Studio hosts it for you if you debug it by starting a service host. To avoid conflicts, you can prevent Visual Studio from hosting the WCF service library. diff --git a/docs/framework/wcf/how-to-impersonate-a-client-on-a-service.md b/docs/framework/wcf/how-to-impersonate-a-client-on-a-service.md index 9ac7ec5b3724e..b4fce04617663 100644 --- a/docs/framework/wcf/how-to-impersonate-a-client-on-a-service.md +++ b/docs/framework/wcf/how-to-impersonate-a-client-on-a-service.md @@ -13,7 +13,7 @@ ms.assetid: 431db851-a75b-4009-9fe2-247243d810d3 --- # How to: Impersonate a Client on a Service -Impersonating a client on a Windows Communication Foundation (WCF) service enables the service to perform actions on behalf of the client. For actions subject to access control list (ACL) checks, such as access to directories and files on a machine or access to a SQL Server database, the ACL check is against the client user account. This topic shows the basic steps required to enable a client in a Windows domain to set a client impersonation level. For a working example of this, see [Impersonating the Client](./samples/impersonating-the-client.md). For more information about client impersonation, see [Delegation and Impersonation](./feature-details/delegation-and-impersonation-with-wcf.md). +Impersonating a client on a Windows Communication Foundation (WCF) service enables the service to perform actions on behalf of the client. For actions subject to access control list (ACL) checks, such as access to directories and files on a machine or access to a SQL Server database, the ACL check is against the client user account. This topic shows the basic steps required to enable a client in a Windows domain to set a client impersonation level. For a working example of this, see [Impersonating the Client](/previous-versions/dotnet/framework/wcf/samples/impersonating-the-client). For more information about client impersonation, see [Delegation and Impersonation](./feature-details/delegation-and-impersonation-with-wcf.md). > [!NOTE] > When the client and service are running on the same computer and the client is running under a system account (that is, `Local System` or `Network Service`), the client cannot be impersonated when a secure session is established with stateful Security Context tokens. A WinForms or console application typically is run under the currently logged in account, so that account can be impersonated by default. However, when the client is an ASP.NET page and that page is hosted in IIS 6.0 or IIS 7.0, then the client does run under the `Network Service` account by default. All of the system-provided bindings that support secure sessions use a stateless Security Context token by default. However, if the client is an ASP.NET page and secure sessions with stateful Security Context tokens are used, the client cannot be impersonated. For more information about using stateful Security Context tokens in a secure session, see [How to: Create a Security Context Token for a Secure Session](./feature-details/how-to-create-a-security-context-token-for-a-secure-session.md). @@ -45,5 +45,5 @@ Impersonating a client on a Windows Communication Foundation (WCF) service enabl - - -- [Impersonating the Client](./samples/impersonating-the-client.md) +- [Impersonating the Client](/previous-versions/dotnet/framework/wcf/samples/impersonating-the-client) - [Delegation and Impersonation](./feature-details/delegation-and-impersonation-with-wcf.md) diff --git a/docs/framework/wcf/how-to-restrict-access-with-the-principalpermissionattribute-class.md b/docs/framework/wcf/how-to-restrict-access-with-the-principalpermissionattribute-class.md index eebbcdb684af7..b9aeafbbc245c 100644 --- a/docs/framework/wcf/how-to-restrict-access-with-the-principalpermissionattribute-class.md +++ b/docs/framework/wcf/how-to-restrict-access-with-the-principalpermissionattribute-class.md @@ -13,7 +13,7 @@ ms.assetid: 5162f5c4-8781-4cc4-9425-bb7620eaeaf4 --- # How to: Restrict Access with the PrincipalPermissionAttribute Class -Controlling the access to resources on a Windows-domain computer is a basic security task. For example, only certain users should be able to view sensitive data, such as payroll information. This topic explains how to restrict access to a method by demanding that the user belong to a predefined group. For a working sample, see [Authorizing Access to Service Operations](./samples/authorizing-access-to-service-operations.md). +Controlling the access to resources on a Windows-domain computer is a basic security task. For example, only certain users should be able to view sensitive data, such as payroll information. This topic explains how to restrict access to a method by demanding that the user belong to a predefined group. For a working sample, see [Authorizing Access to Service Operations](/previous-versions/dotnet/framework/wcf/samples/authorizing-access-to-service-operations). The task consists of two separate procedures. The first creates the group and populates it with users. The second applies the class to specify the group. @@ -86,6 +86,6 @@ Controlling the access to resources on a Windows-domain computer is a basic secu - - - -- [Authorizing Access to Service Operations](./samples/authorizing-access-to-service-operations.md) +- [Authorizing Access to Service Operations](/previous-versions/dotnet/framework/wcf/samples/authorizing-access-to-service-operations) - [Security Overview](./feature-details/security-overview.md) - [Implementing Service Contracts](implementing-service-contracts.md) diff --git a/docs/framework/wcf/how-to-secure-a-service-with-windows-credentials.md b/docs/framework/wcf/how-to-secure-a-service-with-windows-credentials.md index 2a45bc22746a8..fff900c58c83d 100644 --- a/docs/framework/wcf/how-to-secure-a-service-with-windows-credentials.md +++ b/docs/framework/wcf/how-to-secure-a-service-with-windows-credentials.md @@ -11,7 +11,7 @@ ms.assetid: d171b5ca-96ef-47ff-800c-c138023cf76e --- # How to: Secure a Service with Windows Credentials -This topic shows how to enable transport security on a Windows Communication Foundation (WCF) service that resides in a Windows domain and is called by clients in the same domain. For more information about this scenario, see [Transport Security with Windows Authentication](./feature-details/transport-security-with-windows-authentication.md). For a sample application, see the [WSHttpBinding](./samples/wshttpbinding.md) sample. +This topic shows how to enable transport security on a Windows Communication Foundation (WCF) service that resides in a Windows domain and is called by clients in the same domain. For more information about this scenario, see [Transport Security with Windows Authentication](./feature-details/transport-security-with-windows-authentication.md). For a sample application, see the [WSHttpBinding](/previous-versions/dotnet/framework/wcf/samples/wshttpbinding) sample. This topic assumes you have an existing contract interface and implementation already defined, and adds on to that. You can also modify an existing service and client. diff --git a/docs/framework/wcf/how-to-specify-a-client-binding-in-code.md b/docs/framework/wcf/how-to-specify-a-client-binding-in-code.md index ce11420cb91c6..2256c7346a219 100644 --- a/docs/framework/wcf/how-to-specify-a-client-binding-in-code.md +++ b/docs/framework/wcf/how-to-specify-a-client-binding-in-code.md @@ -15,7 +15,7 @@ In this example, a client is created to use a calculator service and the binding The client is built in two parts. Svcutil.exe generates the `ClientCalculator` that implements the `ICalculator` interface. This client application is then constructed by constructing an instance of `ClientCalculator` and then specifying the binding and the address for the service in code. - For the source copy of this example, see the [BasicBinding](./samples/basicbinding.md) sample. + For the source copy of this example, see the [BasicBinding](/previous-versions/dotnet/framework/wcf/samples/basicbinding) sample. ### To specify a custom binding in code diff --git a/docs/framework/wcf/how-to-specify-a-client-binding-in-configuration.md b/docs/framework/wcf/how-to-specify-a-client-binding-in-configuration.md index cdd5af45400a2..70bcb81e2c54e 100644 --- a/docs/framework/wcf/how-to-specify-a-client-binding-in-configuration.md +++ b/docs/framework/wcf/how-to-specify-a-client-binding-in-configuration.md @@ -16,7 +16,7 @@ In this example, a client console application is created to use a calculator ser You can perform all of the following configuration steps by using the [Configuration Editor Tool (SvcConfigEditor.exe)](configuration-editor-tool-svcconfigeditor-exe.md). - For the source copy of this example, see the [BasicBinding](./samples/basicbinding.md) sample. + For the source copy of this example, see the [BasicBinding](/previous-versions/dotnet/framework/wcf/samples/basicbinding) sample. ### Specifying a client binding in configuration diff --git a/docs/framework/wcf/how-to-specify-a-service-binding-in-configuration.md b/docs/framework/wcf/how-to-specify-a-service-binding-in-configuration.md index c830be4816335..b710b6bc29430 100644 --- a/docs/framework/wcf/how-to-specify-a-service-binding-in-configuration.md +++ b/docs/framework/wcf/how-to-specify-a-service-binding-in-configuration.md @@ -15,7 +15,7 @@ In this example, an `ICalculator` contract is defined for a basic calculator ser All of the following configuration steps can be undertaken using the [Configuration Editor Tool (SvcConfigEditor.exe)](configuration-editor-tool-svcconfigeditor-exe.md). - For the source copy of this example, see [BasicBinding](./samples/basicbinding.md). + For the source copy of this example, see [BasicBinding](/previous-versions/dotnet/framework/wcf/samples/basicbinding). ## To specify the BasicHttpBinding to use to configure the service diff --git a/docs/framework/wcf/index.md b/docs/framework/wcf/index.md index c3f6f8041c29d..5c995e771d721 100644 --- a/docs/framework/wcf/index.md +++ b/docs/framework/wcf/index.md @@ -58,7 +58,7 @@ This section of the documentation provides information about Windows Communicati [Windows Communication Foundation Tools](tools.md)\ Describes WCF tools designed to make it easier to create, deploy, and manage WCF applications - [Windows Communication Foundation Samples](./samples/index.md)\ + [Windows Communication Foundation Samples](/previous-versions/dotnet/framework/wcf/samples/index)\ Samples that provide instruction on various aspects of Windows Communication Foundation [Windows Communication Foundation Glossary](glossary.md)\ diff --git a/docs/framework/wcf/load-balancing.md b/docs/framework/wcf/load-balancing.md index f5bcc07727b30..625df07ccb160 100644 --- a/docs/framework/wcf/load-balancing.md +++ b/docs/framework/wcf/load-balancing.md @@ -74,7 +74,7 @@ One way to increase the capacity of Windows Communication Foundation (WCF) appli
    ``` - For more information about default endpoints, bindings, and behaviors, see [Simplified Configuration](simplified-configuration.md) and [Simplified Configuration for WCF Services](./samples/simplified-configuration-for-wcf-services.md). + For more information about default endpoints, bindings, and behaviors, see [Simplified Configuration](simplified-configuration.md) and [Simplified Configuration for WCF Services](/previous-versions/dotnet/framework/wcf/samples/simplified-configuration-for-wcf-services). ## Load Balancing with the WSHttp Binding and the WSDualHttp Binding diff --git a/docs/framework/wcf/samples/address-headers.md b/docs/framework/wcf/samples/address-headers.md deleted file mode 100644 index e4babdfb34fa8..0000000000000 --- a/docs/framework/wcf/samples/address-headers.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -description: "Learn more about: Address Headers" -title: "Address Headers" -ms.date: "03/30/2017" -ms.assetid: b0c94d4a-3bde-4b4d-bb6d-9f12bc3a6940 ---- - -# Address Headers - -The Address Headers sample demonstrates how clients can pass reference parameters to a service using Windows Communication Foundation (WCF). - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - -The WS-Addressing specification defines the notion of an endpoint reference as a way to address a particular Web service endpoint. In WCF, endpoint references are modeled using the `EndpointAddress` class - `EndpointAddress` is the type of the Address field of the `ServiceEndpoint` class. - -Part of the endpoint reference model is that each reference can carry some reference parameters that add extra identifying information. In WCF, these reference parameters are modeled as instances of `AddressHeader` class. - -In this sample, the client adds a reference parameter to the `EndpointAddress` of the client endpoint. The service looks for this reference parameter and uses its value in the logic of its "Hello" service operation. - -## Client - -For the client to send a reference parameter, it must add an `AddressHeader` to the `EndpointAddress` of the `ServiceEndpoint`. Because the `EndpointAddress` class is immutable, modification of an endpoint address must be done using the `EndpointAddressBuilder` class. The following code initializes the client to send a reference parameter as part of its message. - -```csharp -HelloClient client = new HelloClient(); -EndpointAddressBuilder builder = - new EndpointAddressBuilder(client.Endpoint.Address); -AddressHeader header = - AddressHeader.CreateAddressHeader(IDName, IDNamespace, "John"); -builder.Headers.Add(header); -client.Endpoint.Address = builder.ToEndpointAddress(); -``` - -The code creates an `EndpointAddressBuilder` using the original `EndpointAddress` as an initial value. It then adds a newly created address header; the call to `CreateAddressHeader` creates a header with a particular name, namespace, and value. Here the value is "John". Once the header is added to the builder, the `ToEndpointAddress()` method converts the (mutable) builder back into an (immutable) endpoint address, which is assigned back to the client endpoint's Address field. - -Now when the client calls `Console.WriteLine(client.Hello());`, the service is able to get the value of this address parameter, as seen in the resulting output of the client. - -`Hello, John` - -## Server - -The implementation of the service operation `Hello()` uses the current `OperationContext` to inspect the values of the headers on the incoming message. - -```csharp -string id = null; -// look at headers on incoming message -for (int i = 0; - i < OperationContext.Current.IncomingMessageHeaders.Count; - ++i) -{ - MessageHeaderInfo h = OperationContext.Current.IncomingMessageHeaders[i]; - // for any reference parameters with the correct name & namespace - if (h.IsReferenceParameter && - h.Name == IDName && - h.Namespace == IDNamespace) - { - // read the value of that header - XmlReader xr = OperationContext.Current.IncomingMessageHeaders.GetReaderAtHeader(i); - id = xr.ReadElementContentAsString(); - } -} -return "Hello, " + id; -``` - -The code iterates over all the headers on the incoming message, looking for headers that are reference parameters with the particular name and. When the parameter is found, it reads the value of the parameter and stores it in the "id" variable. - -#### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Client\AddressHeaders` diff --git a/docs/framework/wcf/samples/addressing.md b/docs/framework/wcf/samples/addressing.md deleted file mode 100644 index 6328683789984..0000000000000 --- a/docs/framework/wcf/samples/addressing.md +++ /dev/null @@ -1,132 +0,0 @@ ---- -description: "Learn more about: Addressing" -title: "Addressing" -ms.date: "03/30/2017" -ms.assetid: d438e6f2-d0f3-43aa-b259-b51b5bda2e64 ---- -# Addressing - -The Addressing sample demonstrates various aspects and features of endpoint addresses. The sample is based on the [Getting Started](getting-started-sample.md). In this sample the service is self-hosted. Both the service and the client are console applications. The service defines multiple endpoints using a combination of relative and absolute endpoint addresses. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - - The service configuration file specifies a base address and four endpoints. The base address is specified using the add element, under service/host/baseAddresses as demonstrated in the following sample configuration. - -```xml - - - - - - - -``` - - The first endpoint definition shown in the following sample configuration specifies a relative address, which means the endpoint address is a combination of the base address and the relative address following the rules of URI composition. - -```xml - - - -``` - - In this case, the relative address is empty (""), so the endpoint address is the same as the base address. The actual endpoint address is `http://localhost:8000/servicemodelsamples/service`. - - The second endpoint definition also specifies a relative address, as shown in the following sample configuration. - -```xml - - - - -``` - - The relative address, "test", is appended to the base address. The actual endpoint address is `http://localhost:8000/servicemodelsamples/service/test`. - - The third endpoint definition specifies an absolute address, as shown in the following sample configuration. - -```xml - -``` - - The base address plays no role in the address. The actual endpoint address is `http://localhost:8001/hello/servicemodelsamples`. - - The fourth endpoint address specifies an absolute address and a different transport—TCP. The base address plays no role in the address. The actual endpoint address is `net.tcp://localhost:9000/servicemodelsamples/service`. - -```xml - - - - - -``` - - The client accesses just one of the four service endpoints, but all four are defined in its configuration file. The client selects an endpoint when it creates the `CalculatorProxy` object. By changing the configuration name from `CalculatorEndpoint1` through `CalculatorEndpoint4`, you can exercise each of the endpoints. - - When you run the sample, the service enumerates the address, binding name and contract name for each of its endpoints. The metadata exchange (MEX) endpoint is just another endpoint from the ServiceHost's perspective so it shows up in the list. - -```console -Service endpoints: -Endpoint - address: http://localhost:8000/ServiceModelSamples/service - binding: WSHttpBinding - contract: ICalculator -Endpoint - address: http://localhost:8000/ServiceModelSamples/service/test - binding: WSHttpBinding - contract: ICalculator -Endpoint - address: http://localhost:8001/hello/servicemodelsamples - binding: WSHttpBinding - contract: ICalculator -Endpoint - address: net.tcp://localhost:9000/servicemodelsamples/service - binding: NetTcpBinding - contract: ICalculator -Endpoint - address: http://localhost:8000/ServiceModelSamples/service/mex - binding: MetadataExchangeHttpBinding - contract: IMetadataExchange - -The service is ready. -Press to terminate service. -``` - - When you run the client, the operation requests and responses are displayed in both the service and client console windows. Press ENTER in each console window to shut down the service and client. - -```console -Add(100,15.99) = 115.99 -Subtract(145,76.54) = 68.46 -Multiply(9,81.25) = 731.25 -Divide(22,7) = 3.14285714285714 - -Press to terminate client. -``` - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - - > [!NOTE] - > If you use Svcutil.exe to regenerate the configuration for this sample, be sure to modify the endpoint name in the client configuration to match the client code. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Services\Addressing` diff --git a/docs/framework/wcf/samples/ajax-service-using-complex-types-sample.md b/docs/framework/wcf/samples/ajax-service-using-complex-types-sample.md deleted file mode 100644 index e5a1414a5f4f5..0000000000000 --- a/docs/framework/wcf/samples/ajax-service-using-complex-types-sample.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -description: "Learn more about: AJAX Service Using Complex Types Sample" -title: "AJAX Service Using Complex Types Sample" -ms.date: "03/30/2017" -ms.assetid: 88242b99-4811-4cbe-8201-52ddf48fb174 ---- -# AJAX Service Using Complex Types Sample - -This sample demonstrates how to use Windows Communication Foundation (WCF) to create an ASP.NET Asynchronous JavaScript and XML (AJAX) service that creates instances of complex types and sends them between service and client as JavaScript Object Notation (JSON). You can access an AJAX service by using JavaScript code from a Web browser client. This sample builds on the [Basic AJAX Service](basic-ajax-service.md) sample. - -AJAX support in WCF is optimized for use with ASP.NET AJAX through the control. For an example of using WCF with ASP.NET AJAX, see the [AJAX Samples](ajax.md). - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - -The service in the following sample is a WCF service with no AJAX-specific code. Because the attribute is not applied, the default HTTP verb ("POST") is used. The service has one operation, `DoMath`, which returns a complex type named `MathResult`. The complex type is a standard data contract type, which also contains no AJAX-specific code. - -```csharp -[DataContract] -public class MathResult -{ - [DataMember] - public double sum; - [DataMember] - public double difference; - [DataMember] - public double product; - [DataMember] - public double quotient; -} -``` - -Create an AJAX endpoint on the service by using the , just as in the Basic AJAX Service sample. - -The client Web page ComplexTypeClientPage.aspx contains ASP.NET and JavaScript code to invoke the service when the user clicks the **Perform calculation** button on the page. The code to invoke the service constructs a JSON body and sends it using HTTP POST, similar to the [AJAX Service Using HTTP POST](ajax-service-using-http-post.md) sample. - -After the service call succeeds, you can access the individual data members (`sum`, `difference`, `product` and `quotient`) on the resulting JavaScript object. - -```javascript -function onSuccess(mathResult){ - document.getElementById("sum").value = mathResult.sum; - document.getElementById("difference").value = mathResult.difference; - document.getElementById("product").value = mathResult.product; - document.getElementById("quotient").value = mathResult.quotient; -} -``` - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. Build the solution ComplexTypeAjaxService.sln as described in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. Navigate to `http://localhost/ServiceModelSamples/ComplexTypeClientPage.aspx` (do not open ComplexTypeClientPage.aspx in the browser from the project directory). - -> [!IMPORTANT] -> The samples may already be installed on your computer. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Ajax\ComplexTypeAjaxService` - -## See also - -- [Basic AJAX Service](basic-ajax-service.md) diff --git a/docs/framework/wcf/samples/ajax-service-using-http-post.md b/docs/framework/wcf/samples/ajax-service-using-http-post.md deleted file mode 100644 index 31416e9a189fe..0000000000000 --- a/docs/framework/wcf/samples/ajax-service-using-http-post.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -description: "Learn more about: AJAX Service Using HTTP POST" -title: "AJAX Service Using HTTP POST" -ms.date: "03/30/2017" -ms.assetid: 1ac80f20-ac1c-4ed1-9850-7e49569ff44e ---- -# AJAX Service Using HTTP POST - -This sample demonstrates how to use Windows Communication Foundation (WCF) to create an ASP.NET Asynchronous JavaScript and XML (AJAX) service that uses HTTP POST. An AJAX service is one that you can access by using basic JavaScript code from a Web browser client. This sample builds on the [Basic AJAX Service](basic-ajax-service.md) sample; the only difference between the two samples is the use of HTTP POST instead of HTTP GET. - -AJAX support in Windows Communication Foundation (WCF) is optimized for use with ASP.NET AJAX through the `ScriptManager` control. For an example of using WCF with ASP.NET AJAX, see the [Ajax Samples](ajax-service-using-http-post.md). - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - -The service in the following sample is a WCF service with no AJAX-specific code. - -If the attribute is applied on an operation, or the attribute is not applied, the default HTTP verb ("POST") is used. POST requests are harder to construct than GET requests, but they are not cached; use POST requests for all operations where caching is not appropriate. - -```csharp -[ServiceContract(Namespace = "PostAjaxService")] -public interface ICalculator -{ - [WebInvoke] - double Add(double n1, double n2); - //Other operations omitted… -} -``` - -Create an AJAX endpoint on the service by using the , just as in the Basic AJAX Service sample. - -Unlike GET requests, you cannot invoke POST services from the browser. For example, navigating to `http://localhost/ServiceModelSamples/service.svc/Add?n1=100&n2=200` results in an error, because the POST service expects the `n1` and `n2` parameters to be sent in the message body in the JSON format, and not in the URL. - -The client Web page PostAjaxClientPage.aspx contains ASP.NET code to invoke the service whenever the user clicks one of the operation buttons on the page. The service responds in the same way as in the [Basic AJAX Service](basic-ajax-service.md) sample, with the GET request. - -> [!IMPORTANT] -> The samples may already be installed on your computer. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Ajax\PostAjaxService` - -## To set up, build, and run the sample - -1. Ensure that you perform the setup instructions [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. Build the solution PostAjaxService.sln as described in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. Navigate to `http://localhost/ServiceModelSamples/PostAjaxClientPage.aspx` (do not open PostAjaxClientPage.aspx in the browser from the project directory). diff --git a/docs/framework/wcf/samples/ajax-service-with-json-and-xml-sample.md b/docs/framework/wcf/samples/ajax-service-with-json-and-xml-sample.md deleted file mode 100644 index 626202d7c57c1..0000000000000 --- a/docs/framework/wcf/samples/ajax-service-with-json-and-xml-sample.md +++ /dev/null @@ -1,110 +0,0 @@ ---- -description: "Learn more about: AJAX Service with JSON and XML Sample" -title: "AJAX Service with JSON and XML Sample" -ms.date: "03/30/2017" -ms.assetid: 8ea5860d-0c42-4ae9-941a-e07efdd8e29c ---- -# AJAX Service with JSON and XML Sample - -This sample demonstrates how to use Windows Communication Foundation (WCF) to create an Asynchronous JavaScript and XML (AJAX) service that returns either JavaScript Object Notation (JSON) or XML data. You can access an AJAX service by using JavaScript code from a Web browser client. This sample builds on the [Basic AJAX Service](basic-ajax-service.md) sample. - -Unlike the other AJAX samples, this sample does not use ASP.NET AJAX and the control. With some additional configuration, WCF AJAX services can be accessed from any HTML page through JavaScript, and this scenario is shown here. For an example of using WCF with ASP.NET AJAX, see [AJAX Samples](ajax.md). - -This sample shows how to switch the response type of an operation between JSON and XML. This functionality is available regardless of whether the service is configured to be accessed by ASP.NET AJAX or by an HTML/JavaScript client page. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - -To enable the use of non-ASP.NET AJAX clients, use (not ) in the .svc file. adds a standard endpoint to the service. The endpoint is configured at an empty address relative to the .svc file; this means that the address of the service is `http://localhost/ServiceModelSamples/service.svc`, with no additional suffixes other than the operation name. - -`<%@ServiceHost language="c#" Debug="true" Service="Microsoft.Samples.XmlAjaxService.CalculatorService" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>` - -The following section in Web.config can be used to make additional configuration changes to the endpoint. It can be removed if no extra changes are needed. - -```xml - - - - - - - - -``` - -The default data format for is XML, while the default data format for is JSON. For more information, see [Creating WCF AJAX Services without ASP.NET](../feature-details/creating-wcf-ajax-services-without-aspnet.md). - -The service in the following sample is a standard WCF service with two operations. Both operations require the body style on the or attributes, which is specific to the `webHttp` behavior and has no bearing on the JSON/XML data format switch. - -```csharp -[OperationContract] -[WebInvoke(ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Wrapped)] -MathResult DoMathXml(double n1, double n2); -``` - -The response format for the operation is specified as XML, which is the default setting for the [\](../../configure-apps/file-schema/wcf/webhttp.md) behavior. However, it is good practice explicitly specify the response format. - -The other operation uses the `WebInvokeAttribute` attribute and explicitly specifies JSON instead of XML for the response. - -```csharp -[OperationContract] -[WebInvoke(ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] -MathResult DoMathJson(double n1, double n2); -``` - -Note that in both cases the operations return a complex type, `MathResult`, which is a standard WCF data contract type. - -The client Web page XmlAjaxClientPage.htm contains JavaScript code that invokes one of the preceding two operations when the user clicks the **Perform calculation (return JSON)** or **Perform calculation (return XML)** buttons on the page. The code to invoke the service constructs a JSON body and sends it using HTTP POST. The request is created manually in JavaScript, unlike the [Basic AJAX Service](basic-ajax-service.md) sample and the other samples using ASP.NET AJAX. - -```csharp -// Create HTTP request -var xmlHttp; -// Request instantiation code omitted… -// Result handler code omitted… - -// Build the operation URL -var url = "service.svc/ajaxEndpoint/"; -url = url + operation; - -// Build the body of the JSON message -var body = '{"n1":'; -body = body + document.getElementById("num1").value + ',"n2":'; -body = body + document.getElementById("num2").value + '}'; - -// Send the HTTP request -xmlHttp.open("POST", url, true); -xmlHttp.setRequestHeader("Content-type", "application/json"); -xmlHttp.send(body); -``` - -When the service responds, the response is displayed without any further processing in a textbox on the page. This is implemented for demonstration purposes to allow you to directly observe the XML and JSON data formats used. - -```javascript -// Create result handler -xmlHttp.onreadystatechange=function(){ - if(xmlHttp.readyState == 4){ - document.getElementById("result").value = xmlHttp.responseText; - } -} -``` - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\AJAX\XmlAjaxService` - -#### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. Build the solution XmlAjaxService.sln as described in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. Navigate to `http://localhost/ServiceModelSamples/XmlAjaxClientPage.htm` (do not open XmlAjaxClientPage.htm in the browser from the project directory). - -## See also - -- [AJAX Service Using HTTP POST](ajax-service-using-http-post.md) diff --git a/docs/framework/wcf/samples/ajax-service-without-configuration.md b/docs/framework/wcf/samples/ajax-service-without-configuration.md deleted file mode 100644 index 016128bdf9035..0000000000000 --- a/docs/framework/wcf/samples/ajax-service-without-configuration.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -description: "Learn more about: AJAX Service Without Configuration" -title: "AJAX Service Without Configuration" -ms.date: "03/30/2017" -ms.assetid: e6db7acd-5679-45d4-b98a-8449c6873838 ---- -# AJAX Service Without Configuration - -This sample demonstrates how to use Windows Communication Foundation (WCF) to create a basic ASP.NET Asynchronous JavaScript and XML (AJAX) service (a service that you can access by using JavaScript code from a Web browser client) without using any configuration settings. The service uses special syntax in the .svc file to automatically enable an AJAX endpoint. - -AJAX support in WCF is optimized for use with ASP.NET AJAX through the `ScriptManager` control. For an example of using WCF with ASP.NET AJAX, see the [Ajax Samples](ajax.md). - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - - This sample builds upon the AJAX Service Using HTTP POST. As described in the [Basic AJAX Service](basic-ajax-service.md) sample, is used to host the service. - -```text -<%ServiceHost - language=c# - Debug="true" - Service="Microsoft.Ajax.Samples.CalculatorService - Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory" -%> -``` - - automatically adds a to the service. If no configuration changes need to be made to the endpoint, the `` section can be completely removed from the Web.config file for the service. The Web.config file contains some ASP.NET settings, which are used by ConfigFreeClientPage.aspx. If that were not the case, the entire Web.config file could be removed. - -> [!IMPORTANT] -> The samples may already be installed on your computer. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Ajax\ConfigFreeAjaxService` - -#### To set up, build, and run the sample - -1. Ensure that you perform the setup instructions in [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. Build the solution ConfigFreeAjaxService.sln as described in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. Navigate to `http://localhost/ServiceModelSamples/ConfigFreeClientPage.aspx` (do not open ConfigFreeClientPage.aspx in the browser from within the project directory). - -> [!NOTE] -> When running this sample, please ensure that Anonymous Authentication and Windows Authentication are not enabled simultaneously for the ServiceModelSamples folder in IIS. If that is the case, please disable Windows Authentication. Once you have run the sample, enable Windows Authentication and run "iisreset". - -## See also - -- [Basic AJAX Service](basic-ajax-service.md) diff --git a/docs/framework/wcf/samples/ajax.md b/docs/framework/wcf/samples/ajax.md deleted file mode 100644 index 91e894397c571..0000000000000 --- a/docs/framework/wcf/samples/ajax.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -description: "Learn more about: AJAX" -title: "AJAX" -ms.date: "03/30/2017" -ms.assetid: 9e0eb40a-69ef-4821-bdc3-45a9b71a58c3 ---- -# AJAX - -This section includes samples that demonstrate Asynchronous JavaScript and XML functionality. - -## In This Section - - [JSONP](jsonp.md) - Demonstrates how to support JSON with Padding (JSONP) in WCF REST services. - - [JSON Serialization](json-serialization.md) - Demonstrates how to use the to serialize and deserialize data in the JavaScript Object Notation (JSON) format. - - [Basic AJAX Service](basic-ajax-service.md) - Demonstrates how to use WCF to create a basic ASP.NET Asynchronous JavaScript and XML (AJAX) service. - - [AJAX Service Using HTTP POST](ajax-service-using-http-post.md) - Demonstrates how to use WCF to create an ASP.NET Asynchronous JavaScript and XML (AJAX) service that uses HTTP POST. - - [AJAX Service Without Configuration](ajax-service-without-configuration.md) - Demonstrates how to use WCF to create a basic ASP.NET Asynchronous JavaScript and XML (AJAX) service. - - [AJAX Service Using Complex Types](ajax-service-using-complex-types-sample.md) - Demonstrates how to use WCF to create an ASP.NET Asynchronous JavaScript and XML (AJAX) service that creates instances of complex types. - - [AJAX Service with JSON and XML](ajax-service-with-json-and-xml-sample.md) - Demonstrates how to use WCF to create an Asynchronous JavaScript and XML (AJAX) service that returns either JavaScript Object Notation (JSON) or XML data. diff --git a/docs/framework/wcf/samples/announcements-sample.md b/docs/framework/wcf/samples/announcements-sample.md deleted file mode 100644 index 42859f149b0f2..0000000000000 --- a/docs/framework/wcf/samples/announcements-sample.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -description: "Learn more about: Announcements Sample" -title: "Announcements Sample" -ms.date: "03/30/2017" -ms.assetid: 954a75e4-9a97-41d6-94fc-43765d4205a9 ---- -# Announcements Sample - -This sample shows how to use the Announcement functionality of the Discovery feature. Announcements allow services to send out announcement messages that contain metadata about the service. By default a hello announcement is sent when the service starts up and a bye announcement is sent when the service shuts down. These announcements can be multicast or they can be sent point-to-point. This sample consists of two projects service and client. - -## Service - -This project contains a self-hosted calculator service. In the `Main` method, a service host is created and a service endpoint is added to it. Next, a is created. To enable announcements, an announcement endpoint must be added to the . In this case a standard endpoint, using UDP multicast is added as the announcement endpoint. This broadcasts the announcements over a well-known UDP address. - -```csharp -Uri baseAddress = new Uri("http://localhost:8000/" + Guid.NewGuid().ToString()); - -// Create a ServiceHost for the CalculatorService type. -using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress)) -{ - serviceHost.AddServiceEndpoint(typeof(ICalculatorService), new WSHttpBinding(), String.Empty); - - ServiceDiscoveryBehavior serviceDiscoveryBehavior = new ServiceDiscoveryBehavior(); - - // Announce the availability of the service over UDP multicast - serviceDiscoveryBehavior.AnnouncementEndpoints.Add(new UdpAnnouncementEndpoint()); - - // Make the service discoverable over UDP multicast. - serviceHost.Description.Behaviors.Add(serviceDiscoveryBehavior); - serviceHost.AddServiceEndpoint(new UdpDiscoveryEndpoint()); - serviceHost.Open(); - // ... -} -``` - -## Client - -In this project, note that the client hosts an . Furthermore, two delegates are registered with events. These events dictate what the client does when online and offline announcements are received. - -```csharp -// Create an AnnouncementService instance -AnnouncementService announcementService = new AnnouncementService(); - -// Subscribe the announcement events -announcementService.OnlineAnnouncementReceived += OnOnlineEvent; -announcementService.OfflineAnnouncementReceived += OnOfflineEvent; -``` - -The `OnOnlineEvent` and `OnOfflineEvent` methods handle the hello and bye announcement messages respectively. - -```csharp -static void OnOnlineEvent(object sender, AnnouncementEventArgs e) -{ - Console.WriteLine(); - Console.WriteLine("Received an online announcement from {0}:", e.AnnouncementMessage.EndpointDiscoveryMetadata.Address); -PrintEndpointDiscoveryMetadata(e.AnnouncementMessage.EndpointDiscoveryMetadata); -} - -static void OnOfflineEvent(object sender, AnnouncementEventArgs e) -{ - Console.WriteLine(); - Console.WriteLine("Received an offline announcement from {0}:", e.AnnouncementMessage.EndpointDiscoveryMetadata.Address); - PrintEndpointDiscoveryMetadata(e.AnnouncementMessage.EndpointDiscoveryMetadata); -} -``` - -#### To use this sample - -1. This sample uses HTTP endpoints and to run this sample, proper URL ACLs must be added. For more information, see [Configuring HTTP and HTTPS](../feature-details/configuring-http-and-https.md). Executing the following command at an elevated privilege should add the appropriate ACLs. You may want to substitute your Domain and Username for the following arguments if the command does not work as is. `netsh http add urlacl url=http://+:8000/ user=%DOMAIN%\%UserName%` - -2. Build the solution. - -3. Run the client.exe application. - -4. Run the service.exe application. Note the client receives an online announcement. - -5. Close the service.exe application. Note the client receives an offline announcement. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Discovery\Announcements` diff --git a/docs/framework/wcf/samples/asmx-client-with-a-wcf-service.md b/docs/framework/wcf/samples/asmx-client-with-a-wcf-service.md deleted file mode 100644 index 6bdfe740ab0a1..0000000000000 --- a/docs/framework/wcf/samples/asmx-client-with-a-wcf-service.md +++ /dev/null @@ -1,146 +0,0 @@ ---- -description: "Learn more about: ASMX Client with a WCF Service" -title: "ASMX Client with a WCF Service" -ms.date: "03/30/2017" -ms.assetid: 3ea381ee-ac7d-4d62-8c6c-12dc3650879f ---- -# ASMX Client with a WCF Service - -This sample demonstrates how to create a service using Windows Communication Foundation (WCF) and then access the service from a non-WCF client, such as an ASMX client. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - -This sample consists of a client console program (.exe) and a service library (.dll) hosted by Internet Information Services (IIS). The service implements a contract that defines a request-reply communication pattern. The contract is defined by the `ICalculator` interface, which exposes math operations (`Add`, `Subtract`, `Multiply`, and `Divide`). The ASMX client makes synchronous requests to a math operation and the service replies with the result. - -The service implements an `ICalculator` contract as defined in the following code. - -```csharp -[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples"), XmlSerializerFormat] -public interface ICalculator -{ - [OperationContract] - double Add(double n1, double n2); - [OperationContract] - double Subtract(double n1, double n2); - [OperationContract] - double Multiply(double n1, double n2); - [OperationContract] - double Divide(double n1, double n2); -} -``` - -The and map CLR types to an XML representation. The interprets some XML representations differently than XmlSerializer. Non-WCF proxy generators, such as Wsdl.exe, generate a more usable interface when the XmlSerializer is being used. The is applied to the `ICalculator` interface, to ensure that the XmlSerializer is used for mapping CLR types to XML. The service implementation calculates and returns the appropriate result. - -The service exposes a single endpoint for communicating with the service, defined using a configuration file (Web.config). The endpoint consists of an address, a binding, and a contract. The service exposes the endpoint at the base address provided by the Internet Information Services (IIS) host. The `binding` attribute is set to basicHttpBinding that provides HTTP communications using SOAP 1.1, which is compliant with WS-I BasicProfile 1.1 as shown in the following sample configuration. - -```xml - - - - - - -``` - -The ASMX client communicates with the WCF service using a typed proxy that is generated by the Web Services Description Language (WSDL) utility (Wsdl.exe). The typed proxy is contained in the file generatedClient.cs. The WSDL utility retrieves metadata for the specified service and generates a typed proxy for use by a client to communicate. By default, the framework does not expose any metadata. To expose the metadata required to generate the proxy, you must add a [\](../../configure-apps/file-schema/wcf/servicemetadata.md) and set its `httpGetEnabled` attribute to `True` as shown in the following configuration. - -```xml - - - - - - - - - -``` - -Run the following command from a command prompt in the client directory to generate the typed proxy. - -```console -wsdl /n:Microsoft.ServiceModel.Samples /o:generatedClient.cs /urlkey:CalculatorServiceAddress http://localhost/servicemodelsamples/service.svc?wsdl -``` - -By using the generated typed proxy, the client can access a given service endpoint by configuring the appropriate address. The client uses a configuration file (App.config) to specify the endpoint to communicate with. - -```xml - - - -``` - -The client implementation constructs an instance of the typed proxy to begin communicating with the service. - -```csharp -// Create a client to the CalculatorService. -using (CalculatorService client = new CalculatorService()) -{ - // Call the Add service operation. - double value1 = 100.00D; - double value2 = 15.99D; - double result = client.Add(value1, value2); - Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result); - - // Call the Subtract service operation. - value1 = 145.00D; - value2 = 76.54D; - result = client.Subtract(value1, value2); - Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result); - - // Call the Multiply service operation. - value1 = 9.00D; - value2 = 81.25D; - result = client.Multiply(value1, value2); - Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result); - - // Call the Divide service operation. - value1 = 22.00D; - value2 = 7.00D; - result = client.Divide(value1, value2); - Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result); - -} - -Console.WriteLine(); -Console.WriteLine("Press to terminate client."); -Console.ReadLine(); -``` - -When you run the sample, the operation requests and responses are displayed in the client console window. Press ENTER in the client window to shut down the client. - -```console -Add(100,15.99) = 115.99 -Subtract(145,76.54) = 68.46 -Multiply(9,81.25) = 731.25 -Divide(22,7) = 3.14285714285714 - -Press to terminate client. -``` - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -> [!NOTE] -> For more information about passing and returning complex data types see: [Data Binding in a Windows Forms Client](data-binding-in-a-windows-forms-client.md), [Data Binding in a Windows Presentation Foundation Client](data-binding-in-a-wpf-client.md), and [Data Binding in an ASP.NET Client](data-binding-in-an-aspnet-client.md) - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Services\Interop\ASMX` diff --git a/docs/framework/wcf/samples/aspnet-caching-integration.md b/docs/framework/wcf/samples/aspnet-caching-integration.md deleted file mode 100644 index 48158b618741f..0000000000000 --- a/docs/framework/wcf/samples/aspnet-caching-integration.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -description: "Learn more about: ASP.NET Caching Integration" -title: "ASP.NET Caching Integration" -ms.date: "03/30/2017" -ms.assetid: f581923a-8a72-42fc-bd6a-46de2aaeecc1 ---- -# ASP.NET Caching Integration - -This sample demonstrates how to utilize the ASP.NET output cache with the WCF WEB HTTP programming model. This topic focuses on the ASP.NET output cache integration feature. - -## Demonstrates - -Integration with the ASP.NET Output Cache - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Web\AspNetCachingIntegration` - -## Discussion - -The sample uses the to utilize ASP.NET output caching with the Windows Communication Foundation (WCF) service. The is applied to service operations, and provides the name of a cache profile in a configuration file that should be applied to responses from the given operation. - -In the Service.cs file of the sample Service project, both the `GetCustomer` and `GetCustomers` operations are marked with the , which provides the cache profile name "CacheFor60Seconds". In the Web.config file of the Service project, the cache profile "CacheFor60Seconds" is provided under the <`caching`> element of <`system.web`>. For this cache profile, the value of the `duration` attribute is "60", so responses associated with this profile are cached in the ASP.NET output cache for 60 seconds. Also, for this cache profile, the `varmByParam` attribute is set to "format" so requests with different values for the `format` query string parameter have their responses cached separately. Lastly, the cache profile’s `varyByHeader` attribute is set to "Accept", so requests with different Accept header values have their responses cached separately. - -Program.cs in the Client project demonstrates how such a client can be authored using . Note that this is just one way to access a WCF service. It is also possible to access the service using other .NET Framework classes like the WCF channel factory and . Other samples in the SDK (such as the [Basic HTTP Service](basic-http-service.md) sample) illustrate how to use these classes to communicate with a WCF service. - -## To run the sample - -The sample consists of three projects: - -- **Service**: A Web Application project that includes a WCF HTTP service hosted in ASP.NET. - -- **Client**: A console application project that makes calls to the service. - -- **Common**: A shared library that contains the Customer type used by the client and service. - -As the Client console application runs, the client makes requests to the service and writes the pertinent information from the responses to the console window. - -#### To run the sample - -1. Open the solution for the ASP.NET Caching Integration Sample. - -2. Press CTRL+SHIFT+B to build the solution. - -3. If the **Solution Explorer** window is not already open, press CTRL+W+S. - -4. From the **Solution Explorer** window, right click the **Service** project and select **Start New Instance**. This launches the ASP.NET development server, which hosts the service. - -5. From the **Solution Explorer** window, right click the **Client** project and select **Start New Instance**. - -6. The client console window appears and provides the URI of the running service and the URI of the HTML help page for the running service. At any point in time you can view the HTML help page by typing the URI of the help page in a browser. - -7. As the sample runs, the client writes the status of the current activity. - -8. Press any key to terminate the client console application. - -9. Press SHIFT+F5 to stop debugging the service. - -10. In the Windows Notification Area, right click the ASP.NET development server icon and select **Stop**. diff --git a/docs/framework/wcf/samples/aspnet-compatibility.md b/docs/framework/wcf/samples/aspnet-compatibility.md deleted file mode 100644 index 4d0e41a63b5cf..0000000000000 --- a/docs/framework/wcf/samples/aspnet-compatibility.md +++ /dev/null @@ -1,128 +0,0 @@ ---- -description: "Learn more about: ASP.NET Compatibility" -title: "ASP.NET Compatibility" -ms.date: "03/30/2017" -ms.assetid: c8b51f1e-c096-4c42-ad99-0519887bbbc5 ---- -# ASP.NET Compatibility - -This sample demonstrates how to enable ASP.NET Compatibility mode in Windows Communication Foundation (WCF). Services running in ASP.NET Compatibility mode participate fully in the ASP.NET application pipeline and can make use of ASP.NET features such as file/URL authorization, session state, and the class. The class allows access to cookies, sessions, and other ASP.NET features. This mode requires that the bindings use the HTTP transport and the service itself must be hosted in IIS. - -In this sample, the client is a console application (an executable) and the service is hosted in Internet Information Services (IIS). - -> [!NOTE] -> The set-up procedure and build instructions for this sample are located at the end of this topic. - -This sample requires a .NET Framework 4 application pool in order to run. To create a new application pool, or to modify the default application pool, follow these steps. - -1. Open **Control Panel**. Open the **Administrative Tools** applet under the **System and Security** heading. Open the **Internet Information Services (IIS) Manager** applet. - -2. Expand the treeview in the **Connections** pane. Select the **Application Pools** node. - -3. To set the default application pool to use .NET Framework 4 (which may cause incompatibility problems with existing sites), right-click the **DefaultAppPool** list item and select **Basic Settings…**. Set the **.Net Framework Version** pull-down to **.Net Framework v4.0.30128** (or later). - -4. To create a new application pool that uses .NET Framework 4 (to preserve compatibility for other applications), right-click the **Application Pools** node and select **Add Application Pool…**. Name the new application pool, and set the **.Net Framework Version** pull-down to **.Net Framework v4.0.30128** (or later). After running the setup steps below, right-click the **ServiceModelSamples** application and select **Manage Application**, **Advanced Settings…**. Set the **Application Pool** to the new application pool. - -> [!IMPORTANT] -> The samples may already be installed on your computer. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Services\Hosting\WebHost\ASPNetCompatibility` - -This sample is based on the [Getting Started](getting-started-sample.md), which implements a calculator service. The `ICalculator` contract has been modified as the `ICalculatorSession` contract to allow a set of operations to be performed, while keeping a running result. - -```csharp -[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")] -public interface ICalculatorSession -{ - [OperationContract] - void Clear(); - [OperationContract] - void AddTo(double n); - [OperationContract] - void SubtractFrom(double n); - [OperationContract] - void MultiplyBy(double n); - [OperationContract] - void DivideBy(double n); - [OperationContract] - double Result(); -} -``` - -The service maintains state, using the feature, for each client as multiple service operations are called to perform a calculation. The client can retrieve the current result by calling `Result` and can clear the result to zero by calling `Clear`. - -The service uses the ASP.NET session to store the result for each client session. This allows the service to maintain the running result for each client across multiple calls to the service. - -> [!NOTE] -> ASP.NET session state and WCF sessions are very different things. See [Session](session.md) for details on WCF sessions. - -The service has an intimate dependency on ASP.NET session state and requires ASP.NET compatibility mode to function correctly. These requirements are expressed declaratively by applying the `AspNetCompatibilityRequirements` attribute. - -```csharp -[AspNetCompatibilityRequirements(RequirementsMode = - AspNetCompatibilityRequirementsMode.Required)] -public class CalculatorService : ICalculatorSession -{ - double Result - { // store result in AspNet Session - get { - if (HttpContext.Current.Session["Result"] != null) - return (double)HttpContext.Current.Session["Result"]; - return 0.0D; - } - set - { - HttpContext.Current.Session["Result"] = value; - } - } - public void Clear() - { - Result = 0.0D; - } - public void AddTo(double n) - { - Result += n; - } - public void SubtractFrom(double n) - { - Result -= n; - } - public void MultiplyBy(double n) - { - Result *= n; - } - public void DivideBy(double n) - { - Result /= n; - } - public double Result() - { - return Result; - } -} -``` - -When you run the sample, the operation requests and responses are displayed in the client console window. Press ENTER in the client window to shut down the client. - -```console -0, + 100, - 50, * 17.65, / 2 = 441.25 -Press to terminate client. -``` - -### To set up, build, and run the sample - -1. Be sure you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. After the solution has been built, run Setup.bat to set up the ServiceModelSamples Application in IIS 7.0. The ServiceModelSamples directory should now appear as an IIS 7.0 Application. - -4. To run the sample in a single- or cross-computer configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -## See also - -- [AppFabric Hosting and Persistence Samples](/previous-versions/appfabric/ff383418(v=azure.10)) diff --git a/docs/framework/wcf/samples/authorization-policy.md b/docs/framework/wcf/samples/authorization-policy.md deleted file mode 100644 index 4751ce704d58f..0000000000000 --- a/docs/framework/wcf/samples/authorization-policy.md +++ /dev/null @@ -1,505 +0,0 @@ ---- -description: "Learn more about: Authorization Policy" -title: "Authorization Policy" -ms.date: "03/30/2017" -ms.assetid: 1db325ec-85be-47d0-8b6e-3ba2fdf3dda0 ---- -# Authorization Policy - -This sample demonstrates how to implement a custom claim authorization policy and an associated custom service authorization manager. This is useful when the service makes claim-based access checks to service operations and prior to the access checks, grants the caller certain rights. This sample shows both the process of adding claims as well as the process for doing an access check against the finalized set of claims. All application messages between the client and server are signed and encrypted. By default with the `wsHttpBinding` binding, a username and password supplied by the client are used to logon to a valid Windows account. This sample demonstrates how to utilize a custom to authenticate the client. In addition this sample shows the client authenticating to the service using an X.509 certificate. This sample shows an implementation of and , which between them grant access to specific methods of the service for specific users. This sample is based on the [Message Security User Name](message-security-user-name.md), but demonstrates how to perform a claim transformation prior to the being called. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - - In summary, this sample demonstrates how: - -- The client can be authenticated using a user name-password. - -- The client can be authenticated using an X.509 certificate. - -- The server validates the client credentials against a custom `UsernamePassword` validator. - -- The server is authenticated using the server's X.509 certificate. - -- The server can use to control access to certain methods in the service. - -- How to implement . - -The service exposes two endpoints for communicating with the service, defined using the configuration file App.config. Each endpoint consists of an address, a binding, and a contract. One binding is configured with a standard `wsHttpBinding` binding that uses WS-Security and client username authentication. The other binding is configured with a standard `wsHttpBinding` binding that uses WS-Security and client certificate authentication. The [\](../../configure-apps/file-schema/wcf/behavior-of-endpointbehaviors.md) specifies that the user credentials are to be used for service authentication. The server certificate must contain the same value for the `SubjectName` property as the `findValue` attribute in the [\](../../configure-apps/file-schema/wcf/servicecertificate-of-servicecredentials.md). - -```xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -``` - -Each client endpoint configuration consists of a configuration name, an absolute address for the service endpoint, the binding, and the contract. The client binding is configured with the appropriate security mode as specified in this case in the [\](../../configure-apps/file-schema/wcf/security-of-wshttpbinding.md) and `clientCredentialType` as specified in the [\](../../configure-apps/file-schema/wcf/message-of-wshttpbinding.md). - -```xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -``` - -For the user name-based endpoint, the client implementation sets the user name and password to use. - -```csharp -// Create a client with Username endpoint configuration -CalculatorClient client1 = new CalculatorClient("Username"); - -client1.ClientCredentials.UserName.UserName = "test1"; -client1.ClientCredentials.UserName.Password = "1tset"; - -try -{ - // Call the Add service operation. - double value1 = 100.00D; - double value2 = 15.99D; - double result = client1.Add(value1, value2); - Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result); - ... -} -catch (Exception e) -{ - Console.WriteLine("Call failed : {0}", e.Message); -} - -client1.Close(); -``` - -For the certificate-based endpoint, the client implementation sets the client certificate to use. - -```csharp -// Create a client with Certificate endpoint configuration -CalculatorClient client2 = new CalculatorClient("Certificate"); - -client2.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, "test1"); - -try -{ - // Call the Add service operation. - double value1 = 100.00D; - double value2 = 15.99D; - double result = client2.Add(value1, value2); - Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result); - ... -} -catch (Exception e) -{ - Console.WriteLine("Call failed : {0}", e.Message); -} - -client2.Close(); -``` - -This sample uses a custom to validate user names and passwords. The sample implements `MyCustomUserNamePasswordValidator`, derived from . See the documentation about for more information. For the purposes of demonstrating the integration with the , this custom validator sample implements the method to accept user name/password pairs where the user name matches the password as shown in the following code. - -```csharp -public class MyCustomUserNamePasswordValidator : UserNamePasswordValidator -{ - // This method validates users. It allows in two users, - // test1 and test2 with passwords 1tset and 2tset respectively. - // This code is for illustration purposes only and - // MUST NOT be used in a production environment because it - // is NOT secure. - public override void Validate(string userName, string password) - { - if (null == userName || null == password) - { - throw new ArgumentNullException(); - } - - if (!(userName == "test1" && password == "1tset") && !(userName == "test2" && password == "2tset")) - { - throw new SecurityTokenException("Unknown Username or Password"); - } - } -} -``` - -Once the validator is implemented in service code, the service host must be informed about the validator instance to use. This is done using the following code: - -```csharp -Servicehost.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = UserNamePasswordValidationMode.Custom; -serviceHost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new MyCustomUserNamePasswordValidatorProvider(); -``` - -Or you can do the same thing in configuration: - -```xml - - - - - ... - - -``` - -Windows Communication Foundation (WCF) provides a rich claims-based model for performing access checks. The object is used to perform the access check and determine whether the claims associated with the client satisfy the requirements necessary to access the service method. - -For the purposes of demonstration, this sample shows an implementation of that implements the method to allow a user's access to methods based on claims of type `http://example.com/claims/allowedoperation` whose value is the Action URI of the operation that is allowed to be called. - -```csharp -public class MyServiceAuthorizationManager : ServiceAuthorizationManager -{ - protected override bool CheckAccessCore(OperationContext operationContext) - { - string action = operationContext.RequestContext.RequestMessage.Headers.Action; - Console.WriteLine("action: {0}", action); - foreach(ClaimSet cs in operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets) - { - if ( cs.Issuer == ClaimSet.System ) - { - foreach (Claim c in cs.FindClaims("http://example.com/claims/allowedoperation", Rights.PossessProperty)) - { - Console.WriteLine("resource: {0}", c.Resource.ToString()); - if (action == c.Resource.ToString()) - return true; - } - } - } - return false; - } -} -``` - -Once the custom is implemented, the service host must be informed about the to use. This is done as shown in the following code. - -```xml - - ... - - ... - - -``` - -The primary method to implement is the method. - -```csharp -public class MyAuthorizationPolicy : IAuthorizationPolicy -{ - string id; - - public MyAuthorizationPolicy() - { - id = Guid.NewGuid().ToString(); - } - - public bool Evaluate(EvaluationContext evaluationContext, - ref object state) - { - bool bRet = false; - CustomAuthState customstate = null; - - if (state == null) - { - customstate = new CustomAuthState(); - state = customstate; - } - else - customstate = (CustomAuthState)state; - Console.WriteLine("In Evaluate"); - if (!customstate.ClaimsAdded) - { - IList claims = new List(); - - foreach (ClaimSet cs in evaluationContext.ClaimSets) - foreach (Claim c in cs.FindClaims(ClaimTypes.Name, - Rights.PossessProperty)) - foreach (string s in - GetAllowedOpList(c.Resource.ToString())) - { - claims.Add(new - Claim("http://example.com/claims/allowedoperation", - s, Rights.PossessProperty)); - Console.WriteLine("Claim added {0}", s); - } - evaluationContext.AddClaimSet(this, - new DefaultClaimSet(this.Issuer,claims)); - customstate.ClaimsAdded = true; - bRet = true; - } - else - { - bRet = true; - } - return bRet; - } -... -} -``` - -The previous code shows how the method checks that no new claims have been added that affect the processing and adds specific claims. The claims that are allowed are obtained from the `GetAllowedOpList` method, which is implemented to return a specific list of operations that the user is allowed to perform. The authorization policy adds claims for accessing the particular operation. This is later used by the to perform access check decisions. - -Once the custom is implemented, the service host must be informed about the authorization policies to use. - -```xml - - - - - -``` - -When you run the sample, the operation requests and responses are displayed in the client console window. The client successfully calls the Add, Subtract and Multiple methods and gets an "Access is denied" message when trying to call the Divide method. Press ENTER in the client window to shut down the client. - -## Setup Batch File - -The Setup.bat batch file included with this sample allows you to configure the server with relevant certificates to run a self-hosted application that requires server certificate-based security. - -The following provides a brief overview of the different sections of the batch files so that they can be modified to run in the appropriate configuration: - -- Creating the server certificate. - - The following lines from the Setup.bat batch file create the server certificate to be used. The %SERVER_NAME% variable specifies the server name. Change this variable to specify your own server name. The default value is localhost. - - ```bat - echo ************ - echo Server cert setup starting - echo %SERVER_NAME% - echo ************ - echo making server cert - echo ************ - makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe - ``` - -- Installing the server certificate into client's trusted certificate store. - - The following lines in the Setup.bat batch file copy the server certificate into the client trusted people store. This step is required because certificates that are generated by Makecert.exe are not implicitly trusted by the client system. If you already have a certificate that is rooted in a client trusted root certificate—for example, a Microsoft issued certificate—this step of populating the client certificate store with the server certificate is not required. - - ```console - certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople - ``` - -- Creating the client certificate. - - The following lines from the Setup.bat batch file create the client certificate to be used. The %USER_NAME% variable specifies the server name. This value is set to "test1" because this is the name the `IAuthorizationPolicy` looks for. If you change the value of %USER_NAME% you must change the corresponding value in the `IAuthorizationPolicy.Evaluate` method. - - The certificate is stored in My (Personal) store under the CurrentUser store location. - - ```bat - echo ************ - echo making client cert - echo ************ - makecert.exe -sr CurrentUser -ss MY -a sha1 -n CN=%CLIENT_NAME% -sky exchange -pe - ``` - -- Installing the client certificate into server's trusted certificate store. - - The following lines in the Setup.bat batch file copy the client certificate into the trusted people store. This step is required because certificates that are generated by Makecert.exe are not implicitly trusted by the server system. If you already have a certificate that is rooted in a trusted root certificate—for example, a Microsoft issued certificate—this step of populating the server certificate store with the client certificate is not required. - - ```console - certmgr.exe -add -r CurrentUser -s My -c -n %CLIENT_NAME% -r LocalMachine -s TrustedPeople - ``` - -### To set up and build the sample - -1. To build the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -2. To run the sample in a single- or cross-computer configuration, use the following instructions. - -> [!NOTE] -> If you use Svcutil.exe to regenerate the configuration for this sample, be sure to modify the endpoint name in the client configuration to match the client code. - -### To run the sample on the same computer - -1. Open Developer Command Prompt for Visual Studio with administrator privileges and run *Setup.bat* from the sample install folder. This installs all the certificates required for running the sample. - - > [!NOTE] - > The Setup.bat batch file is designed to be run from Developer Command Prompt for Visual Studio. The PATH environment variable set within Developer Command Prompt for Visual Studio points to the directory that contains executables required by the *Setup.bat* script. - -1. Launch Service.exe from *service\bin*. - -1. Launch Client.exe from *\client\bin*. Client activity is displayed on the client console application. - -If the client and service are not able to communicate, see [Troubleshooting Tips for WCF Samples](/previous-versions/dotnet/netframework-3.5/ms751511(v=vs.90)). - -### To run the sample across computers - -1. Create a directory on the service computer. - -2. Copy the service program files from *\service\bin* to the directory on the service computer. Also copy the Setup.bat, Cleanup.bat, GetComputerName.vbs and ImportClientCert.bat files to the service computer. - -3. Create a directory on the client computer for the client binaries. - -4. Copy the client program files to the client directory on the client computer. Also copy the Setup.bat, Cleanup.bat, and ImportServiceCert.bat files to the client. - -5. On the server, run `setup.bat service` in Developer Command Prompt for Visual Studio opened with administrator privileges. - - Running `setup.bat` with the `service` argument creates a service certificate with the fully qualified domain name of the computer, and exports the service certificate to a file named *Service.cer*. - -6. Edit *Service.exe.config* to reflect the new certificate name (in the `findValue` attribute in the [\](../../configure-apps/file-schema/wcf/servicecertificate-of-servicecredentials.md)) which is the same as the fully qualified domain name of the computer. Also change the **computername** in the \/\ element from localhost to the fully qualified name of your service computer. - -7. Copy the *Service.cer* file from the service directory to the client directory on the client computer. - -8. On the client, run `setup.bat client` in Developer Command Prompt for Visual Studio opened with administrator privileges. - - Running `setup.bat` with the `client` argument creates a client certificate named **test1** and exports the client certificate to a file named *Client.cer*. - -9. In the *Client.exe.config* file on the client computer, change the address value of the endpoint to match the new address of your service. Do this by replacing **localhost** with the fully qualified domain name of the server. - -10. Copy the Client.cer file from the client directory to the service directory on the server. - -11. On the client, run *ImportServiceCert.bat* in Developer Command Prompt for Visual Studio opened with administrator privileges. - - This imports the service certificate from the Service.cer file into the **CurrentUser - TrustedPeople** store. - -12. On the server, run *ImportClientCert.bat* in Developer Command Prompt for Visual Studio opened with administrator privileges. - - This imports the client certificate from the Client.cer file into the **LocalMachine - TrustedPeople** store. - -13. On the server computer, launch Service.exe from the command prompt window. - -14. On the client computer, launch Client.exe from a command prompt window. - - If the client and service are not able to communicate, see [Troubleshooting Tips for WCF Samples](/previous-versions/dotnet/netframework-3.5/ms751511(v=vs.90)). - -### Clean up after the sample - -To clean up after the sample, run *Cleanup.bat* in the samples folder when you have finished running the sample. This removes the server and client certificates from the certificate store. - -> [!NOTE] -> This script does not remove service certificates on a client when running this sample across computers. If you have run WCF samples that use certificates across computers, be sure to clear the service certificates that have been installed in the CurrentUser - TrustedPeople store. To do this, use the following command: `certmgr -del -r CurrentUser -s TrustedPeople -c -n ` For example: `certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com`. diff --git a/docs/framework/wcf/samples/authorizing-access-to-service-operations.md b/docs/framework/wcf/samples/authorizing-access-to-service-operations.md deleted file mode 100644 index 594417e470a5f..0000000000000 --- a/docs/framework/wcf/samples/authorizing-access-to-service-operations.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -description: "Learn more about: Authorizing Access to Service Operations" -title: "Authorizing Access to Service Operations" -ms.date: "03/30/2017" -helpviewer_keywords: - - "service behaviors, authorizing access sample" - - "Authorizing Access To Service Operations Sample [Windows Communication Foundation]" - - "authorization, Windows Communication Foundation sample" -ms.assetid: ddcfdaa5-8b2e-4e13-bd85-887209dc6328 ---- -# Authorizing Access to Service Operations - -This sample demonstrates how to use the [\](../../configure-apps/file-schema/wcf/serviceauthorization-element.md) to enable use of the attribute to authorize access to service operations. This sample is based on the [Getting Started](getting-started-sample.md) sample. The service and client are configured using the [\](../../configure-apps/file-schema/wcf/wshttpbinding.md). The `mode` attribute of the [\](../../configure-apps/file-schema/wcf/security-of-custombinding.md) has been set to `Message` and `clientCredentialType` has been set to `Windows`. The is applied to each service method and used to restrict access to each operation. The caller must be a Windows administrator to access each operation. - - In this sample, the client is a console application (.exe) and the service is hosted by Internet Information Services (IIS). - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - - The service configuration file uses the [\](../../configure-apps/file-schema/wcf/serviceauthorization-element.md) to set the `principalPermissionMode` attribute: - -```xml - - - - - - - - -``` - - Setting the `principalPermissionMode` to `UseWindowsGroups` enables the use of based on Windows group names. - - The is applied to each operation to require the caller to be part of the Windows administrators group, as shown in the following sample code. - -```csharp -[PrincipalPermission(SecurityAction.Demand, - Role = "Builtin\\Administrators")] -public double Add(double n1, double n2) -{ - double result = n1 + n2; - return result; -} -``` - - When you run the sample, the operation requests and responses are displayed in the client console window. The client successfully communicates with each operation if it is running under an account that is part of the Administrators group; otherwise, access is denied. To experiment with authorization failure, run the client under an account that is not part of the Administrators group. Press ENTER in the console window to shut down the client. - - A service can be notified of authorization failures by implementing an . See [Extending Control Over Error Handling and Reporting](extending-control-over-error-handling-and-reporting.md) for information about implementing `IErrorHandler`. - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-computer configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). diff --git a/docs/framework/wcf/samples/basic-ajax-service.md b/docs/framework/wcf/samples/basic-ajax-service.md deleted file mode 100644 index 9a25615d97483..0000000000000 --- a/docs/framework/wcf/samples/basic-ajax-service.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -description: "Learn more about: Basic AJAX Service" -title: "Basic AJAX Service" -ms.date: "03/30/2017" -ms.assetid: d66d0c91-0109-45a0-a901-f3e4667c2465 ---- -# Basic AJAX Service - -This sample demonstrates how to use Windows Communication Foundation (WCF) to create a basic ASP.NET Asynchronous JavaScript and XML (AJAX) service (a service that you can access using JavaScript code from a Web browser client). The service uses the attribute to ensure that the service responds to HTTP GET requests and is configured to use the JavaScript Object Notation (JSON) data format for responses. - -AJAX support in WCF is optimized for use with ASP.NET AJAX through the `ScriptManager` control. For an example of using WCF with ASP.NET AJAX, see the [AJAX Samples](ajax.md). - -> [!NOTE] -> The set-up procedure and build instructions for this sample are located at the end of this topic. - -In the following code, the attribute is applied to the `Add` operation to ensure that the service responds to HTTP GET requests. The code uses GET for simplicity (you can construct an HTTP GET request from any Web browser). You can also use GET to enable caching. HTTP POST is the default in the absence of the `WebGetAttribute` attribute. - -```csharp -[ServiceContract(Namespace = "SimpleAjaxService")] -public interface ICalculator -{ - [WebGet] - double Add(double n1, double n2); - //Other operations omitted… -} -``` - -The sample .svc file uses , which adds a standard endpoint to the service. The endpoint is configured at an empty address relative to the .svc file. This means that the address of the service is `http://localhost/ServiceModelSamples/service.svc`, with no additional suffixes other than the operation name. - -`<%@ServiceHost language="C#" Debug="true" Service="Microsoft.Samples.SimpleAjaxService.CalculatorService" Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory" %>` - -The is pre-configured to make the service accessible from an ASP.NET AJAX client page. The following section in Web.config can be used to make additional configuration changes to the endpoint. It can be removed if no extra changes are required. - -```xml - - - - - - - - -``` - -The sets the default data format for the service to JSON instead of XML. To invoke the service, navigate to `http://localhost/ServiceModelSamples/service.svc/Add?n1=100&n2=200` after completing the set up and build steps shown later in this topic. This testing functionality is enabled by the use of a HTTP GET request. - -The client Web page SimpleAjaxClientPage.aspx contains ASP.NET code to invoke the service whenever the user clicks one of the operation buttons on the page. The `ScriptManager` control is used to make a proxy to the service accessible through JavaScript. - -```aspx-csharp - - - - - -``` - -The local proxy is instantiated and operations are invoked using the following JavaScript code. - -```javascript -// Code for extracting arguments n1 and n2 omitted… -// Instantiate a service proxy -var proxy = new SimpleAjaxService.ICalculator(); -// Code for selecting operation omitted… -proxy.Add(parseFloat(n1), parseFloat(n2), onSuccess, onFail, null); -``` - -If the service call succeeds, the code invokes the `onSuccess` handler and the result of the operation is displayed in a text box. - -```javascript -function onSuccess(mathResult){ - document.getElementById("result").value = mathResult; -} -``` - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Ajax\SimpleAjaxService` diff --git a/docs/framework/wcf/samples/basic-binding.md b/docs/framework/wcf/samples/basic-binding.md deleted file mode 100644 index 6ec51e1afa64b..0000000000000 --- a/docs/framework/wcf/samples/basic-binding.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -description: "Learn more about: Basic Binding" -title: "Basic Binding" -ms.date: "03/30/2017" -ms.assetid: 2a0e8ac4-23e7-45ef-98dc-40691aac530a ---- -# Basic Binding - -This section contains basic samples that demonstrate using the binding attribute of an endpoint element. - -## In This Section - - [Message Security Sample](message-security-sample.md) - Demonstrates how to implement an application that uses the `basicHttpBinding` and message security. - - [BasicBinding with Transport Security](basicbinding-with-transport-security.md) - Demonstrates the use of SSL transport security with the basic binding. - - [BasicBinding](basicbinding.md) - Demonstrates the use of `basicHttpBinding` that provides HTTP communication and maximum interoperability with first- and second-generation Web services. diff --git a/docs/framework/wcf/samples/basic-data-contract.md b/docs/framework/wcf/samples/basic-data-contract.md deleted file mode 100644 index e4919746b44ca..0000000000000 --- a/docs/framework/wcf/samples/basic-data-contract.md +++ /dev/null @@ -1,144 +0,0 @@ ---- -description: "Learn more about: Basic Data Contract" -title: "Basic Data Contract" -ms.date: "03/30/2017" -helpviewer_keywords: - - "Data Contract" -ms.assetid: b124e9e0-cb73-4ae0-b9c3-e6cdf5eced98 ---- -# Basic Data Contract - -This sample demonstrates how to implement a data contract. Data contracts allow you to pass structured data to and from services. This sample is based on the [Getting Started](getting-started-sample.md) but uses complex numbers instead of basic numeric types. - -In this sample, the service is hosted by Internet Information Services (IIS) and the client is a console application (.exe). - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - - The service contract for this service uses complex numbers, as shown in the following sample code. - -```csharp -// Define a service contract. -[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")] -public interface ICalculator -{ - [OperationContract] - ComplexNumber Add(ComplexNumber n1, ComplexNumber n2); - [OperationContract] - ComplexNumber Subtract(ComplexNumber n1, ComplexNumber n2); - [OperationContract] - ComplexNumber Multiply(ComplexNumber n1, ComplexNumber n2); - [OperationContract] - ComplexNumber Divide(ComplexNumber n1, ComplexNumber n2); -} -``` - - The and attributes have been applied to the definition of the `ComplexNumber` class to indicate which fields of the class can be passed over the wire between the client and the service, as shown in the following sample code. - -```csharp -[DataContract(Namespace="http://Microsoft.ServiceModel.Samples")] -public class ComplexNumber -{ - [DataMember] - public double Real = 0.0D; - [DataMember] - public double Imaginary = 0.0D; - - public ComplexNumber(double real, double imaginary) - { - this.Real = real; - this.Imaginary = imaginary; - } -} -``` - -The service implementation calculates and returns the appropriate result, accepting and returning numbers of the `ComplexNumber` type. - -```csharp -// This is the service class that implements the service contract. -public class CalculatorService : ICalculator -{ - public ComplexNumber Add(ComplexNumber n1, ComplexNumber n2) - { - return new ComplexNumber(n1.Real + n2.Real, n1.Imaginary + - n2.Imaginary); - } - - public ComplexNumber Subtract(ComplexNumber n1, ComplexNumber n2) - { - return new ComplexNumber(n1.Real - n2.Real, n1.Imaginary - - n2.Imaginary); - } - public ComplexNumber Multiply(ComplexNumber n1, ComplexNumber n2) - { - double real1 = n1.Real * n2.Real; - double imaginary1 = n1.Real * n2.Imaginary; - double imaginary2 = n2.Real * n1.Imaginary; - double real2 = n1.Imaginary * n2.Imaginary * -1; - return new ComplexNumber(real1 + real2, imaginary1 + - imaginary2); - } - - public ComplexNumber Divide(ComplexNumber n1, ComplexNumber n2) - { - ComplexNumber conjugate = - new ComplexNumber(n2.Real, -1*n2.Imaginary); - ComplexNumber numerator = Multiply(n1, conjugate); - ComplexNumber denominator = Multiply(n2, conjugate); - return new ComplexNumber(numerator.Real / denominator.Real, - numerator.Imaginary); - } -} -``` - -The client implementation also uses complex numbers. Both the service contract and the data contract are defined in the source file generatedClient.cs, which is generated by the [ServiceModel Metadata Utility Tool (Svcutil.exe)](../servicemodel-metadata-utility-tool-svcutil-exe.md) from service metadata. - -```csharp -// Create a client. -DataContractCalculatorClient client = new DataContractCalculatorClient(); -// Call the Add service operation. -ComplexNumber value1 = new ComplexNumber() - { - Real = 1, - Imaginary = 2 - }; -ComplexNumber value2 = new ComplexNumber() - { - Real = 3, - Imaginary = 4 - }; -ComplexNumber result = proxy.Add(value1, value2); -Console.WriteLine("Add({0} + {1}i, {2} + {3}i) = {4} + {5}i", - value1.Real, value1.Imaginary, value2.Real, value2.Imaginary, - result.Real, result.Imaginary); - … -} -``` - -When you run the sample, the requests and responses of the operation are displayed in the client console window. Press ENTER in the client window to shut down the client. - -```console -Add(1 + 2i, 3 + 4i) = 4 + 6i -Subtract(1 + 2i, 3 + 4i) = -2 + -2i -Multiply(2 + 3i, 4 + 7i) = -13 + 26i -Divide(3 + 7i, 5 + -2i) = 0.0344827586206897 + 41i - -Press to terminate client. -``` - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Contract\Data\Basic` diff --git a/docs/framework/wcf/samples/basic-http-service.md b/docs/framework/wcf/samples/basic-http-service.md deleted file mode 100644 index 4b49340122b16..0000000000000 --- a/docs/framework/wcf/samples/basic-http-service.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -description: "Learn more about: Basic HTTP Service" -title: "Basic HTTP Service" -ms.date: "03/30/2017" -ms.assetid: 27048b43-8a54-4f2a-9952-594bbfab10ad ---- -# Basic HTTP Service - -This sample demonstrates how to implement an HTTP-based, RPC-based service - popularly referred to as "POX" (Plain Old XML) service – using the Windows Communication Foundation (WCF) REST Programming model. This sample consists of two components: a self-hosted WCF HTTP service (Service.cs) and a console application (Program.cs) that creates the service and makes calls to it. - -## Sample Details - -The WCF service exposes 2 operations, `EchoWithGet` and `EchoWithPost`, which returns the string that was passed as input. - -The `EchoWithGet` operation is annotated with , which indicates that the operation processes HTTP `GET` requests. Because the does not explicitly specify a , the operation expects the input string to be passed in using a query string parameter with name `s`. Note that the format of the URI that the service expects can be customized using the property. - -The `EchoWithPost` operation is annotated with , which indicates it is not a `GET` operation (it has side effects). Because the does not explicitly specify a `Method`, the operation processes HTTP `POST` requests that have the string in the request body (in the XML format, for instance). Note that the HTTP method and the format of the URI for the request can be customized using the and properties respectively. - -The App.config file configures the WCF service with a default that has the property set to `true`. As a result, the WCF infrastructure creates an automatic HTML based help page at `http://localhost:8000/Customers/help` that provides information about how to construct HTTP requests to the service and how to consume the service’s HTTP response. - -Program.cs demonstrates how a WCF channel factory can be used to make calls to the service and process responses. Note that this is just one way to access a WCF service. It is also possible to access the service using other .NET Framework classes like and . - -The sample consists a self-hosted service and a client that both run within a console application. As the console application runs, the client makes requests to the service and writes the pertinent information from the responses to the console window. - -#### To use this sample - -1. Open the solution for the Basic Http Service Sample. When launching Visual Studio 2012, you must run as an administrator for the sample to execute successfully. Do this by right-clicking the Visual Studio 2012 icon and selecting **Run as Administrator** from the context menu. - -2. Press CTRL+SHIFT+B to build the solution and then press Ctrl+F5 to run the console application without debugging. The console window appears and provides the URI of the running service and the URI of the HTML help page for the running service. At any point in time you can view the HTML help page by typing the URI of the help page in a browser. As the sample runs, the client writes the status of the current activity. - -3. Press any key to terminate the sample. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Web\BasicHttpService` diff --git a/docs/framework/wcf/samples/basic-sample.md b/docs/framework/wcf/samples/basic-sample.md deleted file mode 100644 index 4b4c410b8af3c..0000000000000 --- a/docs/framework/wcf/samples/basic-sample.md +++ /dev/null @@ -1,100 +0,0 @@ ---- -description: "Learn more about: Basic Sample" -title: "Basic Sample" -ms.date: "03/30/2017" -ms.assetid: c1910bc1-3d0a-4fa6-b12a-4ed6fe759620 ---- -# Basic Sample - -This sample shows how to make a service discoverable and how to search for and call a discoverable service. This sample is composed of two projects: service and client. - -> [!NOTE] -> This sample implements discovery in code. For a sample that implements discovery in configuration, see [Configuration](configuration-sample.md). - -## Service - -This is a simple calculator service implementation. The discovery related code can be found in `Main` where a is added to the service host and a is added as shown in the following code. - -```csharp -using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress)) -{ - serviceHost.AddServiceEndpoint(typeof(ICalculatorService), new - WSHttpBinding(), String.Empty); - - // Make the service discoverable over UDP multicast - serviceHost.Description.Behaviors.Add(new ServiceDiscoveryBehavior()); - serviceHost.AddServiceEndpoint(new UdpDiscoveryEndpoint()); - - serviceHost.Open(); - // ... -} -``` - -## Client - -The client uses a to locate the service. The , a standard endpoint, resolves the endpoint of the service when the client is opened. In this case, the looks for the service based on the service contract. The conducts the search over a by default. Once it locates a service endpoint, the client connects to that service over the specified binding. - -```csharp -public static void Main() -{ - DynamicEndpoint dynamicEndpoint = new DynamicEndpoint( ContractDescription.GetContract(typeof(ICalculatorService)), new WSHttpBinding()); - // ... -} -``` - -The client defines a method called `InvokeCalculatorService` that uses the class to search for services. The inherits from , so it can be passed to the `InvokeCalculatorService` method. The example then uses the to create an instance of `CalculatorServiceClient` and calls the various operations of the calculator service. - -```csharp -static void InvokeCalculatorService(ServiceEndpoint serviceEndpoint) -{ - // Create a client - CalculatorServiceClient client = new CalculatorServiceClient(serviceEndpoint); - - Console.WriteLine("Invoking CalculatorService"); - Console.WriteLine(); - - double value1 = 100.00D; - double value2 = 15.99D; - - // Call the Add service operation. - double result = client.Add(value1, value2); - Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result); - - // Call the Subtract service operation. - result = client.Subtract(value1, value2); - Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result); - - // Call the Multiply service operation. - result = client.Multiply(value1, value2); - Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result); - - // Call the Divide service operation. - result = client.Divide(value1, value2); - Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result); - Console.WriteLine(); - - //Closing the client gracefully closes the connection and cleans up resources - client.Close(); -} -``` - -#### To use this sample - -1. This sample uses HTTP endpoints and to run this sample, proper URL ACLs must be added. For more information, see [Configuring HTTP and HTTPS](../feature-details/configuring-http-and-https.md). Executing the following command at an elevated privilege should add the appropriate ACLs. You may want to substitute your Domain and Username for the following arguments if the command does not work as is. `netsh http add urlacl url=http://+:8000/ user=%DOMAIN%\%UserName%` - -2. Using Visual Studio 2012, open the Basic.sln and build the sample. - -3. Run the service.exe application. - -4. After the service has started, run the client.exe. - -5. Observe that the client was able to find the service without knowing its address. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Discovery\Basic` diff --git a/docs/framework/wcf/samples/basic.md b/docs/framework/wcf/samples/basic.md deleted file mode 100644 index 45d98e84bc50a..0000000000000 --- a/docs/framework/wcf/samples/basic.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -description: "Learn more about: Basic" -title: "Basic2" -ms.date: "03/30/2017" -ms.assetid: 04e4d3bd-ab89-4b50-8f42-2a4430751a9c ---- -# Basic - -This section includes sections of samples that demonstrate basic Windows Communication Foundation (WCF)functionality. - -## In This Section - - [Getting Started](getting-started-sample.md) - Demonstrates how to implement a typical service and a typical client using WCF. - - [AJAX](ajax.md) - Demonstrates Asynchronous JavaScript and XML. - - [Binding](binding.md) - Demonstrates using the binding attribute of an endpoint element. - - [Client](client.md) - Demonstrates WCF client applications. - - [Contract](contract.md) - Demonstrates data contracts. - - [Discovery](discovery-samples.md) - Demonstrates WCF discovery. - - [Management](management.md) - Demonstrates WCF management. - - [Routing Services](routing-services.md) - Demonstrates WCF routing services. - - [Security](security-in-wcf.md) - Demonstrates WCF security. - - [Services](services.md) - Demonstrates WCF services. - - [Syndication](syndication.md) - DemonstratesWCF syndication. - - [Web](web.md) - Demonstrates Web-hosting in WCF. diff --git a/docs/framework/wcf/samples/basicbinding-with-transport-security.md b/docs/framework/wcf/samples/basicbinding-with-transport-security.md deleted file mode 100644 index 5d3c06ccbe9c2..0000000000000 --- a/docs/framework/wcf/samples/basicbinding-with-transport-security.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -description: "Learn more about: BasicBinding with Transport Security" -title: "BasicBinding with Transport Security" -ms.date: "03/30/2017" -ms.assetid: f49b1de6-0254-4362-8ef2-fccd8ff9688b ---- -# BasicBinding with Transport Security - -This sample demonstrates the use of SSL transport security with the basic binding. This sample is based on the [Getting Started](getting-started-sample.md) that implements a calculator service. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Binding\Basic\TransportSecurity` - -## Sample Details - -By default, the basic binding supports HTTP communication. The sample shows how to enable transport security for the basic binding. Before you run the sample, you must create a certificate and assign it by using the Web Server Certificate Wizard. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - -The program code in the sample is identical to that of the [Getting Started](getting-started-sample.md) service. The endpoint definition and binding definition in the configuration file settings are modified to enable secure communication, as shown in the following sample configuration. - -```xml - - - - - - - - - - - - - - - - - - -``` - -Because the certificate used in this sample is a test certificate created with Makecert.exe, a security alert appears when you try to access an HTTPS: address in your browser, such as `https://localhost/servicemodelsamples/service.svc`. To allow the Windows Communication Foundation (WCF) client to work with a test certificate, some additional code is added to the client to suppress the security alert. This code, and the accompanying class, is not necessary when using real certificates. - -```csharp -// This code is required only for test certificates such as those -// created by Makecert.exe. -PermissiveCertificatePolicy.Enact("CN=ServiceModelSamples-HTTPS-Server"); -``` - -When you run the sample, the operation requests and responses are displayed in the client console window. Press ENTER in the client window to shut down the client. - -```console -Add(100,15.99) = 115.99 -Subtract(145,76.54) = 68.46 -Multiply(9,81.25) = 731.25 -Divide(22,7) = 3.14285714285714 - -Press to terminate client. -``` - -#### To set up, build, and run the sample - -1. Install ASP.NET 4.0 using the following command: - - ```console - %windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable - ``` - -2. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -3. Ensure that you have performed the [Internet Information Services (IIS) Server Certificate Installation Instructions](iis-server-certificate-installation-instructions.md). - -4. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -5. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). diff --git a/docs/framework/wcf/samples/basicbinding.md b/docs/framework/wcf/samples/basicbinding.md deleted file mode 100644 index 3cadc752e3725..0000000000000 --- a/docs/framework/wcf/samples/basicbinding.md +++ /dev/null @@ -1,92 +0,0 @@ ---- -description: "Learn more about: BasicBinding" -title: "BasicBinding" -ms.date: "03/30/2017" -ms.assetid: 86fbeb87-4d89-4b61-9577-867e0ac12945 ---- -# BasicBinding - -This sample demonstrates the use of `basicHttpBinding` that provides HTTP communication and maximum interoperability with first- and second-generation Web services. - -> [!NOTE] -> The set-up procedure and build instructions for this sample are located at the end of this topic. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Binding\Basic\Http` - -## Sample Details - -This sample is based on the [Getting Started](getting-started-sample.md) that implements a calculator service. - -To use the basic binding with default behavior, only the binding section name is required. If you want to configure the basic binding and change some of its settings, it is necessary to define a binding configuration. The endpoint must reference the binding configuration by name by using the `bindingConfiguration` attribute of the <`endpoint`> element, as shown in the following sample code. - -```xml - - - - - -``` - -In this sample, the binding configuration is named `"Binding1"` and is defined as shown in the following code example. - -```xml - - - - - - - -``` - -The binding element provides attributes for setting the host name comparison mode, maximum message size, proxy options, timeouts, message encoding, and other options. - -When you run the sample, the operation requests and responses are displayed in the client console window. Press ENTER in the client window to shut down the client. - -```console -Add(100,15.99) = 115.99 -Subtract(145,76.54) = 68.46 -Multiply(9,81.25) = 731.25 -Divide(22,7) = 3.14285714285714 - -Press to terminate client. -``` - -#### To set up, build, and run the sample - -1. Install ASP.NET 4.0 using the following command. - - ```console - %windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable - ``` - -2. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -3. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -4. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). diff --git a/docs/framework/wcf/samples/behavior-security.md b/docs/framework/wcf/samples/behavior-security.md deleted file mode 100644 index dfb570b53f842..0000000000000 --- a/docs/framework/wcf/samples/behavior-security.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -description: "Learn more about: Behavior Security" -title: "Behavior Security" -ms.date: "03/30/2017" -ms.assetid: 19710ae3-f197-4d28-ba9d-52e465006819 ---- -# Behavior Security - -This section includes samples that demonstrate configuring security for service behaviors. - -## In This Section - - [Service Auditing Behavior](service-auditing-behavior.md) - This sample demonstrates how to use the to enable auditing of security events during service operations. - - [Membership and Role Provider](membership-and-role-provider.md) - This sample demonstrates how a service can use the ASP.NET membership and role providers to authenticate and authorize clients. - - [Authorizing Access to Service Operations](authorizing-access-to-service-operations.md) - This sample demonstrates how to use the [\](../../configure-apps/file-schema/wcf/serviceauthorization-element.md) to enable use of the attribute to authorize access to service operations. - - [Impersonating the Client](impersonating-the-client.md) - This sample demonstrates how to impersonate the caller application at the service so that the service can access system resources on behalf of the caller. diff --git a/docs/framework/wcf/samples/behaviors.md b/docs/framework/wcf/samples/behaviors.md deleted file mode 100644 index 65d2d36469d5c..0000000000000 --- a/docs/framework/wcf/samples/behaviors.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -description: "Learn more about: Behaviors" -title: "Behaviors" -ms.date: "03/30/2017" -ms.assetid: b0885b65-4e74-4bc9-bbf0-eb7ebe566da1 ---- -# Behaviors - -This section contains samples that demonstrate Windows Communication Foundation (WCF) service behaviors. - -## In This Section - - [Concurrency](concurrency.md) - Demonstrates using the with the enumeration, which controls whether an instance of a service processes messages sequentially or concurrently. - - [Default Service Behavior](default-service-behavior.md) - Demonstrates how service behavior settings can be configured. - - [Instancing](instancing.md) - Demonstrates the instancing behavior setting, which controls how instances of a service class are created in response to client requests. - - [Metadata Publishing Behavior](metadata-publishing-behavior.md) - Demonstrates how to control the metadata publishing features of a service. - - [Service Transaction Behavior](service-transaction-behavior.md) - Demonstrates the use of a client-coordinated transaction and the settings of and to control service transaction behavior. - - [Service Debug Behavior](service-debug-behavior.md) - Demonstrates how service debug behavior settings can be configured. - - [Throttling](throttling.md) - Demonstrates the use of throttling controls. - - [Behavior Security](behavior-security.md) - Demonstrates configuring service behavior security. diff --git a/docs/framework/wcf/samples/binding-extensibility.md b/docs/framework/wcf/samples/binding-extensibility.md deleted file mode 100644 index 46d806210631a..0000000000000 --- a/docs/framework/wcf/samples/binding-extensibility.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -description: "Learn more about: Binding Extensibility" -title: "Binding Extensibility" -ms.date: "03/30/2017" -ms.assetid: cabdd583-ddf5-493e-9dba-c6c31cde8f65 ---- -# Binding Extensibility - -This section contains samples that demonstrate custom binding in Windows Communication Foundation (WCF). - -## In This Section - - - Demonstrates how to implement a binding that stacks or the on top of the . - - [WSStreamedHttpBinding](wsstreamedhttpbinding.md) - Demonstrates how to create a binding that is designed to support streaming scenarios when the HTTP transport is used. diff --git a/docs/framework/wcf/samples/binding.md b/docs/framework/wcf/samples/binding.md deleted file mode 100644 index 1c5567ebbbb8a..0000000000000 --- a/docs/framework/wcf/samples/binding.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -description: "Learn more about: Binding" -title: "Binding WCF Samples" -ms.date: "03/30/2017" -ms.assetid: 324fa627-d012-465a-b266-95594a09dac2 ---- -# Binding - -This section contains samples that demonstrate using the binding attribute of an endpoint element. - -## In this section - - [Basic Binding](basic-binding.md) - Demonstrates basic binding in WCF. - - [Custom Binding](custom-binding.md) - Demonstrates custom binding in WCF. - - [Net Binding](net-binding.md) - Demonstrates network binding in WCF. - - [WS Binding](ws-binding.md) - Demonstrates Windows Service binding in WCF. diff --git a/docs/framework/wcf/samples/building-the-samples.md b/docs/framework/wcf/samples/building-the-samples.md deleted file mode 100644 index 7123cbdafd485..0000000000000 --- a/docs/framework/wcf/samples/building-the-samples.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -description: "Learn more about: Building the Windows Communication Foundation Samples" -title: "Building the Windows Communication Foundation Samples" -ms.date: "03/30/2017" -ms.assetid: 2899e7a5-9cb2-4e8d-b8d2-f31391549198 ---- -# Building the Windows Communication Foundation Samples - -The Windows Communication Foundation (WCF) samples can be built using the Visual Studio IDE or using the **msbuild** command from the command line. Both procedures are described in this topic. - -> [!NOTE] -> Before building or running any of the WCF samples, ensure you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -## To build the sample using a command prompt - -1. Open Developer Command Prompt for Visual Studio and navigate to the language-specific subdirectory under the directory location where you installed the sample. - -2. Type `msbuild` at the command line. The client program files are built to *client\bin* and the service program files are built to *service\bin*. If the service is hosted by Internet Information Services (IIS), the service program files are also copied to the *servicemodelsamples* directory and its *\bin* subdirectory. - -> [!NOTE] -> You must set the ACLs on *%systemdrive%\inetpub\wwwroot* to grant modify permissions to the account under which you are running. Otherwise some post build events fail. Alternatively, you can leave the ACLs as they are and run the SDK command prompt as administrator. - -## To build the sample using Visual Studio - -1. From the **File** menu in Visual Studio, select **Open** > **Project/Solution**. Navigate to the language-specific subdirectory under the directory in which you installed the sample, and double-click the .sln file icon to open the solution in Visual Studio. - -1. From the **Build** menu, select **Rebuild Solution**. - - The client program files are built to client\bin and the service program files are built to service\bin. If the service is hosted in IIS, the service program files are also copied to the *servicemodelsamples* directory and its *\bin* subdirectory. - -> [!NOTE] -> You must set the ACLs on %systemdrive%\inetpub\wwwroot to grant modify permissions to the account under which you are running. Otherwise some post build events fail. Alternatively, you can leave the ACLs as they are and run the SDK command prompt or Visual Studio as administrator. Some Visual Studio actions (such as attaching a debugger to the ASP.NET worker process) also require administrative privileges. - -## Setup Batch Files and Scripts - - Setup.exe and Cleanup.exe batch files and scripts should be run from Developer Command Prompt for Visual Studio. Several set up and clean up files perform tasks that require administrative privileges and should be launched with administrator privileges. - -## Important Security Information about Metadata Endpoints - - To prevent unintentional disclosure of potentially sensitive service metadata, the default configuration for Windows Communication Foundation (WCF) services disables metadata publishing. This behavior is secure by default, but also means that you cannot use a metadata import tool (such as Svcutil.exe) to generate the client code required to call the service unless the service’s metadata publishing behavior is explicitly enabled in configuration. To make experimenting with the samples easier, almost all samples expose an unsecured metadata publishing endpoint. Such endpoints are potentially available to anonymous unauthenticated consumers and care must be taken before deploying such endpoints to ensure that publicly disclosing a service’s metadata is appropriate. For more information about publishing service metadata, see the [Metadata Publishing Behavior](metadata-publishing-behavior.md) sample. See the [Custom Secure Metadata Endpoint](custom-secure-metadata-endpoint.md) sample for a sample securing a metadata endpoint. - -## Exception Handling - - Generally speaking these samples do not include exception handling to keep the code focused on the subject of the sample. For more information about exception handling, see the [Expected Exceptions](expected-exceptions.md) sample. - -## Regenerating Clients and Configuration with Svcutil - - You can use the [ServiceModel Metadata Utility Tool (Svcutil.exe)](../servicemodel-metadata-utility-tool-svcutil-exe.md) to regenerate client code and configuration for most of the samples. Some samples require manually edited configuration. For example, if you use Svcutil.exe to regenerate the configuration for a sample that uses client certificate credentials, you must manually specify the credentials previously configured. Some samples use specific Svcutil.exe options to affect the generated code, these options are specified in the specific sample topics. - -### To regenerate the client and configuration files - -1. Open an SDK command prompt and navigate to the language-specific subdirectory under the directory location where you installed the sample. - -2. If the service is a Web-hosted type, use the following command. - - ```console - svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" http://localhost/servicemodelsamples/service.svc/mex /out:generatedClient.cs - ``` - - If the service is a self-hosted type the following command. - - ```console - svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" http://localhost:8000/servicemodelsamples/service.svc/mex /out:generatedClient.cs - ``` - - Replace `http://localhost:8000/ServiceModelSamples/service.svc/mex` with the address of the self-hosted service's mex endpoint. - - To generate the client in a Visual Basic type, use the following command. - - ```console - svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" http://localhost/servicemodelsamples/service.svc/mex /l:vb /out:generatedClient.vb - ``` - - If the service is a self-hosted type, use the following command. - - ```console - svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" http://localhost:8000/servicemodelsamples/service.svc/mex /l:vb /out:generatedClient.vb - ``` - - > [!NOTE] - > To skip the generation of client configuration add the **/noConfig** option. - -## See also - -- [Running the Windows Communication Foundation Samples](running-the-samples.md) -- [ServiceModel Metadata Utility Tool (Svcutil.exe)](../servicemodel-metadata-utility-tool-svcutil-exe.md) diff --git a/docs/framework/wcf/samples/channel-factory.md b/docs/framework/wcf/samples/channel-factory.md deleted file mode 100644 index f5f528b7e2527..0000000000000 --- a/docs/framework/wcf/samples/channel-factory.md +++ /dev/null @@ -1,78 +0,0 @@ ---- -description: "Learn more about: Channel Factory" -title: "Channel Factory" -ms.date: "03/30/2017" -ms.assetid: 09b53aa1-b13c-476c-a461-e82fcacd2a8b ---- -# Channel Factory - -This sample demonstrates how a client application can create a channel with the class instead of a generated client. This sample is based on the [Getting Started](getting-started-sample.md) that implements a calculator service. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - -This sample uses the class to create a channel to a service endpoint. Typically, to create a channel to a service endpoint you generate a client type with the [ServiceModel Metadata Utility Tool (Svcutil.exe)](../servicemodel-metadata-utility-tool-svcutil-exe.md) and create an instance of the generated type. You can also create a channel by using the class, as demonstrated in this sample. The service created by the following sample code is identical to the service in the [Getting Started](getting-started-sample.md). - -```csharp -EndpointAddress address = new EndpointAddress("http://localhost/servicemodelsamples/service.svc"); -WSHttpBinding binding = new WSHttpBinding(); -ChannelFactory factory = new - ChannelFactory(binding, address); -ICalculator channel = factory.CreateChannel(); -``` - -> [!IMPORTANT] -> If you are running this sample in a cross-machine scenario, you must replace "localhost" in the preceding code with the fully-qualified name of the machine that is running the service. This sample does not use configuration to set the endpoint address, so this must be done in code. - -Once the channel is created, service operations can be invoked just as with a generated client. - -```csharp -// Call the Add service operation. -double value1 = 100.00D; -double value2 = 15.99D; -double result = channel.Add(value1, value2); -Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result); -``` - -To close the channel, it must first be cast to an interface. This is because the channel as generated is declared in the client application using the `ICalculator` interface, which has methods like `Add` and `Subtract` but not `Close`. The `Close` method originates on the interface. - -```csharp -// Close the channel. - ((IClientChannel)client).Close(); -``` - -When you run the sample, the operation requests and responses are displayed in the client console window. Press ENTER in the client window to shut down the client application. - -```console -Add(100,15.99) = 115.99 -Subtract(145,76.54) = 68.46 -Multiply(9,81.25) = 731.25 -Divide(22,7) = 3.14285714285714 - -Press to terminate client. -``` - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). Note that this sample does not enable metadata publishing. You must first enable metadata publishing for this sample to regenerate the client type. - -3. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -### To run the sample cross machine - -1. Replace "localhost" in the following code with the fully-qualified name of the machine that is running the service. - - ```csharp - EndpointAddress address = new EndpointAddress("http://localhost/servicemodelsamples/service.svc"); - ``` - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Client\ChannelFactory` diff --git a/docs/framework/wcf/samples/channels-extensibility.md b/docs/framework/wcf/samples/channels-extensibility.md deleted file mode 100644 index 5d72a98ba4456..0000000000000 --- a/docs/framework/wcf/samples/channels-extensibility.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -description: "Learn more about: Channels Extensibility" -title: "Channels Extensibility" -ms.date: "03/30/2017" -ms.assetid: 4cc3b20b-778a-4ae8-b58c-a3822fb13065 ---- -# Channels Extensibility - -This section contains samples that demonstrate custom channels. - -## In This Section - - [Local Channel](local-channel.md) - Demonstrates the local channel, a WCF transport channel that is used for communication within the same application domain. - - [Reliable Secure Profile](reliable-secure-profile.md) - Demonstrates how to compose WCF and Reliable Secure Profile (RSP). - - [Custom Channel Dispatcher](custom-channel-dispatcher.md) - Demonstrates how to build the channel stack in a custom way by implementing directly and how to create a custom channel dispatcher in Web host environment. - - [Chunking Channel](chunking-channel.md) - Demonstrates how to limit the amount of memory used to buffer large messages sent using WCF. - - [HttpCookieSession](httpcookiesession.md) - Demonstrates how to build a custom protocol channel to use HTTP cookies for session management. - - [Custom Message Interceptor](custom-message-interceptor.md) - Demonstrates how to implement a custom binding element that creates channel factories and channel listeners to intercept all incoming and outgoing messages at a particular point in the run-time stack. diff --git a/docs/framework/wcf/samples/chunking-channel.md b/docs/framework/wcf/samples/chunking-channel.md deleted file mode 100644 index 35544c4512bd2..0000000000000 --- a/docs/framework/wcf/samples/chunking-channel.md +++ /dev/null @@ -1,391 +0,0 @@ ---- -description: "Learn more about: Chunking Channel" -title: "Chunking Channel" -ms.date: "03/30/2017" -ms.assetid: e4d53379-b37c-4b19-8726-9cc914d5d39f ---- -# Chunking Channel - -When sending large messages using Windows Communication Foundation (WCF), it is often desirable to limit the amount of memory used to buffer those messages. One possible solution is to stream the message body (assuming the bulk of the data is in the body). However some protocols require buffering of the entire message. Reliable messaging and security are two such examples. Another possible solution is to divide up the large message into smaller messages called chunks, send those chunks one chunk at a time, and reconstitute the large message on the receiving side. The application itself could do this chunking and de-chunking or it could use a custom channel to do it. The chunking channel sample shows how a custom protocol or layered channel can be used to do chunking and de-chunking of arbitrarily large messages. - -Chunking should always be employed only after the entire message to be sent has been constructed. A chunking channel should always be layered below a security channel and a reliable session channel. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Extensibility\Channels\ChunkingChannel` - -## Chunking Channel Assumptions and Limitations - -### Message Structure - -The chunking channel assumes the following message structure for messages to be chunked: - -```xml - - - - - data to be chunked - - - -``` - -When using the ServiceModel, contract operations that have 1 input parameter comply with this shape of message for their input message. Similarly, contract operations that have 1 output parameter or return value comply with this shape of message for their output message. The following are examples of such operations: - -```csharp -[ServiceContract] -interface ITestService -{ - [OperationContract] - Stream EchoStream(Stream stream); - - [OperationContract] - Stream DownloadStream(); - - [OperationContract(IsOneWay = true)] - void UploadStream(Stream stream); -} -``` - -### Sessions - -The chunking channel requires messages to be delivered exactly once, in ordered delivery of messages (chunks). This means the underlying channel stack must be sessionful. Sessions can be provided by the transport (for example, TCP transport) or by a sessionful protocol channel (for example, ReliableSession channel). - -### Asynchronous Send and Receive - -Asynchronous send and receive methods are not implemented in this version of the chunking channel sample. - -## Chunking Protocol - -The chunking channel defines a protocol that indicates the start and end of a series of chunks as well as the sequence number of each chunk. The following three example messages demonstrate the start, chunk and end messages with comments that describe the key aspects of each. - -### Start Message - -```xml - - - - http://samples.microsoft.com/chunkingAction - - -53f183ee-04aa-44a0-b8d3-e45224563109 - - - - - -http://tempuri.org/ITestService/EchoStream - - - - - - - - - - -``` - -### Chunk Message - -```xml - - - - - http://samples.microsoft.com/chunkingAction - - - - 53f183ee-04aa-44a0-b8d3-e45224563109 - - - - 1096 - - - - - -kfSr2QcBlkHTvQ== - - - -``` - -### End Message - -```xml - - - - http://samples.microsoft.com/chunkingAction - - - - 53f183ee-04aa-44a0-b8d3-e45224563109 - - - - - - 79 - - - - - - - - - -``` - -## Chunking Channel Architecture - -The chunking channel is an `IDuplexSessionChannel` that, at a high level, follows the typical channel architecture. There is a `ChunkingBindingElement` that can build a `ChunkingChannelFactory` and a `ChunkingChannelListener`. The `ChunkingChannelFactory` creates instances of `ChunkingChannel` when it is asked to. The `ChunkingChannelListener` creates instances of `ChunkingChannel` when a new inner channel is accepted. The `ChunkingChannel` itself is responsible for sending and receiving messages. - -At the next level down, `ChunkingChannel` relies on several components to implement the chunking protocol. On the send side, the channel uses a custom called `ChunkingWriter` that does the actual chunking. `ChunkingWriter` uses the inner channel directly to send chunks. Using a custom `XmlDictionaryWriter` allows us to send out chunks as the large body of the original message is being written. This means we do not buffer the entire original message. - -![Diagram that shows the chunking channel send architecture.](./media/chunking-channel/chunking-channel-send.gif) - -On the receive side, `ChunkingChannel` pulls messages from the inner channel and hands them to a custom called `ChunkingReader`, which reconstitutes the original message from the incoming chunks. `ChunkingChannel` wraps this `ChunkingReader` in a custom `Message` implementation called `ChunkingMessage` and returns this message to the layer above. This combination of `ChunkingReader` and `ChunkingMessage` allows us to de-chunk the original message body as it is being read by the layer above instead of having to buffer the entire original message body. `ChunkingReader` has a queue where it buffers incoming chunks up to a maximum configurable number of buffered chunks. When this maximum limit is reached, the reader waits for messages to be drained from the queue by the layer above (that is, by just reading from the original message body) or until the maximum receive timeout is reached. - -![Diagram that shows the chunking channel receive architecture.](./media/chunking-channel/chunking-channel-receive.gif) - -## Chunking Programming Model - -Service developers can specify which messages are to be chunked by applying the `ChunkingBehavior` attribute to operations within the contract. The attribute exposes an `AppliesTo` property that allows the developer to specify whether chunking applies to the input message, the output message or both. The following example shows the usage of `ChunkingBehavior` attribute: - -```csharp -[ServiceContract] -interface ITestService -{ - [OperationContract] - [ChunkingBehavior(ChunkingAppliesTo.Both)] - Stream EchoStream(Stream stream); - - [OperationContract] - [ChunkingBehavior(ChunkingAppliesTo.OutMessage)] - Stream DownloadStream(); - - [OperationContract(IsOneWay=true)] - [ChunkingBehavior(ChunkingAppliesTo.InMessage)] - void UploadStream(Stream stream); - -} -``` - -From this programming model, the `ChunkingBindingElement` compiles a list of action URIs that identify messages to be chunked. The action of each outgoing message is compared against this list to determine if the message should be chunked or sent directly. - -## Implementing the Send Operation - -At a high level, the Send operation first checks whether the outgoing message must be chunked and, if not, sends the message directly using the inner channel. - -If the message must be chunked, Send creates a new `ChunkingWriter` and calls `WriteBodyContents` on the outgoing message passing it this `ChunkingWriter`. The `ChunkingWriter` then does the message chunking (including copying original message headers to the start chunk message) and sends chunks using the inner channel. - -A few details worth noting: - -- Send first calls `ThrowIfDisposedOrNotOpened` to ensure the `CommunicationState` is opened. - -- Sending is synchronized so that only one message can be sent at a time for each session. There is a `ManualResetEvent` named `sendingDone` that is reset when a chunked message is being sent. Once the end chunk message is sent, this event is set. The Send method waits for this event to be set before it tries to send the outgoing message. - -- Send locks the `CommunicationObject.ThisLock` to prevent synchronized state changes while sending. See the documentation for more information about states and state machine. - -- The timeout passed to Send is used as the timeout for the entire send operation which includes sending all of the chunks. - -- The custom design was chosen to avoid buffering the entire original message body. If we were to get an on the body using `message.GetReaderAtBodyContents` the entire body would be buffered. Instead, we have a custom that is passed to `message.WriteBodyContents`. As the message calls WriteBase64 on the writer, the writer packages up chunks into messages and sends them using the inner channel. WriteBase64 blocks until the chunk is sent. - -## Implementing the Receive Operation - -At a high level, the Receive operation first checks that the incoming message is not `null` and that its action is the `ChunkingAction`. If it does not meet both criteria, the message is returned unchanged from Receive. Otherwise, Receive creates a new `ChunkingReader` and a new `ChunkingMessage` wrapped around it (by calling `GetNewChunkingMessage`). Before returning that new `ChunkingMessage`, Receive uses a threadpool thread to execute `ReceiveChunkLoop`, which calls `innerChannel.Receive` in a loop and hands off chunks to the `ChunkingReader` until the end chunk message is received or the receive timeout is hit. - -A few details worth noting: - -- Like Send, Receive first calls `ThrowIfDisposedOrNotOepned` to ensure the `CommunicationState` is Opened. - -- Receive is also synchronized so that only one message can be received at a time from the session. This is especially important because once a start chunk message is received, all subsequent received messages are expected to be chunks within this new chunk sequence until an end chunk message is received. Receive cannot pull messages from the inner channel until all chunks that belong to the message currently being de-chunked are received. To accomplish this, Receive uses a `ManualResetEvent` named `currentMessageCompleted`, which is set when the end chunk message is received and reset when a new start chunk message is received. - -- Unlike Send, Receive does not prevent synchronized state transitions while receiving. For example, Close can be called while receiving and waits until the pending receive of the original message is completed or the specified timeout value is reached. - -- The timeout passed to Receive is used as the timeout for the entire receive operation, which includes receiving all of the chunks. - -- If the layer that consumes the message is consuming the message body at a rate lower than the rate of incoming chunk messages, the `ChunkingReader` buffers those incoming chunks up to the limit specified by `ChunkingBindingElement.MaxBufferedChunks`. Once that limit is reached, no more chunks are pulled from the lower layer until either a buffered chunk is consumed or the receive timeout is reached. - -## CommunicationObject Overrides - -### OnOpen - -`OnOpen` calls `innerChannel.Open` to open the inner channel. - -### OnClose - -`OnClose` first sets `stopReceive` to `true` to signal the pending `ReceiveChunkLoop` to stop. It then waits for the `receiveStopped` , which is set when `ReceiveChunkLoop` stops. Assuming the `ReceiveChunkLoop` stops within the specified timeout, `OnClose` calls `innerChannel.Close` with the remaining timeout. - -### OnAbort - -`OnAbort` calls `innerChannel.Abort` to abort the inner channel. If there is a pending `ReceiveChunkLoop` it gets an exception from the pending `innerChannel.Receive` call. - -### OnFaulted - -The `ChunkingChannel` does not require special behavior when the channel is faulted so `OnFaulted` is not overridden. - -## Implementing Channel Factory - -The `ChunkingChannelFactory` is responsible for creating instances of `ChunkingDuplexSessionChannel` and for cascading state transitions to the inner channel factory. - -`OnCreateChannel` uses the inner channel factory to create an `IDuplexSessionChannel` inner channel. It then creates a new `ChunkingDuplexSessionChannel` passing it this inner channel along with the list of message actions to be chunked and the maximum number of chunks to buffer upon receive. The list of message actions to be chunked and the maximum number of chunks to buffer are two parameters passed to `ChunkingChannelFactory` in its constructor. The section on `ChunkingBindingElement` describes where these values come from. - -The `OnOpen`, `OnClose`, `OnAbort` and their asynchronous equivalents call the corresponding state transition method on the inner channel factory. - -## Implementing Channel Listener - -The `ChunkingChannelListener` is a wrapper around an inner channel listener. Its main function, besides delegate calls to that inner channel listener, is to wrap new `ChunkingDuplexSessionChannels` around channels accepted from the inner channel listener. This is done in `OnAcceptChannel` and `OnEndAcceptChannel`. The newly created `ChunkingDuplexSessionChannel` is passed the inner channel along with the other parameters previously described. - -## Implementing Binding Element and Binding - -`ChunkingBindingElement` is responsible for creating the `ChunkingChannelFactory` and `ChunkingChannelListener`. The `ChunkingBindingElement` checks whether T in `CanBuildChannelFactory`\ and `CanBuildChannelListener`\ is of type `IDuplexSessionChannel` (the only channel supported by the chunking channel) and that the other binding elements in the binding support this channel type. - -`BuildChannelFactory`\ first checks that the requested channel type can be built and then gets a list of message actions to be chunked. For more information, see the following section. It then creates a new `ChunkingChannelFactory` passing it the inner channel factory (as returned from `context.BuildInnerChannelFactory`), the list of message actions, and the maximum number of chunks to buffer. The maximum number of chunks comes from a property called `MaxBufferedChunks` exposed by the `ChunkingBindingElement`. - -`BuildChannelListener` has a similar implementation for creating `ChunkingChannelListener` and passing it the inner channel listener. - -There is an example binding included in this sample named `TcpChunkingBinding`. This binding consists of two binding elements: `TcpTransportBindingElement` and `ChunkingBindingElement`. In addition to exposing the `MaxBufferedChunks` property, the binding also sets some of the `TcpTransportBindingElement` properties such as `MaxReceivedMessageSize` (sets it to `ChunkingUtils.ChunkSize` + 100KB bytes for headers). - -`TcpChunkingBinding` also implements `IBindingRuntimePreferences` and returns true from the `ReceiveSynchronously` method indicating that only the synchronous Receive calls are implemented. - -### Determining Which Messages To Chunk - -The chunking channel chunks only the messages identified through the `ChunkingBehavior` attribute. The `ChunkingBehavior` class implements `IOperationBehavior` and is implemented by calling the `AddBindingParameter` method. In this method, the `ChunkingBehavior` examines the value of its `AppliesTo` property (`InMessage`, `OutMessage` or both) to determine which messages should be chunked. It then gets the action of each of those messages (from the Messages collection on `OperationDescription`) and adds it to a string collection contained within an instance of `ChunkingBindingParameter`. It then adds this `ChunkingBindingParameter` to the provided `BindingParameterCollection`. - -This `BindingParameterCollection` is passed inside the `BindingContext` to each binding element in the binding when that binding element builds the channel factory or the channel listener. The `ChunkingBindingElement`'s implementation of `BuildChannelFactory` and `BuildChannelListener` pull this `ChunkingBindingParameter` out of the `BindingContext’`s `BindingParameterCollection`. The collection of actions contained within the `ChunkingBindingParameter` is then passed to the `ChunkingChannelFactory` or `ChunkingChannelListener`, which in turn passes it to the `ChunkingDuplexSessionChannel`. - -## Running the Sample - -#### To set up, build, and run the sample - -1. Install ASP.NET 4.0 using the following command. - - ```console - %windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable - ``` - -2. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -3. To build the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -4. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -5. Run Service.exe first, then run Client.exe and watch both console windows for output. - -When running the sample, the following output is expected. - -Client: - -```console -Press enter when service is available - - > Sent chunk 1 of message 867c1fd1-d39e-4be1-bc7b-32066d7ced10 - > Sent chunk 2 of message 867c1fd1-d39e-4be1-bc7b-32066d7ced10 - > Sent chunk 3 of message 867c1fd1-d39e-4be1-bc7b-32066d7ced10 - > Sent chunk 4 of message 867c1fd1-d39e-4be1-bc7b-32066d7ced10 - > Sent chunk 5 of message 867c1fd1-d39e-4be1-bc7b-32066d7ced10 - > Sent chunk 6 of message 867c1fd1-d39e-4be1-bc7b-32066d7ced10 - > Sent chunk 7 of message 867c1fd1-d39e-4be1-bc7b-32066d7ced10 - > Sent chunk 8 of message 867c1fd1-d39e-4be1-bc7b-32066d7ced10 - > Sent chunk 9 of message 867c1fd1-d39e-4be1-bc7b-32066d7ced10 - > Sent chunk 10 of message 867c1fd1-d39e-4be1-bc7b-32066d7ced10 - < Received chunk 1 of message 5b226ad5-c088-4988-b737-6a565e0563dd - < Received chunk 2 of message 5b226ad5-c088-4988-b737-6a565e0563dd - < Received chunk 3 of message 5b226ad5-c088-4988-b737-6a565e0563dd - < Received chunk 4 of message 5b226ad5-c088-4988-b737-6a565e0563dd - < Received chunk 5 of message 5b226ad5-c088-4988-b737-6a565e0563dd - < Received chunk 6 of message 5b226ad5-c088-4988-b737-6a565e0563dd - < Received chunk 7 of message 5b226ad5-c088-4988-b737-6a565e0563dd - < Received chunk 8 of message 5b226ad5-c088-4988-b737-6a565e0563dd - < Received chunk 9 of message 5b226ad5-c088-4988-b737-6a565e0563dd - < Received chunk 10 of message 5b226ad5-c088-4988-b737-6a565e0563dd -``` - -Server: - -```console -Service started, press enter to exit - < Received chunk 1 of message 867c1fd1-d39e-4be1-bc7b-32066d7ced10 - < Received chunk 2 of message 867c1fd1-d39e-4be1-bc7b-32066d7ced10 - < Received chunk 3 of message 867c1fd1-d39e-4be1-bc7b-32066d7ced10 - < Received chunk 4 of message 867c1fd1-d39e-4be1-bc7b-32066d7ced10 - < Received chunk 5 of message 867c1fd1-d39e-4be1-bc7b-32066d7ced10 - < Received chunk 6 of message 867c1fd1-d39e-4be1-bc7b-32066d7ced10 - < Received chunk 7 of message 867c1fd1-d39e-4be1-bc7b-32066d7ced10 - < Received chunk 8 of message 867c1fd1-d39e-4be1-bc7b-32066d7ced10 - < Received chunk 9 of message 867c1fd1-d39e-4be1-bc7b-32066d7ced10 - < Received chunk 10 of message 867c1fd1-d39e-4be1-bc7b-32066d7ced10 - > Sent chunk 1 of message 5b226ad5-c088-4988-b737-6a565e0563dd - > Sent chunk 2 of message 5b226ad5-c088-4988-b737-6a565e0563dd - > Sent chunk 3 of message 5b226ad5-c088-4988-b737-6a565e0563dd - > Sent chunk 4 of message 5b226ad5-c088-4988-b737-6a565e0563dd - > Sent chunk 5 of message 5b226ad5-c088-4988-b737-6a565e0563dd - > Sent chunk 6 of message 5b226ad5-c088-4988-b737-6a565e0563dd - > Sent chunk 7 of message 5b226ad5-c088-4988-b737-6a565e0563dd - > Sent chunk 8 of message 5b226ad5-c088-4988-b737-6a565e0563dd - > Sent chunk 9 of message 5b226ad5-c088-4988-b737-6a565e0563dd - > Sent chunk 10 of message 5b226ad5-c088-4988-b737-6a565e0563dd -``` diff --git a/docs/framework/wcf/samples/circular-tracing.md b/docs/framework/wcf/samples/circular-tracing.md deleted file mode 100644 index d03445e48e956..0000000000000 --- a/docs/framework/wcf/samples/circular-tracing.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -description: "Learn more about: Circular Tracing" -title: "Circular Tracing" -ms.date: "03/30/2017" -ms.assetid: 5ff139f9-8806-47bc-8f33-47fe6c436b92 ---- -# Circular Tracing - -This sample demonstrates the implementation of a circular buffer trace listener. A common scenario for production services is to have services that are available for long periods of time and to have trace logging enabled at a low level. These services consume a lot of disk space. When troubleshooting a service, the most recent data in the trace log is relevant to solving a problem. This sample demonstrates an implementation of a circular buffer trace listener in which only the most recent traces are kept on disk up to a configurable amount of data. This sample is based on the [Getting Started](getting-started-sample.md) and includes a custom tracing listener. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - -This sample assumes that you are familiar with the [Tracing and Message Logging](tracing-and-message-logging.md) sample and have read the documentation provided for the [Tracing and Message Logging](tracing-and-message-logging.md) sample. - -## Circular Buffer Trace Listener - -The concept behind the implementation of the Circular Buffer Trace Listener is to have two files that can each store up to half of the total desired trace log data. The listener creates one file and writes to that file until it reaches the limit of half of the data size, at which point it switches to a second file. When the listener reaches the limit for the second file - it overwrites the first file with new traces. - -This listener derives from the `XmlWriteTraceListener` and allows the logs to be viewed with the [Service Trace Viewer Tool (SvcTraceViewer.exe)](../service-trace-viewer-tool-svctraceviewer-exe.md). When attempting to view the logs, the two log files can be easily recombined by opening both of the log files at the same time in the Service Trace Viewer tool. The Service Trace Viewer tool automatically takes care of sorting the traces so that they appear in the correct order. - -## Configuration - -A service can be configured to use the Circular Buffer Trace Listener by adding the following code for a listener and source elements. The max file size is specified by setting the `maxFileSizeKB` attribute in the circular trace listener's configuration. This is demonstrated in the following code. - -```xml - - - - - - - - - - - - - -``` - -#### To set up, build, and run the sample - -1. Be sure you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-computer configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -> [!IMPORTANT] -> The samples may already be installed on your computer. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Management\CircularTracing` - -## See also - -- [AppFabric Monitoring Samples](/previous-versions/appfabric/ff383407(v=azure.10)) diff --git a/docs/framework/wcf/samples/client-interoperability.md b/docs/framework/wcf/samples/client-interoperability.md deleted file mode 100644 index 5f3a43418f2e9..0000000000000 --- a/docs/framework/wcf/samples/client-interoperability.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -description: "Learn more about: Client Interoperability" -title: "Client Interoperability" -ms.date: "03/30/2017" -ms.assetid: e890e40a-b76a-48c4-9e5b-a4b385fac847 ---- -# Client Interoperability - -This section contains samples that demonstrate interoperability between Windows Communication Foundation (WCF) and other technologies. - -## In This Section - - [Interoperating with ASMX Web Services](interoperating-with-asmx-web-services.md) - Demonstrates how to integrate a WCF client application with an existing ASMX Web service. - - [XMLSerializer Sample](xmlserializer-sample.md) - Demonstrates how to serialize and deserialize types that are compatible with the . diff --git a/docs/framework/wcf/samples/client-validation.md b/docs/framework/wcf/samples/client-validation.md deleted file mode 100644 index 51c2d29fd92f8..0000000000000 --- a/docs/framework/wcf/samples/client-validation.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -description: "Learn more about: Client Validation" -title: "Client Validation" -ms.date: "03/30/2017" -ms.assetid: f0c1f805-1a81-4d0d-a112-bf5e2e87a631 ---- -# Client Validation - -Services frequently publish metadata to enable automatic generation and configuration of client proxy types. When the service is not trusted, client applications should validate that the metadata conforms to the client application's policy regarding security, transactions, the type of service contract and so on. The following sample demonstrates how to write a client endpoint behavior that validates the service endpoint to ensure that service endpoint is safe to use. - - The service exposes four service endpoints. The first endpoint uses the WSDualHttpBinding, the second endpoint uses NTLM authentication, the third endpoint enables transaction flow, and the fourth endpoint uses certificate-based authentication. - - The client uses the class to retrieve the metadata for the service. The client enforces a policy of prohibiting duplex bindings, NTLM authentication, and transaction flow using a validating behavior. For each instance imported from the service's metadata, the client application adds an instance of the `InternetClientValidatorBehavior` endpoint behavior to the before attempting to use a Windows Communication Foundation (WCF) client to connect to the endpoint. The behavior's `Validate` method runs before any operations on the service are called and enforces the client's policy by throwing `InvalidOperationExceptions`. - -### To build the sample - -1. To build the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -### To run the sample on the same computer - -1. Open a Developer Command Prompt for Visual Studio with administrator privileges and run Setup.bat from the sample install folder. This installs all the certificates required for running the sample. - -2. Run the service application from \service\bin\Debug. - -3. Run the client application from \client\bin\Debug. Client activity is displayed on the client console application. - -4. If the client and service are not able to communicate, see [Troubleshooting Tips for WCF Samples](/previous-versions/dotnet/netframework-3.5/ms751511(v=vs.90)). - -5. Remove the certificates by running Cleanup.bat when you have finished with the sample. Other security samples use the same certificates. - -### To run the sample across computers - -1. On the server, in a Developer Command Prompt for Visual Studio run with administrator privileges, type `setup.bat service`. Running `setup.bat` with the `service` argument creates a service certificate with the fully-qualified domain name of the computer and exports the service certificate to a file named Service.cer. - -2. On the server, edit App.config to reflect the new certificate name. That is, change the `findValue` attribute in the [\](../../configure-apps/file-schema/wcf/servicecertificate-of-clientcredentials-element.md) element to the fully-qualified domain name of the computer. - -3. Copy the Service.cer file from the service directory to the client directory on the client computer. - -4. On the client, open a Developer Command Prompt for Visual Studio with administrator privileges, and type `setup.bat client`. Running `setup.bat` with the `client` argument creates a client certificate named Client.com and exports the client certificate to a file named Client.cer. - -5. In the client.cs file change the address value of the MEX endpoint and the `findValue` for setting the default server certificate to match the new address of your service. You do this by replacing localhost with the fully-qualified domain name of the server. Rebuild. - -6. Copy the Client.cer file from the client directory to the service directory on the server. - -7. On the client, run ImportServiceCert.bat in a Developer Command Prompt for Visual Studio opened with administrator privileges. This imports the service certificate from the Service.cer file into the CurrentUser - TrustedPeople store. - -8. On the server, run ImportClientCert.bat in a Developer Command Prompt for Visual Studio opened with administrator privileges. This imports the client certificate from the Client.cer file into the LocalMachine - TrustedPeople store. - -9. On the service computer, build the service project in Visual Studio and run service.exe. - -10. On the client computer, run client.exe. - - 1. If the client and service are not able to communicate, see [Troubleshooting Tips for WCF Samples](/previous-versions/dotnet/netframework-3.5/ms751511(v=vs.90)). - -### To clean up after the sample - -- Run Cleanup.bat in the samples folder once you have finished running the sample. - - > [!NOTE] - > This script does not remove service certificates on a client when running this sample across computers. If you have run WCF samples that use certificates across computers, be sure to clear the service certificates that have been installed in the CurrentUser - TrustedPeople store. To do this, use the following command: `certmgr -del -r CurrentUser -s TrustedPeople -c -n . For example: certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com`. - -## See also - -- [Using Metadata](../feature-details/using-metadata.md) diff --git a/docs/framework/wcf/samples/client.md b/docs/framework/wcf/samples/client.md deleted file mode 100644 index 3711640fedc93..0000000000000 --- a/docs/framework/wcf/samples/client.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -description: "Learn more about: Client" -title: "Client" -ms.date: "03/30/2017" -ms.assetid: fabb0c70-b79b-4e58-a5d3-9705de85ee5b ---- -# Client - -This section contains samples that demonstrate Windows Communication Foundation (WCF) client applications. - -## In This Section - - [Client Interoperability](client-interoperability.md) - Demonstrates interoperability between WCF and other technologies. - - [Address Headers](address-headers.md) - Demonstrates how clients can pass reference parameters to a service using WCF. - - [Channel Factory](channel-factory.md) - Demonstrates how a client application can create a channel with the class instead of a generated client. - - [Expected Exceptions](expected-exceptions.md) - Demonstrates how to catch expected exceptions when using a typed client. - - [Retrieve Metadata](retrieve-metadata.md) - Demonstrates how to implement a client that dynamically retrieves metadata from a service to choose an endpoint with which to communicate. - - [Use Close and Abort to release WCF client resources](use-close-abort-release-wcf-client-resources.md) - Demonstrates how you should not use the C# "using" statement to automatically clean up resources when using a typed client. - - [Typed Client](typed-client.md) - Demonstrates how to obtain information from a typed client generated by the [ServiceModel Metadata Utility Tool (Svcutil.exe)](../servicemodel-metadata-utility-tool-svcutil-exe.md). diff --git a/docs/framework/wcf/samples/concurrency.md b/docs/framework/wcf/samples/concurrency.md deleted file mode 100644 index a5fd0182bbfb1..0000000000000 --- a/docs/framework/wcf/samples/concurrency.md +++ /dev/null @@ -1,109 +0,0 @@ ---- -description: "Learn more about: Concurrency" -title: "Concurrency" -ms.date: "03/30/2017" -helpviewer_keywords: - - "service behaviors, concurency sample" - - "Concurrency Sample [Windows Communication Foundation]" -ms.assetid: f8dbdfb3-6858-4f95-abe3-3a1db7878926 ---- -# Concurrency - -The Concurrency sample demonstrates using the with the enumeration, which controls whether an instance of a service processes messages sequentially or concurrently. The sample is based on the [Getting Started](getting-started-sample.md), which implements the `ICalculator` service contract. This sample defines a new contract, `ICalculatorConcurrency`, which inherits from `ICalculator`, providing two additional operations for inspecting the state of the service concurrency. By altering the concurrency setting, you can observe the change in behavior by running the client. - - In this sample, the client is a console application (.exe) and the service is hosted by Internet Information Services (IIS). - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - - There are three concurrency modes available: - -- `Single`: Each service instance processes one message at a time. This is the default concurrency mode. - -- `Multiple`: Each service instance processes multiple messages concurrently. The service implementation must be thread-safe to use this concurrency mode. - -- `Reentrant`: Each service instance processes one message at a time, but accepts reentrant calls. The service only accepts these calls when it is calling out. Reentrant is demonstrated in the [ConcurrencyMode.Reentrant](concurrencymode-reentrant.md) sample. - - The use of concurrency is related to the instancing mode. In instancing, concurrency is not relevant, because each message is processed by a new service instance. In instancing, either or concurrency is relevant, depending on whether the single instance processes messages sequentially or concurrently. In instancing, any of the concurrency modes may be relevant. - - The service class specifies concurrency behavior with the `[ServiceBehavior(ConcurrencyMode=)]` attribute as shown in the code sample that follows. By changing which lines are commented out, you can experiment with the `Single` and `Multiple` concurrency modes. Remember to rebuild the service after changing the concurrency mode. - -```csharp -// Single allows a single message to be processed sequentially by each service instance. -//[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.Single)] - -// Multiple allows concurrent processing of multiple messages by a service instance. -// The service implementation should be thread-safe. This can be used to increase throughput. -[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)] - -// Uses Thread.Sleep to vary the execution time of each operation. -public class CalculatorService : ICalculatorConcurrency -{ - int operationCount; - - public double Add(double n1, double n2) - { - operationCount++; - System.Threading.Thread.Sleep(180); - return n1 + n2; - } - - public double Subtract(double n1, double n2) - { - operationCount++; - System.Threading.Thread.Sleep(100); - return n1 - n2; - } - - public double Multiply(double n1, double n2) - { - operationCount++; - System.Threading.Thread.Sleep(150); - return n1 * n2; - } - - public double Divide(double n1, double n2) - { - operationCount++; - System.Threading.Thread.Sleep(120); - return n1 / n2; - } - - public string GetConcurrencyMode() - { - // Return the ConcurrencyMode of the service. - ServiceHost host = (ServiceHost)OperationContext.Current.Host; - ServiceBehaviorAttribute behavior = host.Description.Behaviors.Find(); - return behavior.ConcurrencyMode.ToString(); - } - - public int GetOperationCount() - { - // Return the number of operations. - return operationCount; - } -} -``` - - The sample uses concurrency with instancing by default. The client code has been modified to use an asynchronous proxy. This allows the client to make multiple calls to the service without waiting for a response between each call. You can observe the difference in behavior of the service concurrency mode. - - When you run the sample, the operation requests and responses are displayed in the client console window. The concurrency mode that the service is running under is displayed, each operation is called, and then the operation count is displayed. Notice that when the concurrency mode is `Multiple`, the results are returned in a different order than how they were called, because the service processes multiple messages concurrently. By changing the concurrency mode to `Single`, the results are returned in the order they were called, because the service processes each message sequentially. Press ENTER in the client window to shut down the client. - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. If you use Svcutil.exe to generate the proxy client, ensure that you include the `/async` option. - -3. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -4. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Services\Behaviors\Concurrency` diff --git a/docs/framework/wcf/samples/concurrencymode-reentrant.md b/docs/framework/wcf/samples/concurrencymode-reentrant.md deleted file mode 100644 index fd06ef427cf3f..0000000000000 --- a/docs/framework/wcf/samples/concurrencymode-reentrant.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -description: "Learn more about: ConcurrencyMode Reentrant" -title: "ConcurrencyMode Reentrant" -ms.date: "03/30/2017" -ms.assetid: b2046c38-53d8-4a6c-a084-d6c7091d92b1 ---- -# ConcurrencyMode Reentrant - -This sample demonstrates the necessity and implications of using ConcurrencyMode.Reentrant on a service implementation. ConcurrencyMode.Reentrant implies that the service (or callback) processes only one message at a given time (analogous to `ConcurencyMode.Single`). To ensure thread safety, Windows Communication Foundation (WCF) locks the `InstanceContext` processing a message so that no other messages can be processed. In case of Reentrant mode, the `InstanceContext` is unlocked just before the service makes an outgoing call thereby allowing the subsequent call, (which can be reentrant as demonstrated in the sample) to get the lock next time it comes in to the service. To demonstrate the behavior, the sample shows how a client and service can send messages between each other using a duplex contract. - - The contract defined is a duplex contract with the `Ping` method being implemented by the service and the callback method `Pong` being implemented by the client. A client invokes the server's `Ping` method with a tick count thereby initiating the call. The service checks whether the tick count is not equal to 0 and then invokes the callbacks `Pong` method while decrementing the tick count. This is done by the following code in the sample. - -```csharp -public void Ping(int ticks) -{ - Console.WriteLine("Ping: Ticks = " + ticks); - //Keep pinging back and forth till Ticks reaches 0. - if (ticks != 0) - { - OperationContext.Current.GetCallbackChannel().Pong((ticks - 1)); - } -} -``` - - The callback's `Pong` implementation has the same logic as the `Ping` implementation. That is, it checks whether the tick count is not zero and then invokes the `Ping` method on the callback channel (in this case, it is the channel that was used to send the original `Ping` message) with the tick count decremented by 1. The moment the tick count reaches 0, the method returns thereby unwrapping all the replies back to the first call made by the client that initiated the call. This is shown in the callback implementation. - -```csharp -public void Pong(int ticks) -{ - Console.WriteLine("Pong: Ticks = " + ticks); - if (ticks != 0) - { - //Retrieve the Callback Channel (in this case the Channel which was used to send the - //original message) and make an outgoing call until ticks reaches 0. - IPingPong channel = OperationContext.Current.GetCallbackChannel(); - channel.Ping((ticks - 1)); - } -} -``` - - Both the `Ping` and `Pong` methods are request/reply, which means that the first call to `Ping` does not return until the call to `CallbackChannel.Pong()` returns. On the client, the `Pong` method cannot return until the next `Ping` call that it made returns. Because both the callback and the service must make outgoing request/reply calls before they can reply for the pending request, both the implementations must be marked with the ConcurrencyMode.Reentrant behavior. - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -## Demonstrates - - To run the sample, build the client and server projects. Then open two command windows and change the directories to the \\CS\Service\bin\debug and \\CS\Client\bin\debug directories. Then start the service by typing `service.exe` and then invoke the Client.exe with the initial value of ticks passed as an input argument. A sample output for 10 ticks is shown. - -```console -Prompt>Service.exe -ServiceHost Started. Press Enter to terminate service. -Ping: Ticks = 10 -Ping: Ticks = 8 -Ping: Ticks = 6 -Ping: Ticks = 4 -Ping: Ticks = 2 -Ping: Ticks = 0 - -Prompt>Client.exe 10 -Pong: Ticks = 9 -Pong: Ticks = 7 -Pong: Ticks = 5 -Pong: Ticks = 3 -Pong: Ticks = 1 -``` - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Services\Reentrant` diff --git a/docs/framework/wcf/samples/configuration-channel-factory.md b/docs/framework/wcf/samples/configuration-channel-factory.md deleted file mode 100644 index 7c175e95ea2bf..0000000000000 --- a/docs/framework/wcf/samples/configuration-channel-factory.md +++ /dev/null @@ -1,51 +0,0 @@ ---- -description: "Learn more about: Configuration Channel Factory" -title: "Configuration Channel Factory" -ms.date: "03/30/2017" -ms.assetid: 3b749493-bd8a-4ccb-893e-5948901a1486 ---- -# Configuration Channel Factory - -This sample covers the usage of the . The allows central management of WCF client configuration. This can also be useful in scenarios in which configuration is selected or changed after the application domain load time. - -## Demonstrates - - - -## Discussion - - This sample shows how to use to add a particular configuration file to a client application, without having to use the default application configuration file. - - The sample consists of two projects. The first project is a simple service that runs to reply to messages coming from the clients. The second project is a client application that builds two objects using a for the Test.config configuration file and uses them to communicate with the service. Both clients communicate with the service using the configuration specified in Test.config. - - The following code adds a custom configuration file to a client application. - -```csharp -ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(); -fileMap.ExeConfigFilename = "Test.config"; -Configuration newConfiguration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); - -ConfigurationChannelFactory factory1 = new ConfigurationChannelFactory("endpoint1", newConfiguration, new EndpointAddress("http://localhost:8000/servicemodelsamples/service")); -ICalculatorChannel client1 = factory1.CreateChannel(); -``` - -#### To set up, build, and run the sample - -1. Open Visual Studio 2012 with administrator privileges. - -2. Right-click the ConfigurationChannelFactory solution (2 projects) and then select **Properties**. - -3. In **Common Properties**, select **Startup Project**, and then click **Multiple startup projects**. - -4. Move the **Service** project to the beginning of the list, with the **Action ‘Start’**, and then move the **Client** project after the **Service** project, also with the **Action ‘Start’**, so the **Client** project is executed after the **Service** project. - -5. Click **OK**, and then press F5 (or CTRL+F5) to run the sample. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Services\ConfigurationChannelFactory` diff --git a/docs/framework/wcf/samples/configuration-sample.md b/docs/framework/wcf/samples/configuration-sample.md deleted file mode 100644 index 93b2791d759ce..0000000000000 --- a/docs/framework/wcf/samples/configuration-sample.md +++ /dev/null @@ -1,267 +0,0 @@ ---- -description: "Learn more about: Configuration Sample" -title: "Configuration Sample" -ms.date: "03/30/2017" -ms.assetid: 75515b4a-8d70-44c8-99e0-7423df41380e ---- -# Configuration Sample - -This sample demonstrates the use of a configuration file to make a service discoverable. - -> [!NOTE] -> This sample implements discovery in configuration. For a sample that implements discovery in code, see [Basic](basic-sample.md). - -> [!IMPORTANT] -> The samples may already be installed on your computer. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Discovery\Configuration` - -## Service Configuration - - The configuration file in this sample demonstrates two features: - -- Making the service discoverable over a standard . - -- Adjusting discovery-related information for the service’s application endpoint and adjusting some of the discovery-related settings on the standard endpoint. - - To enable discovery, a few changes must be made in the application configuration file for the service: - -- A discovery endpoint must be added to the `` element. This is a standard endpoint. This is a system endpoint that the runtime associates with the discovery service. The discovery service listens for messages on this endpoint. - -- A `` behavior is added to the `` section. This enables the service to be discovered at runtime and uses the discovery endpoint mentioned previously to listen for discovery `Probe` and `Resolve` messages. With these two additions, the service is discoverable at the discovery endpoint specified. - - The following config snippet shows a service with an application endpoint and a discovery endpoint defined: - -```xml - - - - - -``` - - To take advantage of announcements, you will need to add an announcement endpoint. To do this, modify the configuration file as shown in the following code. - -```xml - - - - - -``` - - Adding an announcement endpoint to the discovery service behavior creates a default announcement client for the service. This guarantees that the service will send an online and offline announcement when the service is opened and closed respectively. - - This configuration file goes beyond just those simple steps by modifying additional behaviors. It is possible to control discovery-related information by using specific endpoints. That is, a user can control whether an endpoint can be discovered and the user can also mark that endpoint with and custom XML metadata. To do this, the user must add a `behaviorConfiguration` property to the application endpoint. In this case, the following property is added to the application endpoint. - -`behaviorConfiguration="endpointBehaviorConfiguration"` - - Now, through the behavior configuration element, you can control discovery-related attributes. In this case, two scopes are added to the application endpoint. - -```xml - - - - - - - - - - - -``` - - For more information about scopes, see [Discovery Find and FindCriteria](../feature-details/discovery-find-and-findcriteria.md). - - You can also control specific details of the discovery endpoint. This is done through the . In this sample, the version of the protocol used is modified as well as adding a `maxResponseDelay` attribute as shown in the following code example. - -```xml - - - - - -``` - - The following is the complete configuration file used in this example: - -```xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -``` - -## Client Configuration - - In the application configuration file for the client, a `standardEndpoint` of type `dynamicEndpoint` is used to utilize discovery as shown in the following config snippet. - -```xml - - - - - -``` - - When a client is using a `dynamicEndpoint`, the runtime performs discovery automatically. Various settings are used during discovery, such as those defined in the `discoveryClientSettings` section, which specifies the type of discovery endpoint to use: - -```xml - -``` - - The find criteria used to search for services: - -```xml - - - - - - - - This is custom metadata that is sent to the service along with the client's find request. - - -``` - - This sample extends this feature and modifies the used by the client, as well as some properties of the standard `updDiscoveryEndpoint` used for discovery. The are modified to use a scope and a specific `scopeMatchBy` algorithm, as well as custom termination criteria. Furthermore, the sample also shows how a client can send XML elements using `Probe` messages. Lastly, some changes are made to the , such as the version of the protocol used and UDP-specific settings as shown in the following configuration file. - -```xml - - - - - - -``` - - The following is the complete client configuration used in the sample. - -```xml - - - - - - - - - - - - - - - - - - - - - - - - - This is custom metadata that is sent to the service along with the client's find request. - - - - - - - - - - - - - - - - - -``` - -#### To use this sample - -1. This sample uses HTTP endpoints and to run this sample, proper URL ACLs must be added. For more information, see [Configuring HTTP and HTTPS](../feature-details/configuring-http-and-https.md). Executing the following command at an elevated privilege should add the appropriate ACLs. You may want to substitute your Domain and Username for the following arguments if the command does not work as is. `netsh http add urlacl url=http://+:8000/ user=%DOMAIN%\%UserName%` - -2. Build the solution. - -3. Run the service executable from the build directory. - -4. Run the client executable. Note that the client is able to locate the service. diff --git a/docs/framework/wcf/samples/configurationcodegenerator.md b/docs/framework/wcf/samples/configurationcodegenerator.md deleted file mode 100644 index e76e9e0233217..0000000000000 --- a/docs/framework/wcf/samples/configurationcodegenerator.md +++ /dev/null @@ -1,47 +0,0 @@ ---- -description: "Learn more about: ConfigurationCodeGenerator" -title: "ConfigurationCodeGenerator" -ms.date: "03/30/2017" -ms.assetid: 3913aae8-165f-4014-9262-7fe426f90cb2 ---- -# ConfigurationCodeGenerator - -The ConfigurationCodeGenerator is a tool that you can use to expose your custom channel implementations to the configuration system. This allows users of your custom channel to configure your channel by using a .config file just as they would configure a system-provided binding such as `NetTcpBinding` or a custom binding using the `TcpTransportBindingElement`. - - When you write a custom channel and expose it to the programming model by using a new `BindingElement` or `Binding`, you must create a set of classes to make the `BindingElement` or `Binding` configurable using a .config file. You can use the ConfigurationCodeGenerator tool to generate these classes and enhance your customer's experience. - -### To build the tool - -1. To build the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -2. Building the solution generates one file: ConfigurationCodeGenerator.exe. The file SampleRun.cmd has a sample command line that shows how to use this tool to generate the classes for the [Transport: UDP](transport-udp.md) sample. - -### To run the tool - -1. At the command prompt type the following if you have both a custom `BindingElement` type and a custom `Binding` type: - - ```console - ConfigurationCodeGenerator.exe /be:YourCustomBindingElementTypeName /sb:YourCustomStdBindingTypeName /dll:TheAssemblyWhereTheseTypesAreDefined - ``` - - Or type the following if you have only a custom `BindingElement` type: - - ```console - ConfigurationCodeGenerator.exe /be:YourCustomBindingElementTypeName /dll: TheAssemblyWhereThisTypeIsDefined - ``` - - Or type the following if you have only a custom `Binding` type: - - ```console - ConfigurationCodeGenerator.exe /sb:YourCustomStdBindingTypeName /dll:TheAssemblyWhereThisTypeIsDefined - ``` - - The command generates three .cs files for the `BindingElement` (if you specified the /be: option), five .cs files for the standard `Binding` (if you specified the /sb: option), and a .xml file. - - 1. If you used the /be option, one of the .cs files implements the `BindingElementExtensionSection` for your binding element. This code exposes your `BindingElement` to the configuration system, so that other custom bindings can use your binding element. The other files have classes that represent defaults and constants. The files have `//TODO` comments to remind you to update the default values. - - 2. If you specified the /sb option, two of the .cs files implement a `StandardBindingElement` and a `StandardBindingCollectionElement` respectively, which exposes your standard binding to the configuration system. The other files have classes that represent defaults and constants. The files have `//TODO` comments to remind you to update the default values. - - If you specified the /sb: option the CodeToAddTo\<*YourStdBinding*>.cs has code that you must manually add into the class that implements your standard binding. - - The SampleConfig.xml file contains the configuration code that you must add to the configuration file that registers the handlers defined in the previous step 1 or 2. diff --git a/docs/framework/wcf/samples/contract.md b/docs/framework/wcf/samples/contract.md deleted file mode 100644 index 0d27b51d4d94c..0000000000000 --- a/docs/framework/wcf/samples/contract.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -description: "Learn more about: Contract" -title: "WCF contract samples" -ms.date: "03/30/2017" -ms.assetid: 305eeb65-a52f-459e-9aa8-0ef071eade16 ---- -# Contract - -This section contains samples that demonstrate contracts in Windows Communication Foundation (WCF). - -## In This Section - - [Data Contracts](data-contracts.md) - Demonstrates data contracts in WCF. - - [Message Contracts](message-contracts.md) - Demonstrates message contracts in WCF. - - [Service Contracts](service-contracts.md) - Demonstrates service contracts in WCF. - - [DataContractResolver](datacontractresolver.md) - Demonstrates how the serialization and deserialization processes can be customized by using the class. - - [KnownAssemblyAttribute](knownassemblyattribute.md) - Demonstrates how to dynamically add known types during serialization and deserialization. - - [Using DataContractSerializer and DataContractResolver to Provide the Functionality of NetDataContractSerializer](datacontractserializer-datacontractresolver-netdatacontractserializer.md) - Demonstrates how to use with an appropriate provides the same functionality as . diff --git a/docs/framework/wcf/samples/cryptographic-agility-in-wcf-security.md b/docs/framework/wcf/samples/cryptographic-agility-in-wcf-security.md deleted file mode 100644 index b9c48f9813b9a..0000000000000 --- a/docs/framework/wcf/samples/cryptographic-agility-in-wcf-security.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -description: "Learn more about: Cryptographic agility in WCF security" -title: "Cryptographic agility in WCF security" -ms.date: "03/30/2017" -ms.assetid: c2c549e5-ac19-40c5-b686-8f67f52b6dbf ---- -# Cryptographic agility in WCF security - -This sample shows how to specify in a standard/custom algorithm to provide a cryptographic agile implementation in a Windows Communication Foundation (WCF) client and service. The sample is composed of the following projects: - -**Service** - -This is a self-hosted WCF service that implements the `ICalculator` interface and secures the endpoint using the with secure session and reliable session disabled. The service defines a custom `SecurityAlgorithmSuite` class to specify the cryptographic algorithms to be used for message security. - -**Client** - -This is a WCF client that accesses the service after successful authentication. It invokes the operations exposed by the `ICalculator` interface and implemented by the service. The client also defines the same custom `SecurityAlgorithmSuite` class to specify the cryptographic algorithms to be used for message security. - -## To use this sample - -1. Open the CryptoAgility.sln solution in Visual Studio 2012. - -2. Press CTRL+SHIFT+B to build the solution. - -3. Open File Explorer and navigate to the \WCF\Basic\Security\CryptoAgility\Service\bin directory and run the service.exe file with administrator privileges by right-clicking service.exe and selecting **Run as administrator**. - -4. Navigate to \WCF\Basic\Security\CryptoAgility\Client\bin directory and run the client.exe file normally. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Security\CryptoAgility` - -## See also - -- [Windows Communication Foundation Security](../feature-details/security.md) diff --git a/docs/framework/wcf/samples/custom-binding-imperative.md b/docs/framework/wcf/samples/custom-binding-imperative.md deleted file mode 100644 index 57a122804f5d8..0000000000000 --- a/docs/framework/wcf/samples/custom-binding-imperative.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -description: "Learn more about: Custom Binding Imperative" -title: "Custom Binding Imperative" -ms.date: "03/30/2017" -ms.assetid: 6e13bf96-5de0-4476-b646-5f150774418d ---- -# Custom Binding Imperative - -The sample demonstrates how to write imperative code to define and use custom bindings without using a configuration file or a Windows Communication Foundation (WCF) generated client. This sample combines the features provided by the HTTP transport and the reliable session channel to create a reliable HTTP-based binding. This sample is based on the [Getting Started](getting-started-sample.md) that implements a calculator service. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - - On both the client and the service, a custom binding is created that contains two binding elements (Reliable Session and HTTP): - -```csharp -ReliableSessionBindingElement reliableSession = new ReliableSessionBindingElement(); -reliableSession.Ordered = true; - -HttpTransportBindingElement httpTransport = new HttpTransportBindingElement(); -httpTransport.AuthenticationScheme = System.Net.AuthenticationSchemes.Anonymous; -httpTransport.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard; - -CustomBinding binding = new CustomBinding(reliableSession, httpTransport); -``` - - On the service, the binding is used by adding an endpoint to the ServiceHost: - -```csharp -serviceHost.AddServiceEndpoint(typeof(ICalculator), binding, ""); -``` - - On the client, the binding is used by a to create a channel to the service: - -```csharp -EndpointAddress address = new EndpointAddress("http://localhost:8000/servicemodelsamples/service"); -ChannelFactory channelFactory = new ChannelFactory(binding, address); -ICalculator channel = channelFactory.CreateChannel(); -``` - - This channel is then used to interact with the service: - -```csharp -// Call the Add service operation. -double value1 = 100.00D; -double value2 = 15.99D; -double result = channel.Add(value1, value2); -Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result); -``` - - When you run the sample, the operation requests and responses are displayed in the client console window. Press ENTER in the client window to shut down the client. - -```console -Add(100,15.99) = 115.99 -Subtract(145,76.54) = 68.46 -Multiply(9,81.25) = 731.25 -Divide(22,7) = 3.14285714285714 - -Press to terminate client. -``` - -### To set up, build, and run the sample - -1. Be sure you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WF\Basic\Binding\Custom\Imperative` - -## See also - -- [Custom Binding Samples](custom-binding.md) diff --git a/docs/framework/wcf/samples/custom-binding-reliable-session-over-https.md b/docs/framework/wcf/samples/custom-binding-reliable-session-over-https.md deleted file mode 100644 index 63ca736632b0a..0000000000000 --- a/docs/framework/wcf/samples/custom-binding-reliable-session-over-https.md +++ /dev/null @@ -1,134 +0,0 @@ ---- -description: "Learn more about: Custom Binding Reliable Session over HTTPS" -title: "Custom Binding Reliable Session over HTTPS" -ms.date: "03/30/2017" -ms.assetid: 16aaa80d-3ffe-47c4-8b16-ec65c4d25f8d ---- -# Custom Binding Reliable Session over HTTPS - -This sample demonstrates the use of SSL transport security with Reliable Sessions. Reliable Sessions implements the WS-Reliable Messaging protocol. You can have a secure reliable session by composing WS-Security over Reliable Sessions. But sometimes, you may choose to instead use HTTP transport security with SSL. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Binding\Custom\ReliableSessionOverHttps` - -## Sample Details - - SSL ensures that the packets themselves are secured. It is important to note that this is different from securing the reliable session using WS-Secure Conversation. - - To use reliable session over HTTPS, you must create a custom binding. This sample is based on the [Getting Started](getting-started-sample.md) that implements a calculator service. A custom binding is created using the reliable session binding element and the [\](../../configure-apps/file-schema/wcf/httpstransport.md). The following configuration is of the custom binding. - -```xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -``` - - The program code in the sample is identical to that of the [Getting Started](getting-started-sample.md) service. You must create a certificate and assign it by using the Web Server Certificate Wizard before building and running the sample. The endpoint definition and binding definition in the configuration file settings enable the use of custom binding as shown in the following sample configuration for the client. - -```xml - - - - - - - - - - - - - - - - - - - - - -``` - - The address specified uses the `https://` scheme. - - Because the certificate used in this sample is a test certificate created with Makecert.exe, a security alert appears when you try to access an https: address, such as `https://localhost/servicemodelsamples/service.svc`, from your browser. To allow the Windows Communication Foundation (WCF) client to work with a test certificate in place, some additional code has been added to the client to suppress the security alert. This code, and the accompanying class, is not required when using production certificates. - -```csharp -// This code is required only for test certificates like those created by Makecert.exe. -PermissiveCertificatePolicy.Enact("CN=ServiceModelSamples-HTTPS-Server"); -``` - - When you run the sample, the operation requests and responses are displayed in the client console window. Press ENTER in the client window to shut down the client. - -```console -Add(100,15.99) = 115.99 -Subtract(145,76.54) = 68.46 -Multiply(9,81.25) = 731.25 -Divide(22,7) = 3.14285714285714 - -Press to terminate client. -``` - -#### To set up, build, and run the sample - -1. Install ASP.NET 4.0 using the following command. - - ```console - %windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable - ``` - -2. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -3. Ensure that you have performed the [Internet Information Services (IIS) Server Certificate Installation Instructions](iis-server-certificate-installation-instructions.md). - -4. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -5. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). diff --git a/docs/framework/wcf/samples/custom-binding-reliable-session.md b/docs/framework/wcf/samples/custom-binding-reliable-session.md deleted file mode 100644 index c133fc918c534..0000000000000 --- a/docs/framework/wcf/samples/custom-binding-reliable-session.md +++ /dev/null @@ -1,120 +0,0 @@ ---- -description: "Learn more about: Custom Binding Reliable Session" -title: "Custom Binding Reliable Session" -ms.date: "03/30/2017" -ms.assetid: c5fcd409-246f-4f3e-b3f1-629506ca4c04 ---- -# Custom Binding Reliable Session - -A custom binding is defined by an ordered list of discrete binding elements. This sample demonstrates how to configure a custom binding with various transport and message encoding elements, especially enabling reliable sessions. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Binding\Custom\ReliableSession` - -## Sample Details - -Reliable sessions provide features for reliable messaging and sessions. Reliable messaging retries communication on failure and allows delivery assurances such as in-order arrival of messages to be specified. Sessions maintain state for clients between calls. The sample implements sessions for maintaining client state and specifies in-order delivery assurances. The sample is based on the [Getting Started](getting-started-sample.md) that implements a calculator service. The reliable session features are enabled and configured in the application configuration files for the client and service. - -> [!NOTE] -> The set-up procedure and build instructions for this sample are located at the end of this topic. - -The ordering of binding elements is important in defining a custom binding, because each represents a layer in the channel stack (see [Custom Bindings](../extending/custom-bindings.md)). - -The service configuration for the sample is defined as shown in the following code example. - -```xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -``` - -When running in a cross-machine scenario, you must change client's endpoint address to reflect the host name of the service. - -When you run the sample, the operation requests and responses are displayed in the client console window. Press ENTER in the client window to shut down the client. - -```console -Add(100,15.99) = 115.99 -Subtract(145,76.54) = 68.46 -Multiply(9,81.25) = 731.25 -Divide(22,7) = 3.14285714285714 - -Press to terminate client. -``` - -#### To set up, build, and run the sample - -1. Install ASP.NET 4.0 using the following command: - - ```console - %windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable - ``` - -2. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -3. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -4. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - - > [!IMPORTANT] - > When running the client in a cross-machine configuration, be sure to replace "localhost" in both the `address` attribute of the [\](../../configure-apps/file-schema/wcf/endpoint-element.md) element and the `clientBaseAddress` attribute of the [\](../../configure-apps/file-schema/wcf/compositeduplex.md) with the name of the appropriate machine, as shown in the following example. - - ```xml - - - ``` diff --git a/docs/framework/wcf/samples/custom-binding-security.md b/docs/framework/wcf/samples/custom-binding-security.md deleted file mode 100644 index fa7f6fa722fbd..0000000000000 --- a/docs/framework/wcf/samples/custom-binding-security.md +++ /dev/null @@ -1,183 +0,0 @@ ---- -description: "Learn more about: Custom Binding Security" -title: "Custom Binding Security" -ms.date: "03/30/2017" -ms.assetid: a6383dff-4308-46d2-bc6d-acd4e18b4b8d ---- -# Custom Binding Security - -This sample demonstrates how to configure security by using a custom binding. It shows how to use a custom binding to enable message-level security together with a secure transport. This is useful when a secure transport is required to transmit the messages between client and service and simultaneously the messages must be secure on the message level. This configuration is not supported by system-provided bindings. - -This sample consists of a client console program (EXE) and a service console program (EXE). The service implements a duplex contract. The contract is defined by the `ICalculatorDuplex` interface, which exposes math operations (Add, Subtract, Multiply, and Divide). The `ICalculatorDuplex` interface allows the client to perform math operations, calculating a running result over a session. Independently, the service may return results on the `ICalculatorDuplexCallback` interface. A duplex contract requires a session, because a context must be established to correlate the set of messages being sent between the client and the service. A custom binding is defined that supports duplex communication and is secure. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - -The service configuration defines a custom binding that supports the following: - -- TCP communication protected by using the TLS/SSL protocol. - -- Windows message security. - -The custom binding configuration enables secure transport by simultaneously enabling the message-level security. The ordering of binding elements is important in defining a custom binding, because each represents a layer in the channel stack (see [Custom Bindings](../extending/custom-bindings.md)). The custom binding is defined in the service and client configuration files, as shown in the following sample configuration. - -```xml - - - - - - - - - - - - -``` - -The custom binding uses a service certificate to authenticate the service on the transport level and to protect the messages during the transmission between client and service. This is accomplished by the `sslStreamSecurity` binding element. The service's certificate is configured using a service behavior as shown in the following sample configuration. - -```xml - - - - - - - - - - - -``` - -Additionally, the custom binding uses message security with Windows credential type - this is the default credential type. This is accomplished by the `security` binding element. Both client and service are authenticated using message-level security if the Kerberos authentication mechanism is available. This happens if the sample is run in the Active Directory environment. If the Kerberos authentication mechanism is not available, NTLM authentication is used. NTLM authenticates the client to the service but does not authenticate the service to the client. The `security` binding element is configured to use `SecureConversation` `authenticationType`, which results in the creation of a security session on both the client and the service. This is required to enable the service's duplex contract to work. - -When you run the sample, the operation requests and responses are displayed in the client's console window. Press ENTER in the client window to shut down the client. - -```console -Press to terminate client. -Result(100) -Result(50) -Result(882.5) -Result(441.25) -Equation(0 + 100 - 50 * 17.65 / 2 = 441.25) -``` - -When you run the sample, you see the messages returned to the client on the callback interface sent from the service. Each intermediate result is displayed, followed by the entire equation upon completion of all operations. Press ENTER to shut down the client. - -The included Setup.bat file enables you to configure the client and server with the relevant service certificate to run a hosted application that requires certificate-based security. This batch file must be modified to work across computers or to work in a non-hosted case. - -The following provides a brief overview of the different sections of the batch files that apply to this sample so that they can be modified to run in the appropriate configuration: - -- Creating the server certificate. - - The following lines from the Setup.bat file create the server certificate to be used. The `%SERVER_NAME%` variable specifies the server name. Change this variable to specify your own server name. This batch file defaults the server name to localhost. - - The certificate is stored in the CurrentUser store for the Web-hosted services. - - ```bat - echo ************ - echo Server cert setup starting - echo %SERVER_NAME% - echo ************ - echo making server cert - echo ************ - makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe - ``` - -- Installing the server certificate into the client's trusted certificate store. - - The following lines in the Setup.bat file copy the server certificate into the client trusted people store. This step is required because certificates generated by Makecert.exe are not implicitly trusted by the client system. If you already have a certificate that is rooted in a client trusted root certificate—for example, a Microsoft-issued certificate—this step of populating the client certificate store with the server certificate is not required. - - ```console - certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople - ``` - - > [!NOTE] - > The Setup.bat batch file is designed to be run from a Visual Studio 2010 Command Prompt. It requires that the MSSDK environment variable point to the directory where the SDK is installed. This environment variable is automatically set within a Visual Studio 2010 Command Prompt. - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-computer configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -### To run the sample on the same computer - -1. Open a Developer Command Prompt for Visual Studio window with administrator privileges and run Setup.bat from the sample install folder. This installs all the certificates required for running the sample. - - > [!NOTE] - > The Setup.bat batch file is designed to be run from a Visual Studio 2012 Command Prompt. The PATH environment variable set within the Visual Studio 2012 Command Prompt points to the directory that contains executables required by the Setup.bat script. - -2. Launch Service.exe from \service\bin. - -3. Launch Client.exe from \client\bin. Client activity is displayed on the client console application. - -4. If the client and service are not able to communicate, see [Troubleshooting Tips for WCF Samples](/previous-versions/dotnet/netframework-3.5/ms751511(v=vs.90)). - -### To run the sample across computers - -1. On the service computer: - - 1. Create a virtual directory named servicemodelsamples on the service computer. - - 2. Copy the service program files from \inetpub\wwwroot\servicemodelsamples to the virtual directory on the service computer. Ensure that you copy the files in the \bin subdirectory. - - 3. Copy the Setup.bat and Cleanup.bat files to the service computer. - - 4. Run the following command in a Developer Command Prompt for Visual Studio opened with administrator privileges: `Setup.bat service`. This creates the service certificate with the subject name matching the name of the computer the batch file was run on. - - > [!NOTE] - > The Setup.bat batch file is designed to be run from a Visual Studio 2010 Command Prompt. It requires that the path environment variable point to the directory where the SDK is installed. This environment variable is automatically set within a Visual Studio 2010 Command Prompt. - - 5. Change the [\](../../configure-apps/file-schema/wcf/servicecertificate-of-servicecredentials.md) inside the Service.exe.config file to reflect the subject name of the certificate generated in the previous step. - - 6. Run Service.exe from a command prompt. - -2. On the client computer: - - 1. Copy the client program files from the \client\bin\ folder to the client computer. Also copy the Cleanup.bat file. - - 2. Run Cleanup.bat to remove any old certificates from previous samples. - - 3. Export the service's certificate by opening a Developer Command Prompt for Visual Studio with administrative privileges, and running the following command on the service computer (substitute `%SERVER_NAME%` with the fully-qualified name of the computer where the service is running): - - ```console - certmgr -put -r LocalMachine -s My -c -n %SERVER_NAME% %SERVER_NAME%.cer - ``` - - 4. Copy %SERVER_NAME%.cer to the client computer (substitute %SERVER_NAME% with the fully-qualified name of the computer where the service is running). - - 5. Import the service's certificate by opening a Developer Command Prompt for Visual Studio with administrative privileges, and running the following command on the client computer (substitute %SERVER_NAME% with the fully-qualified name of the computer where the service is running): - - ```console - certmgr.exe -add -c %SERVER_NAME%.cer -s -r CurrentUser TrustedPeople - ``` - - Steps c, d, and e are not necessary if the certificate is issued by a Trusted Issuer. - - 6. Modify the client’s App.config file as follows: - - ```xml - - - - ``` - - 7. If the service is running under an account other than the NetworkService or LocalSystem account in a domain environment, you might need to modify the endpoint identity for the service endpoint inside the client's App.config file to set the appropriate UPN or SPN based on the account that is used to run the service. For more information about endpoint identity, see the [Service Identity and Authentication](../feature-details/service-identity-and-authentication.md) topic. - - 8. Run Client.exe from a command prompt. - -### To clean up after the sample - -- Run Cleanup.bat in the samples folder after you have finished running the sample. diff --git a/docs/framework/wcf/samples/custom-binding-transport-and-encoding.md b/docs/framework/wcf/samples/custom-binding-transport-and-encoding.md deleted file mode 100644 index 2c54349043c89..0000000000000 --- a/docs/framework/wcf/samples/custom-binding-transport-and-encoding.md +++ /dev/null @@ -1,83 +0,0 @@ ---- -description: "Learn more about: Custom Binding Transport and Encoding" -title: "Custom Binding Transport and Encoding" -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -ms.assetid: 6c0b353d-79ee-4e61-b348-be49ad0e9a16 ---- -# Custom Binding Transport and Encoding - -A custom binding is defined by an ordered list of discrete binding elements. This sample demonstrates how to configure a custom binding with various transport and message encoding elements. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - - This sample is based on the [Self-Host](self-host.md), and has been modified to configure three endpoints to support HTTP, TCP, and NamedPipe transports with custom bindings. The client configuration was similarly modified, and the client code changed to communicate with each of the three endpoints. - - The sample demonstrates a how to configure a custom binding that supports a particular transport and message encoding. This is accomplished by configuring a transport and a message encoding for the `binding` element. The ordering of binding elements is important in defining a custom binding, because each represents a layer in the channel stack (see [Custom Bindings](../extending/custom-bindings.md)). This sample configures three custom bindings: an HTTP transport with text encoding, a TCP transport with text encoding, and a NamedPipe transport with a binary encoding. - - The service configuration defines the custom bindings as follows: - -```xml - - - - - - - - - - - - - - - - -``` - - When you run the sample, the operation requests and responses are displayed in both the service and client console window. The client communicates with each of the three endpoints, accessing first HTTP, then TCP, and finally NamedPipe. Press ENTER in each console window to shut down the service and client. - - The `namedPipeTransport` binding does not support machine-to-machine operations. It is used only for communication on the same machine. Therefore, when running the sample in a cross-machine scenario, comment out the following lines in the client code file: - -```csharp -CalculatorClient client = new CalculatorClient("default"); -Console.WriteLine("Communicate with named pipe endpoint."); -// Call operations. -DoCalculations(client); -//Closing the client gracefully closes the connection and cleans up resources -client.Close(); -``` - -```vb -Dim client As New CalculatorClient("default") -Console.WriteLine("Communicate with named pipe endpoint.") -' call operations -DoCalculations(client) -'Closing the client gracefully closes the connection and cleans up resources -client.Close() -``` - -> [!NOTE] -> If you use Svcutil.exe to regenerate the configuration for this sample, be sure to modify the endpoint name in the client configuration to match the client code. - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C#, C++, or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Binding\Custom\Transport` diff --git a/docs/framework/wcf/samples/custom-binding.md b/docs/framework/wcf/samples/custom-binding.md deleted file mode 100644 index 3288078344f36..0000000000000 --- a/docs/framework/wcf/samples/custom-binding.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -description: "Learn more about: Custom Binding" -title: "Custom Binding" -ms.date: "03/30/2017" -ms.assetid: 3c9537ea-9708-4ebc-b861-219f2e2db53d ---- -# Custom Binding - -This section contains samples that demonstrate using a custom binding attribute of an endpoint element. - -## In This Section - - [Custom Binding Imperative](custom-binding-imperative.md) - Demonstrates how to write imperative code to define and use custom bindings without using a configuration file or a WCF generated client. - - [Custom Binding Transport and Encoding](custom-binding-transport-and-encoding.md) - Demonstrates how to configure a custom binding with various transport and message encoding elements. - - [Custom Binding Reliable Session](custom-binding-reliable-session.md) - Demonstrates how to configure a custom binding with various transport and message encoding elements, especially enabling reliable sessions. - - [Custom Binding Reliable Session over HTTPS](custom-binding-reliable-session-over-https.md) - Demonstrates the use of SSL transport security with Reliable Sessions. diff --git a/docs/framework/wcf/samples/custom-channel-dispatcher.md b/docs/framework/wcf/samples/custom-channel-dispatcher.md deleted file mode 100644 index 2547e9d1181c9..0000000000000 --- a/docs/framework/wcf/samples/custom-channel-dispatcher.md +++ /dev/null @@ -1,56 +0,0 @@ ---- -description: "Learn more about: Custom Channel Dispatcher" -title: "Custom Channel Dispatcher" -ms.date: "03/30/2017" -ms.assetid: 813acf03-9661-4d57-a3c7-eeab497321c6 ---- -# Custom Channel Dispatcher - -This sample demonstrates how to build the channel stack in a custom way by implementing directly and how to create a custom channel dispatcher in Web host environment. The channel dispatcher interacts with to accept channels and retrieves messages from the channel stack. This sample also provides a basic sample to show how to build a channel stack in a Web host environment by using . - -## Custom ServiceHostBase - - This sample implements the base type instead of to demonstrate how to replace the Windows Communication Foundation (WCF) stack implementation with a custom message handling layer on top of the channel stack. You override the virtual method to build channel listeners and the channel dispatcher. - - To implement a Web-hosted service, get the service extension from the collection and add it to the so that the transport layer knows how to configure the channel listener based on the hosting environment settings, that is, the Internet Information Services (IIS)/Windows Process Activation Service (WAS) settings. - -## Custom Channel Dispatcher - - The custom channel dispatcher extends the type . This type implements the channel-layer programming logic. In this sample, only is supported for request-reply message exchange pattern, but the custom channel dispatcher can be easily extended to other channel types. - - The dispatcher first opens the channel listener and then accepts the singleton reply channel. With the channel, it starts to send messages (requests) in an infinite loop. For each request, it creates a reply message and sends it back to the client. - -## Creating a Response Message - - The message processing is implemented in the type `MyServiceManager`. In the `HandleRequest` method, the `Action` header of the message is first checked to see whether the request is supported. A predefined SOAP action "http://tempuri.org/HelloWorld/Hello" is defined to provide message filtering. This is similar to the service contract concept in the WCF implementation of . - - For the correct SOAP action case, the sample retrieves the requested message data and generates a corresponding response to the request similar to what is seen in the case. - - You specially handled the HTTP-GET verb by returning a custom HTML message, in this, case so that you can browse the service from a browser to see that it is compiled correctly. If the SOAP action does not match, send a fault message back to indicate that the request is not supported. - - The client of this sample is a normal WCF client that does not assume anything from the service. So, the service is specially designed to match what you get from a normal WCF implementation. As a result, only a service contract is required on the client. - -## Using the sample - - Running the client application directly produces the following output. - -```output -Client is talking to a request/reply WCF service. -Type what you want to say to the server: Howdy -Server replied: You said: Howdy. Message id: 1 -Server replied: You said: Howdy. Message id: 2 -Server replied: You said: Howdy. Message id: 3 -Server replied: You said: Howdy. Message id: 4 -Server replied: You said: Howdy. Message id: 5 -``` - - You can also browse the service from a browser so that an HTTP-GET message gets processed on the server. This gets you well-formatted HTML text back. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Extensibility\Channels\CustomChannelDispatcher` diff --git a/docs/framework/wcf/samples/custom-find-criteria.md b/docs/framework/wcf/samples/custom-find-criteria.md deleted file mode 100644 index f9ffea99f1bd5..0000000000000 --- a/docs/framework/wcf/samples/custom-find-criteria.md +++ /dev/null @@ -1,68 +0,0 @@ ---- -description: "Learn more about: Custom Find Criteria" -title: "Custom Find Criteria" -ms.date: "03/30/2017" -ms.assetid: b2723929-8829-424d-8015-a37ba2ab4f68 ---- -# Custom Find Criteria - -This sample demonstrates how to create a custom scope match using logic and how to implement a custom discovery service. Clients use custom scope matching functionality to refine and further build on top of the system-provided find functionality of WCF Discovery. The scenario this sample covers is as follows: - -1. A client is looking for a calculator service. - -2. To refine its search, the client must use a custom scope matching rule. - -3. According to this rule, a service responds back to the client if its endpoint matches any of the scopes specified by the client. - -## Demonstrates - -- Creating a custom discovery service. - -- Implementing a custom scope match by algorithm. - -## Discussion - - The client is looking for "OR" type matching criteria. A service responds back if the scopes on its endpoints match any of the scopes provided by the client. In this case, the client is looking for a calculator service that has any of the scopes in the following list: - -1. `net.tcp://Microsoft.Samples.Discovery/RedmondLocation` - -2. `net.tcp://Microsoft.Samples.Discovery/SeattleLocation` - -3. `net.tcp://Microsoft.Samples.Discovery/PortlandLocation` - - To accomplish this, the client directs services to use a custom scope matching rule by passing in a custom scope match by URI. To facilitate the custom scope matching, the service must use a custom discovery service that understands the custom scope match rule and implements the associated matching logic. - - In the client project, open the Program.cs file. Note that the `ScopeMatchBy` field of the `FindCriteria` object is set to a specific URI. This identifier is sent to the service. If the service does not understand this rule, it ignores the client’s find request. - - Open the service project. Three files are used to implement the Custom Discovery Service: - -1. **AsyncResult.cs**: This is the implementation of the `AsyncResult` that is required by Discovery methods. - -2. **CustomDiscoveryService.cs**: This file implements the custom discovery service. The implementation extends the class and overrides the necessary methods. Note the implementation of the method. The method checks to see whether the custom scope match by rule was specified by the client. This is the same custom URI that the client specified previously. If the custom rule is specified, the code path that implements the "OR" match logic is followed. - - This custom logic goes through all of the scopes on each of the endpoints that the service has. If any of the endpoint's scopes match any of the scopes provided by the client, the discovery service adds that endpoint to the response that is sent back to the client. - -3. **CustomDiscoveryExtension.cs**: The last step in implementing the discovery service is to connect this implementation of the custom discover service to the service host. The helper class used here is the `CustomDiscoveryExtension` class. This class extends the class. The user must override the method. In this case, the method returns an instance of the custom discovery service that was created before. `PublishedEndpoints` is a that contains all of the application endpoints that are added to the . The custom discovery service uses this to populate its internal list. A user can to add other endpoint metadata as well. - - Lastly, open Program.cs. Note that both the and `CustomDiscoveryExtension` are added to the host. Once this is done and the host has an endpoint over which to receive discovery messages, the application can use the custom discovery service. - - Observe that the client is able to find the service without knowing its address. - -#### To set up, build, and run the sample - -1. Open the solution that contains the project. - -2. Build the project. - -3. Run the service application. - -4. Run the client application. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Discovery\CustomFindCriteria` diff --git a/docs/framework/wcf/samples/custom-lifetime.md b/docs/framework/wcf/samples/custom-lifetime.md deleted file mode 100644 index 925764065ed0d..0000000000000 --- a/docs/framework/wcf/samples/custom-lifetime.md +++ /dev/null @@ -1,249 +0,0 @@ ---- -description: "Learn more about: Custom lifetime" -title: "Custom lifetime" -ms.date: "08/20/2018" -ms.assetid: 52806c07-b91c-48fe-b992-88a41924f51f ---- -# Custom lifetime - -This sample demonstrates how to write a Windows Communication Foundation (WCF) extension to provide custom lifetime services for shared WCF service instances. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this article. - -## Shared instancing - -WCF offers several instancing modes for your service instances. The shared instancing mode covered in this article provides a way to share a service instance between multiple channels. Clients can contact a factory method in the service and create a new channel to start communication. The following code snippet shows how a client application creates a new channel to an existing service instance: - -```csharp -// Create a header for the shared instance id -MessageHeader shareableInstanceContextHeader = MessageHeader.CreateHeader( - CustomHeader.HeaderName, - CustomHeader.HeaderNamespace, - Guid.NewGuid().ToString()); - -// Create the channel factory -ChannelFactory channelFactory = - new ChannelFactory("echoservice"); - -// Create the first channel -IEchoService proxy = channelFactory.CreateChannel(); - -// Call an operation to create shared service instance -using (new OperationContextScope((IClientChannel)proxy)) -{ - OperationContext.Current.OutgoingMessageHeaders.Add(shareableInstanceContextHeader); - Console.WriteLine("Service returned: " + proxy.Echo("Apple")); -} - -((IChannel)proxy).Close(); - -// Create the second channel -IEchoService proxy2 = channelFactory.CreateChannel(); - -// Call an operation using the same header that will reuse the shared service instance -using (new OperationContextScope((IClientChannel)proxy2)) -{ - OperationContext.Current.OutgoingMessageHeaders.Add(shareableInstanceContextHeader); - Console.WriteLine("Service returned: " + proxy2.Echo("Apple")); -} -``` - -Unlike other instancing modes, the shared instancing mode has a unique way of releasing the service instances. By default, when all the channels are closed for an , the WCF service runtime checks to see if the service is configured to or , and if so releases the instance and claims the resources. If a custom is being used, WCF invokes the method of the provider implementation before releasing the instance. If returns `true` the instance is released, otherwise the implementation is responsible for notifying the `Dispatcher` of the idle state by using a callback method. This is done by calling the method of the provider. - -This sample demonstrates how you can delay releasing the with an idle timeout of 20 seconds. - -## Extending the InstanceContext - -In WCF, is the link between the service instance and the `Dispatcher`. WCF allows you to extend this runtime component by adding new state or behavior by using its extensible object pattern. The extensible object pattern is used in WCF to either extend existing runtime classes with new functionality or to add new state features to an object. There are three interfaces in the extensible object pattern: , , and . - -The interface is implemented by objects to allow extensions that customize their functionality. - -The interface is implemented by objects that can be extensions of classes of type `T`. - -And finally, the interface is a collection of implementations that allows for retrieving an implementation of by their type. - -Therefore, in order to extend the , you must implement the interface. In this sample project, the `CustomLeaseExtension` class contains this implementation. - -```csharp -class CustomLeaseExtension : IExtension -{ -} -``` - -The interface has two methods and . As their names imply, these two methods are called when the runtime attaches and detaches the extension to an instance of the class. In this sample, the `Attach` method is used to keep track of the object that belongs to the current instance of the extension. - -```csharp -InstanceContext owner; - -public void Attach(InstanceContext owner) -{ - this.owner = owner; -} -``` - -In addition, you must add the necessary implementation to the extension to provide the extended lifetime support. Therefore, the `ICustomLease` interface is declared with the desired methods and is implemented in the `CustomLeaseExtension` class. - -```csharp -interface ICustomLease -{ - bool IsIdle { get; } - InstanceContextIdleCallback Callback { get; set; } -} - -class CustomLeaseExtension : IExtension, ICustomLease -{ -} -``` - -When WCF invokes the method in the implementation, this call is routed to the method of the `CustomLeaseExtension`. Then, the `CustomLeaseExtension` checks its private state to see whether the is idle. If it is idle, it returns `true`. Otherwise, it starts a timer for a specified amount of extended lifetime. - -```csharp -public bool IsIdle -{ - get - { - lock (thisLock) - { - if (isIdle) - { - return true; - } - else - { - StartTimer(); - return false; - } - } - } -} -``` - -In the timer’s `Elapsed` event, the callback function in the Dispatcher is called in order to start another clean-up cycle. - -```csharp -void idleTimer_Elapsed(object sender, ElapsedEventArgs args) -{ - lock (thisLock) - { - StopTimer(); - isIdle = true; - Utility.WriteMessageToConsole( - ResourceHelper.GetString("MsgLeaseExpired")); - callback(owner); - } -} -``` - -There's no way to renew the running timer when a new message arrives for the instance being moved to the idle state. - -The sample implements to intercept the calls to the method and route them to the `CustomLeaseExtension`. The implementation is contained in `CustomLifetimeLease` class. The method is invoked when WCF is about to release the service instance. However, there is only one instance of a particular `ISharedSessionInstance` implementation in the ServiceBehavior’s collection. This means there's no way of knowing if the is closed at the time WCF checks the method. Therefore, this sample uses thread locking to serialize requests to the method. - -> [!IMPORTANT] -> Using thread locking is not a recommended approach because serialization can severely affect the performance of your application. - -A private member field is used in the `CustomLifetimeLease` class to track the idle state and is returned by the method. Each time the method is called, the `isIdle` field is returned and reset to `false`. It is essential to set this value to `false` in order to make sure the Dispatcher calls the method. - -```csharp -public bool IsIdle(InstanceContext instanceContext) -{ - get - { - lock (thisLock) - { - //... - bool idleCopy = isIdle; - isIdle = false; - return idleCopy; - } - } -} -``` - -If the method returns `false`, the Dispatcher registers a callback function by using the method. This method receives a reference to the being released. Therefore, the sample code can query the `ICustomLease` type extension and check the `ICustomLease.IsIdle` property in the extended state. - -```csharp -public void NotifyIdle(InstanceContextIdleCallback callback, - InstanceContext instanceContext) -{ - lock (thisLock) - { - ICustomLease customLease = - instanceContext.Extensions.Find(); - customLease.Callback = callback; - isIdle = customLease.IsIdle; - if (isIdle) - { - callback(instanceContext); - } - } -} -``` - -Before the `ICustomLease.IsIdle` property is checked, the Callback property needs to be set as this is essential for `CustomLeaseExtension` to notify the Dispatcher when it becomes idle. If `ICustomLease.IsIdle` returns `true`, the `isIdle` private member is simply set in `CustomLifetimeLease` to `true` and calls the callback method. Because the code holds a lock, other threads can't change the value of this private member. And the next time Dispatcher calls the , it returns `true` and lets Dispatcher release the instance. - -Now that the groundwork for the custom extension is completed, it has to be hooked up to the service model. To hook up the `CustomLeaseExtension` implementation to the , WCF provides the interface to perform the bootstrapping of . In the sample, the `CustomLeaseInitializer` class implements this interface and adds an instance of `CustomLeaseExtension` to the collection from the only method initialization. This method is called by Dispatcher while initializing the . - -```csharp -public void InitializeInstanceContext(InstanceContext instanceContext, - System.ServiceModel.Channels.Message message, IContextChannel channel) - - //... - - IExtension customLeaseExtension = - new CustomLeaseExtension(timeout, headerId); - instanceContext.Extensions.Add(customLeaseExtension); -} -``` - - Finally the implementation is hooked up to the service model by using the implementation. This implementation is placed in the `CustomLeaseTimeAttribute` class and it also derives from the base class to expose this behavior as an attribute. - -```csharp -public void ApplyDispatchBehavior(ServiceDescription description, - ServiceHostBase serviceHostBase) -{ - CustomLifetimeLease customLease = new CustomLifetimeLease(timeout); - - foreach (ChannelDispatcherBase cdb in serviceHostBase.ChannelDispatchers) - { - ChannelDispatcher cd = cdb as ChannelDispatcher; - - if (cd != null) - { - foreach (EndpointDispatcher ed in cd.Endpoints) - { - ed.DispatchRuntime.InstanceContextProvider = customLease; - } - } - } -} -``` - -This behavior can be added to a sample service class by annotating it with the `CustomLeaseTime` attribute. - -```csharp -[CustomLeaseTime(Timeout = 20000)] -public class EchoService : IEchoService -{ - //… -} -``` - -When you run the sample, the operation requests and responses are displayed in both the service and client console windows. Press ENTER in each console window to shut down the service and client. - -### To set up, build, and run the sample - -1. Ensure that you've performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Extensibility\Instancing\Lifetime` diff --git a/docs/framework/wcf/samples/custom-message-encoder-compression-encoder.md b/docs/framework/wcf/samples/custom-message-encoder-compression-encoder.md deleted file mode 100644 index d071d08f0edfe..0000000000000 --- a/docs/framework/wcf/samples/custom-message-encoder-compression-encoder.md +++ /dev/null @@ -1,353 +0,0 @@ ---- -description: "Learn more about: Custom Message Encoder: Compression Encoder" -title: "Custom Message Encoder: Compression Encoder" -ms.date: "03/30/2017" -ms.assetid: 57450b6c-89fe-4b8a-8376-3d794857bfd7 ---- -# Custom Message Encoder: Compression Encoder - -This sample demonstrates how to implement a custom encoder using the Windows Communication Foundation (WCF) platform. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Extensibility\MessageEncoder\Compression` - -## Sample Details - -This sample consists of a client console program (.exe), a self-hosted service console program (.exe) and a compression message encoder library (.dll). The service implements a contract that defines a request-reply communication pattern. The contract is defined by the `ISampleServer` interface, which exposes basic string echoing operations (`Echo` and `BigEcho`). The client makes synchronous requests to a given operation and the service replies by repeating the message back to the client. Client and service activity is visible in the console windows. The intent of this sample is to show how to write a custom encoder and demonstrate the impact of compression of a message on the wire. You can add instrumentation to the compression message encoder to calculate message size, processing time, or both. - -> [!NOTE] -> In the .NET Framework 4, automatic decompression has been enabled on a WCF client if the server is sending a compressed response (created with an algorithm such as GZip or Deflate). If the service is Web-hosted in Internet Information Server (IIS), then IIS can be configured for the service to send a compressed response. This sample can be used if the requirement is to do compression and decompression on both the client and the service or if the service is self-hosted. - -The sample demonstrates how to build and integrate a custom message encoder into a WCF application. The library GZipEncoder.dll is deployed with both the client and the service. This sample also demonstrates the impact of compressing messages. The code in GZipEncoder.dll demonstrates the following: - -- Building a custom encoder and encoder factory. - -- Developing a binding element for a custom encoder. - -- Using the custom binding configuration for integrating custom binding elements. - -- Developing a custom configuration handler to allow file configuration of a custom binding element. - -As indicated previously, there are several layers that are implemented in a custom encoder. To better illustrate the relationship between each of these layers, a simplified order of events for service start-up is in the following list: - -1. The server starts. - -2. The configuration information is read. - - 1. The service configuration registers the custom configuration handler. - - 2. The service host is created and opened. - - 3. The custom configuration element creates and returns the custom binding element. - - 4. The custom binding element creates and returns a message encoder factory. - -3. A message is received. - -4. The message encoder factory returns a message encoder for reading in the message and writing out the response. - -5. The encoder layer is implemented as a class factory. Only the encoder class factory must be publicly exposed for the custom encoder. The factory object is returned by the binding element when the or object is created. Message encoders can operate in a buffered or streaming mode. This sample demonstrates both buffered mode and streaming mode. - -For each mode there is an accompanying `ReadMessage` and `WriteMessage` method on the abstract `MessageEncoder` class. A majority of the encoding work takes place in these methods. The sample wraps the existing text and binary message encoders. This allows the sample to delegate the reading and writing of the wire representation of messages to the inner encoder and allows the compression encoder to compress or decompress the results. Because there is no pipeline for message encoding, this is the only model for using multiple encoders in WCF. Once the message has been decompressed, the resulting message is passed up the stack for the channel stack to handle. During compression, the resulting compressed message is written directly to the stream provided. - -This sample uses helper methods (`CompressBuffer` and `DecompressBuffer`) to perform conversion from buffers to streams to use the `GZipStream` class. - -The buffered `ReadMessage` and `WriteMessage` classes make use of the `BufferManager` class. The encoder is accessible only through the encoder factory. The abstract `MessageEncoderFactory` class provides a property named `Encoder` for accessing the current encoder and a method named `CreateSessionEncoder` for creating an encoder that supports sessions. Such an encoder can be used in the scenario where the channel supports sessions, is ordered and is reliable. This scenario allows for optimization in each session of the data written to the wire. If this is not desired, the base method should not be overloaded. The `Encoder` property provides a mechanism for accessing the session-less encoder and the default implementation of the `CreateSessionEncoder` method returns the value of the property. Because the sample wraps an existing encoder to provide compression, the `MessageEncoderFactory` implementation accepts a `MessageEncoderFactory` that represents the inner encoder factory. - -Now that the encoder and encoder factory are defined, they can be used with a WCF client and service. However, these encoders must be added to the channel stack. You can derive classes from the and classes and override the `OnInitialize` methods to add this encoder factory manually. You can also expose the encoder factory through a custom binding element. - -To create a new custom binding element, derive a class from the class. There are, however, several types of binding elements. To ensure that the custom binding element is recognized as a message encoding binding element, you also must implement the . The exposes a method for creating a new message encoder factory (`CreateMessageEncoderFactory`), which is implemented to return an instance of the matching message encoder factory. Additionally, the has a property to indicate the addressing version. Because this sample wraps the existing encoders, the sample implementation also wraps the existing encoder binding elements and takes an inner encoder binding element as a parameter to the constructor and exposes it through a property. The following sample code shows the implementation of the `GZipMessageEncodingBindingElement` class. - -```csharp -public sealed class GZipMessageEncodingBindingElement - : MessageEncodingBindingElement //BindingElement - , IPolicyExportExtension -{ - - //We use an inner binding element to store information - //required for the inner encoder. - MessageEncodingBindingElement innerBindingElement; - - //By default, use the default text encoder as the inner encoder. - public GZipMessageEncodingBindingElement() - : this(new TextMessageEncodingBindingElement()) { } - - public GZipMessageEncodingBindingElement(MessageEncodingBindingElement messageEncoderBindingElement) - { - this.innerBindingElement = messageEncoderBindingElement; - } - - public MessageEncodingBindingElement InnerMessageEncodingBindingElement - { - get { return innerBindingElement; } - set { innerBindingElement = value; } - } - - //Main entry point into the encoder binding element. - // Called by WCF to get the factory that creates the - //message encoder. - public override MessageEncoderFactory CreateMessageEncoderFactory() - { - return new -GZipMessageEncoderFactory(innerBindingElement.CreateMessageEncoderFactory()); - } - - public override MessageVersion MessageVersion - { - get { return innerBindingElement.MessageVersion; } - set { innerBindingElement.MessageVersion = value; } - } - - public override BindingElement Clone() - { - return new - GZipMessageEncodingBindingElement(this.innerBindingElement); - } - - public override T GetProperty(BindingContext context) - { - if (typeof(T) == typeof(XmlDictionaryReaderQuotas)) - { - return innerBindingElement.GetProperty(context); - } - else - { - return base.GetProperty(context); - } - } - - public override IChannelFactory BuildChannelFactory(BindingContext context) - { - if (context == null) - throw new ArgumentNullException("context"); - - context.BindingParameters.Add(this); - return context.BuildInnerChannelFactory(); - } - - public override IChannelListener BuildChannelListener(BindingContext context) - { - if (context == null) - throw new ArgumentNullException("context"); - - context.BindingParameters.Add(this); - return context.BuildInnerChannelListener(); - } - - public override bool CanBuildChannelListener(BindingContext context) - { - if (context == null) - throw new ArgumentNullException("context"); - - context.BindingParameters.Add(this); - return context.CanBuildInnerChannelListener(); - } - - void IPolicyExportExtension.ExportPolicy(MetadataExporter exporter, PolicyConversionContext policyContext) - { - if (policyContext == null) - { - throw new ArgumentNullException("policyContext"); - } - XmlDocument document = new XmlDocument(); - policyContext.GetBindingAssertions().Add(document.CreateElement( - GZipMessageEncodingPolicyConstants.GZipEncodingPrefix, - GZipMessageEncodingPolicyConstants.GZipEncodingName, - GZipMessageEncodingPolicyConstants.GZipEncodingNamespace)); - } -} -``` - -Note that `GZipMessageEncodingBindingElement` class implements the `IPolicyExportExtension` interface, so that this binding element can be exported as a policy in metadata, as shown in the following example. - -```xml - - - - - - - - -``` - -The `GZipMessageEncodingBindingElementImporter` class implements the `IPolicyImportExtension` interface, this class imports policy for `GZipMessageEncodingBindingElement`. Svcutil.exe tool can be used to import policies to the configuration file, to handle `GZipMessageEncodingBindingElement`, the following should be added to Svcutil.exe.config. - -```xml - - - - - - - - - - - - - - - - - -``` - -Now that there is a matching binding element for the compression encoder, it can be programmatically hooked into the service or client by constructing a new custom binding object and adding the custom binding element to it, as shown in the following sample code. - -```csharp -ICollection bindingElements = new List(); -HttpTransportBindingElement httpBindingElement = new HttpTransportBindingElement(); -GZipMessageEncodingBindingElement compBindingElement = new GZipMessageEncodingBindingElement (); -bindingElements.Add(compBindingElement); -bindingElements.Add(httpBindingElement); -CustomBinding binding = new CustomBinding(bindingElements); -binding.Name = "SampleBinding"; -binding.Namespace = "http://tempuri.org/bindings"; -``` - -While this may be sufficient for the majority of user scenarios, supporting a file configuration is critical if a service is to be Web-hosted. To support the Web-hosted scenario, you must develop a custom configuration handler to allow a custom binding element to be configurable in a file. - -You can build a configuration handler for the binding element on top of the configuration system. The configuration handler for the binding element must derive from the class. The informs the configuration system of the type of binding element to create for this section. All aspects of the `BindingElement` that can be set should be exposed as properties in the derived class. The assists in mapping the configuration element attributes to the properties and setting default values if attributes are missing. After the values from configuration are loaded and applied to the properties, the method is called, which converts the properties into a concrete instance of a binding element. The method is used to convert the properties on the derived class into the values to be set on the newly created binding element. - -The following sample code shows the implementation of the `GZipMessageEncodingElement`. - -```csharp -public class GZipMessageEncodingElement : BindingElementExtensionElement -{ - public GZipMessageEncodingElement() - { - } - -//Called by the WCF to discover the type of binding element this -//config section enables - public override Type BindingElementType - { - get { return typeof(GZipMessageEncodingBindingElement); } - } - - //The only property we need to configure for our binding element is - //the type of inner encoder to use. Here, we support text and - //binary. - [ConfigurationProperty("innerMessageEncoding", - DefaultValue = "textMessageEncoding")] - public string InnerMessageEncoding - { - get { return (string)base["innerMessageEncoding"]; } - set { base["innerMessageEncoding"] = value; } - } - - //Called by the WCF to apply the configuration settings (the - //property above) to the binding element - public override void ApplyConfiguration(BindingElement bindingElement) - { - GZipMessageEncodingBindingElement binding = - (GZipMessageEncodingBindingElement)bindingElement; - PropertyInformationCollection propertyInfo = - this.ElementInformation.Properties; - if (propertyInfo["innerMessageEncoding"].ValueOrigin != - PropertyValueOrigin.Default) - { - switch (this.InnerMessageEncoding) - { - case "textMessageEncoding": - binding.InnerMessageEncodingBindingElement = - new TextMessageEncodingBindingElement(); - break; - case "binaryMessageEncoding": - binding.InnerMessageEncodingBindingElement = - new BinaryMessageEncodingBindingElement(); - break; - } - } - } - - //Called by the WCF to create the binding element - protected override BindingElement CreateBindingElement() - { - GZipMessageEncodingBindingElement bindingElement = - new GZipMessageEncodingBindingElement(); - this.ApplyConfiguration(bindingElement); - return bindingElement; - } -} -``` - -This configuration handler maps to the following representation in the App.config or Web.config for the service or client. - -```xml - -``` - -To use this configuration handler, it must be registered within the [\](../../configure-apps/file-schema/wcf/system-servicemodel.md) element, as shown in the following sample configuration. - -```xml - - - - - -``` - -When you run the server, the operation requests and responses are displayed in the console window. Press ENTER in the window to shut down the server. - -```console -Press Enter key to Exit. - - Server Echo(string input) called: - Client message: Simple hello - - Server BigEcho(string[] input) called: - 64 client messages -``` - -When you run the client, the operation requests and responses are displayed in the console window. Press ENTER in the client window to shut down the client. - -```console -Calling Echo(string): -Server responds: Simple hello Simple hello - -Calling BigEcho(string[]): -Server responds: Hello 0 - -Press to terminate client. -``` - -### To set up, build, and run the sample - -1. Install ASP.NET 4.0 using the following command: - - ```console - %windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable - ``` - -2. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -3. To build the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -4. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Extensibility\MessageEncoder\Compression` diff --git a/docs/framework/wcf/samples/custom-message-encoder-custom-text-encoder.md b/docs/framework/wcf/samples/custom-message-encoder-custom-text-encoder.md deleted file mode 100644 index b5fe00b71bb33..0000000000000 --- a/docs/framework/wcf/samples/custom-message-encoder-custom-text-encoder.md +++ /dev/null @@ -1,238 +0,0 @@ ---- -title: "Custom Message Encoder: Custom Text Encoder" -description: Use this sample to implement a custom text message encoder using WCF. This encoder supports all platform-supported character encodings for interoperability. -ms.date: "03/30/2017" -ms.assetid: 68ff5c74-3d33-4b44-bcae-e1d2f5dea0de ---- -# Custom Message Encoder: Custom Text Encoder - -This sample demonstrates how to implement a custom text message encoder using Windows Communication Foundation (WCF). - -> [!WARNING] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Extensibility\MessageEncoder\Text` - -The of WCF supports only the UTF-8, UTF-16 and big-endian Unicode encodings. The custom text message encoder in this sample supports all platform-supported character encodings that may be required for interoperability. The sample consists of a client console program (.exe), a service library (.dll) hosted by Internet Information Services (IIS), and a text message encoder library (.dll). The service implements a contract that defines a request-reply communication pattern. The contract is defined by the `ICalculator` interface, which exposes math operations (Add, Subtract, Multiply, and Divide). The client makes synchronous requests to a given math operation and the service replies with the result. Both client and service uses the `CustomTextMessageEncoder` instead of the default . - -The custom encoder implementation consists of a message encoder factory, a message encoder, a message encoding binding element and a configuration handler, and demonstrates the following: - -- Building a custom encoder and encoder factory. - -- Creating a binding element for a custom encoder. - -- Using the custom binding configuration for integrating custom binding elements. - -- Developing a custom configuration handler to allow file configuration of a custom binding element. - -## To set up, build, and run the sample - -1. Install ASP.NET 4.0 using the following command. - - ```console - %windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable - ``` - -2. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -3. To build the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -4. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -## Message Encoder Factory and the Message Encoder - -When the or the client channel is opened, the design time component `CustomTextMessageBindingElement` creates the `CustomTextMessageEncoderFactory`. The factory creates the `CustomTextMessageEncoder`. The message encoder operates both in the streaming mode and the buffered mode. It uses the and to read and write the messages respectively. As opposed to the optimized XML readers and writers of WCF that support only UTF-8, UTF-16 and big-endian Unicode, these readers and writers support all platform-supported encoding. - -The following code example shows the CustomTextMessageEncoder. - -```csharp -public class CustomTextMessageEncoder : MessageEncoder -{ - private CustomTextMessageEncoderFactory factory; - private XmlWriterSettings writerSettings; - private string contentType; - - public CustomTextMessageEncoder(CustomTextMessageEncoderFactory factory) - { - this.factory = factory; - - this.writerSettings = new XmlWriterSettings(); - this.writerSettings.Encoding = Encoding.GetEncoding(factory.CharSet); - this.contentType = $"{this.factory.MediaType}; charset={this.writerSettings.Encoding.HeaderName}"; - } - - public override string ContentType - { - get - { - return this.contentType; - } - } - - public override string MediaType - { - get - { - return factory.MediaType; - } - } - - public override MessageVersion MessageVersion - { - get - { - return this.factory.MessageVersion; - } - } - - public override Message ReadMessage(ArraySegment buffer, BufferManager bufferManager, string contentType) - { - byte[] msgContents = new byte[buffer.Count]; - Array.Copy(buffer.Array, buffer.Offset, msgContents, 0, msgContents.Length); - bufferManager.ReturnBuffer(buffer.Array); - - MemoryStream stream = new MemoryStream(msgContents); - return ReadMessage(stream, int.MaxValue); - } - - public override Message ReadMessage(Stream stream, int maxSizeOfHeaders, string contentType) - { - XmlReader reader = XmlReader.Create(stream); - return Message.CreateMessage(reader, maxSizeOfHeaders, this.MessageVersion); - } - - public override ArraySegment WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset) - { - MemoryStream stream = new MemoryStream(); - XmlWriter writer = XmlWriter.Create(stream, this.writerSettings); - message.WriteMessage(writer); - writer.Close(); - - byte[] messageBytes = stream.GetBuffer(); - int messageLength = (int)stream.Position; - stream.Close(); - - int totalLength = messageLength + messageOffset; - byte[] totalBytes = bufferManager.TakeBuffer(totalLength); - Array.Copy(messageBytes, 0, totalBytes, messageOffset, messageLength); - - ArraySegment byteArray = new ArraySegment(totalBytes, messageOffset, messageLength); - return byteArray; - } - - public override void WriteMessage(Message message, Stream stream) - { - XmlWriter writer = XmlWriter.Create(stream, this.writerSettings); - message.WriteMessage(writer); - writer.Close(); - } -} -``` - -The following code example shows how to build the message encoder factory. - -```csharp -public class CustomTextMessageEncoderFactory : MessageEncoderFactory -{ - private MessageEncoder encoder; - private MessageVersion version; - private string mediaType; - private string charSet; - - internal CustomTextMessageEncoderFactory(string mediaType, string charSet, - MessageVersion version) - { - this.version = version; - this.mediaType = mediaType; - this.charSet = charSet; - this.encoder = new CustomTextMessageEncoder(this); - } - - public override MessageEncoder Encoder - { - get - { - return this.encoder; - } - } - - public override MessageVersion MessageVersion - { - get - { - return this.version; - } - } - - internal string MediaType - { - get - { - return this.mediaType; - } - } - - internal string CharSet - { - get - { - return this.charSet; - } - } -} -``` - -## Message Encoding Binding Element - -The binding elements allow the configuration of the WCF run-time stack. To use the custom message encoder in a WCF application, a binding element is required that creates the message encoder factory with the appropriate settings at the appropriate level in the run-time stack. - -The `CustomTextMessageBindingElement` derives from the base class and inherits from the class. This allows other WCF components to recognize this binding element as being a message encoding binding element. The implementation of returns an instance of the matching message encoder factory with appropriate settings. - -The `CustomTextMessageBindingElement` exposes settings for `MessageVersion`, `ContentType`, and `Encoding` through properties. The encoder supports both Soap11Addressing and Soap12Addressing1 versions. The default is Soap11Addressing1. The default value of the `ContentType` is "text/xml". The `Encoding` property allows you to set the value of the desired character encoding. The sample client and service uses the ISO-8859-1 (Latin1) character encoding, which is not supported by the of WCF. - -The following code shows how to programmatically create the binding using the custom text message encoder. - -```csharp -ICollection bindingElements = new List(); -HttpTransportBindingElement httpBindingElement = new HttpTransportBindingElement(); -CustomTextMessageBindingElement textBindingElement = new CustomTextMessageBindingElement(); -bindingElements.Add(textBindingElement); -bindingElements.Add(httpBindingElement); -CustomBinding binding = new CustomBinding(bindingElements); -``` - -## Adding Metadata Support to the Message Encoding Binding Element - -Any type that derives from is responsible for updating the version of the SOAP binding in the WSDL document generated for the service. This is done by implementing the `ExportEndpoint` method on the interface and then modifying the generated WSDL. In this sample, the `CustomTextMessageBindingElement` uses the WSDL export logic from the `TextMessageEncodingBindingElement`. - -For this sample, the client configuration is hand configured. You cannot use Svcutil.exe to generate the client configuration because the `CustomTextMessageBindingElement` does not export a policy assertion to describe its behavior. You should generally implement the interface on a custom binding element to export a custom policy assertion that describes the behavior or capability implemented by the binding element. For an example of how to export a policy assertion for a custom binding element, see the [Transport: UDP](transport-udp.md) sample. - -## Message Encoding Binding Configuration Handler - -The previous section shows how to use the custom text message encoder programmatically. The `CustomTextMessageEncodingBindingSection` implements a configuration handler that allows you to specify the use of a custom text message encoder within a configuration file. The `CustomTextMessageEncodingBindingSection` class derives from the class. The `BindingElementType` property informs the configuration system of the type of binding element to create for this section. - -All of the settings defined by `CustomTextMessageBindingElement` are exposed as the properties in the `CustomTextMessageEncodingBindingSection`. The assists in mapping the configuration element attributes to the properties and setting default values if the attribute is not set. After the values from configuration are loaded and applied to the properties of the type, the method is called, which converts the properties into a concrete instance of a binding element. - -This configuration handler maps to the following representation in the App.config or Web.config for the service or client. - -```xml - -``` - -The sample uses the ISO-8859-1 encoding. - -To use this configuration handler it must be registered using the following configuration element. - -```xml - - - - - -``` diff --git a/docs/framework/wcf/samples/custom-message-filter.md b/docs/framework/wcf/samples/custom-message-filter.md deleted file mode 100644 index 523f78883f3ea..0000000000000 --- a/docs/framework/wcf/samples/custom-message-filter.md +++ /dev/null @@ -1,135 +0,0 @@ ---- -description: "Learn more about: Custom Message Filter" -title: "Custom Message Filter" -ms.date: "03/30/2017" -ms.assetid: 98dd0af8-fce6-4255-ac32-42eb547eea67 ---- -# Custom Message Filter - -This sample demonstrates how to replace the message filters that Windows Communication Foundation (WCF) uses to dispatch messages to endpoints. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - - When the first message on a channel arrives at the server, the server must determine which (if any) of the endpoints associated with that URI should receive the message. This process is controlled by the objects attached to the . - - Each endpoint of a service has a single . The has both an and a . The union of these two filters is the message filter used for that endpoint. - - By default, the for an endpoint matches any message that is addressed to an address that matches the service endpoint's . By default, the for an endpoint inspects the action of the incoming message and matches any message with an action that corresponds to one of the actions of the service endpoint contract's operations (only `IsInitiating`=`true` actions are considered). As a result, by default, the filter for an endpoint only matches if both the message's To header is the of the endpoint and the message's action matches one of the endpoint operation's actions. - - These filters can be changed using a behavior. In the sample, the service creates an that replaces the and on the : - -```csharp -class FilteringEndpointBehavior : IEndpointBehavior -{ - //... -} -``` - - Two address filters are defined: - -```csharp -// Matches any message whose To address contains the letter 'e' -class MatchEAddressFilter : MessageFilter { } -// Matches any message whose To address does not contain the letter 'e' -class MatchNoEAddressFilter : MessageFilter { } -``` - - The `FilteringEndpointBehavior` is made configurable and allows for two different variations. - -```csharp -public class FilteringEndpointBehaviorExtension : BehaviorExtensionElement { } -``` - - Variation 1 matches only addresses that contain an 'e' (but that have any Action) whereas Variation 2 matches only addresses that lack an 'e': - -```csharp -if (Variation == 1) - return new FilteringEndpointBehavior( - new MatchEAddressFilter(), new MatchAllMessageFilter()); -else - return new FilteringEndpointBehavior( - new MatchNoEAddressFilter(), new MatchAllMessageFilter()); -``` - - In the configuration file, the service registers the new behavior: - -```xml - - - - - -``` - - Then the service creates `endpointBehavior` configurations for each variation: - -```xml - - - - - - - - -``` - - Finally, the service's endpoint references one of the `behaviorConfigurations`: - -```xml - -``` - - The implementation of the client application is straightforward; it creates two channels to the service's URI (by passing in that value as the second (`via`) parameter to and sends a single message on each channel, but it uses different endpoint addresses for each. As a result, the outbound messages from the client have different To designations, and the server responds accordingly, as demonstrated by the client's output: - -```console -Sending message to urn:e... -Exception: The message with To 'urn:e' cannot be processed at the receiver, due to an AddressFilter mismatch at the EndpointDispatcher. Check that the sender and receiver's EndpointAddresses agree. - -Sending message to urn:a... -Hello -``` - - Switching the variation in the server's configuration file causes the filter to be swapped and the client sees the opposite behavior (the message to `urn:e` succeeds, whereas the message to `urn:a` fails). - -```xml - -``` - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Extensibility\MessageFilter` - -### To set up, build, and run the sample - -1. To build the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -2. To run the sample in a single-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -3. To run the sample in a cross-machine configuration, follow the instructions at [Running the Windows Communication Foundation Samples](running-the-samples.md) and change the following line in Client.cs. - - ```csharp - Uri serviceVia = new Uri("http://localhost/ServiceModelSamples/service.svc"); - ``` - - Replace localhost with the name of server. - - ```csharp - Uri serviceVia = new Uri("http://servermachinename/ServiceModelSamples/service.svc"); - ``` diff --git a/docs/framework/wcf/samples/custom-message-interceptor.md b/docs/framework/wcf/samples/custom-message-interceptor.md deleted file mode 100644 index 16775c56c8bbf..0000000000000 --- a/docs/framework/wcf/samples/custom-message-interceptor.md +++ /dev/null @@ -1,174 +0,0 @@ ---- -description: "Learn more about: Custom Message Interceptor" -title: "Custom Message Interceptor" -ms.date: "03/30/2017" -ms.assetid: 73f20972-53f8-475a-8bfe-c133bfa225b0 ---- -# Custom Message Interceptor - -This sample demonstrates the use of the channel extensibility model. In particular, it shows how to implement a custom binding element that creates channel factories and channel listeners to intercept all incoming and outgoing messages at a particular point in the run-time stack. The sample also includes a client and server that demonstrate the use of these custom factories. - - In this sample, both the client and the service are console programs (.exe). The client and service both make use of a common library (.dll) that contains the custom binding element and its associated run-time objects. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Extensibility\Channels\MessageInterceptor` - - The sample describes the recommended procedure for creating a custom layered channel in Windows Communication Foundation (WCF), by using the channel framework and following WCF best practices. The steps to create a custom layered channel are as follows: - -1. Decide which of the channel shapes your channel factory and channel listener will support. - -2. Create a channel factory and a channel listener that support your channel shapes. - -3. Add a binding element that adds the custom layered channel to a channel stack. - -4. Add a binding element extension section to expose the new binding element to the configuration system. - -## Channel Shapes - - The first step in writing a custom layered channel is to decide which shapes are required for the channel. For our message inspector, we support any shape that the layer below us supports (for example, if the layer below us can build and , then we also expose and ). - -## Channel Factory and Listener Factory - - The next step in writing a custom layered channel is to create an implementation of for client channels and of for service channels. - - These classes take an inner factory and listener, and delegate all but the `OnCreateChannel` and `OnAcceptChannel` calls to the inner factory and listener. - -```csharp -class InterceptingChannelFactory : ChannelFactoryBase -{ - //... -} - -class InterceptingChannelListener : ListenerFactoryBase -{ - //... -} -``` - -## Adding a Binding Element - - The sample defines a custom binding element: `InterceptingBindingElement`. `InterceptingBindingElement` takes a `ChannelMessageInterceptor` as an input, and uses this `ChannelMessageInterceptor` to manipulate messages that pass through it. This is the only class that must be public. The factory, listener, and channels can all be internal implementations of the public run-time interfaces. - -```csharp -public class InterceptingBindingElement : BindingElement -{ -} -``` - -## Adding Configuration Support - - To integrate with binding configuration, the library defines a configuration section handler as a binding element extension section. The client and server configuration files must register the binding element extension with the configuration system. Implementers that want to expose their binding element to the configuration system can derive from this class. - -```csharp -public abstract class InterceptingElement : BindingElementExtensionElement -{ - //... -} -``` - -## Adding Policy - - To integrate with our policy system, `InterceptingBindingElement` implements IPolicyExportExtension to signal that we should participate in generating policy. To support importing policy on a generated client, the user can register a derived class of `InterceptingBindingElementImporter` and override `CreateMessageInterceptor`() to generate their policy-enabled `ChannelMessageInterceptor` class. - -## Example: Droppable Message Inspector - - Included in the sample is an example implementation of `ChannelMessageInspector` which drops messages. - -```csharp -class DroppingServerElement : InterceptingElement -{ - protected override ChannelMessageInterceptor CreateMessageInterceptor() - { - return new DroppingServerInterceptor(); - } -} -``` - - You can access it from configuration as follows: - -```xml - - ... - - ... - - - - - - - -``` - - The client and server both use this newly created configuration section to insert the custom factories into the lowest-level of their run-time channel stacks (above the transport level). - -```xml - - - - - - -``` - - The client uses the `MessageInterceptor` library to add a custom header to even numbered messages. The service on the other hand uses `MessageInterceptor` library to drop any messages that do not have this special header. - - You should see the following client output after running the service and then the client. - -```console -Reporting the next 10 wind speed -100 kph -Server dropped a message. -90 kph -80 kph -Server dropped a message. -70 kph -60 kph -Server dropped a message. -50 kph -40 kph -Server dropped a message. -30 kph -20 kph -Server dropped a message. -10 kph -Press ENTER to shut down client -``` - - The client reports 10 different wind speeds to the service, but only tags half of them with the special header. - - On the service, you should see the following output: - -```console -Press ENTER to exit. -Dangerous wind detected! Reported speed (90) is greater than 64 kph. -Dangerous wind detected! Reported speed (70) is greater than 64 kph. -5 wind speed reports have been received. -``` - -### To set up, build, and run the sample - -1. Install ASP.NET 4.0 using the following command. - - ```console - %windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable - ``` - -2. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -3. To build the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -4. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -5. Run Service.exe first then run Client.exe and watch both console windows for output. diff --git a/docs/framework/wcf/samples/custom-secure-metadata-endpoint.md b/docs/framework/wcf/samples/custom-secure-metadata-endpoint.md deleted file mode 100644 index c220fa32bf71b..0000000000000 --- a/docs/framework/wcf/samples/custom-secure-metadata-endpoint.md +++ /dev/null @@ -1,186 +0,0 @@ ---- -description: "Learn more about: Custom Secure Metadata Endpoint" -title: "Custom Secure Metadata Endpoint" -ms.date: "03/30/2017" -ms.assetid: 9e369e99-ea4a-49ff-aed2-9fdf61091a48 ---- -# Custom Secure Metadata Endpoint - -This sample demonstrates how to implement a service with a secure metadata endpoint that uses one of the non-metadata exchange bindings, and how to configure [ServiceModel Metadata Utility Tool (Svcutil.exe)](../servicemodel-metadata-utility-tool-svcutil-exe.md) or clients to fetch the metadata from such a metadata endpoint. There are two system-provided bindings available for exposing metadata endpoints: mexHttpBinding and mexHttpsBinding. mexHttpBinding is used to expose a metadata endpoint over HTTP in a non-secure manner. mexHttpsBinding is used to expose a metadata endpoint over HTTPS in a secure manner. This sample illustrates how to expose a secure metadata endpoint using the . You would want to do this when you want to change the security settings on the binding, but you do not want to use HTTPS. If you use the mexHttpsBinding your metadata endpoint will be secure, but there is no way to modify the binding settings. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - -## Service - - The service in this sample has two endpoints. The application endpoint serves the `ICalculator` contract on a `WSHttpBinding` with `ReliableSession` enabled and `Message` security using certificates. The metadata endpoint also uses `WSHttpBinding`, with the same security settings but with no `ReliableSession`. Here is the relevant configuration: - -```xml - - - - - - - - - - - - - - - - - - - - - - -``` - - In many of the other samples, the metadata endpoint uses the default `mexHttpBinding`, which is not secure. Here the metadata is secured using `WSHttpBinding` with `Message` security. In order for metadata clients to retrieve this metadata, they must be configured with a matching binding. This sample demonstrates two such clients. - - The first client uses Svcutil.exe to fetch the metadata and generate client code and configuration at design time. Because the service uses a non-default binding for the metadata, the Svcutil.exe tool must be specifically configured so that it can get the metadata from the service using that binding. - - The second client uses the `MetadataResolver` to dynamically fetch the metadata for a known contract and then invoke operations on the dynamically generated client. - -## Svcutil client - - When using the default binding to host your `IMetadataExchange` endpoint, you can run Svcutil.exe with the address of that endpoint: - -```console -svcutil http://localhost/servicemodelsamples/service.svc/mex -``` - - and it works. But in this sample, the server uses a non-default endpoint to host the metadata. So Svcutil.exe must be instructed to use the correct binding. This can be done using a Svcutil.exe.config file. - - The Svcutil.exe.config file looks like a normal client configuration file. The only unusual aspects are the client endpoint name and contract: - -```xml - -``` - - The endpoint name must be the name of the scheme of the address where the metadata is hosted and the endpoint contract must be `IMetadataExchange`. Thus, when Svcutil.exe is run with a command-line such as the following: - -```console -svcutil http://localhost/servicemodelsamples/service.svc/mex -``` - - it looks for the endpoint named "http" and contract `IMetadataExchange` to configure the binding and behavior of the communication exchange with the metadata endpoint. The rest of the Svcutil.exe.config file in the sample specifies the binding configuration and behavior credentials to match the server's configuration of the metadata endpoint. - - In order for Svcutil.exe to pick up the configuration in Svcutil.exe.config, Svcutil.exe must be in the same directory as the configuration file. As a result, you must copy Svcutil.exe from its install location to the directory that contains the Svcutil.exe.config file. Then from that directory, run the following command: - -```console -.\svcutil.exe http://localhost/servicemodelsamples/service.svc/mex -``` - - The leading ".\\" ensures that the copy of Svcutil.exe in this directory (the one which has a corresponding Svcutil.exe.config) is run. - -## MetadataResolver client - - If the client knows the contract and how to talk to the metadata at design time, the client can dynamically find out the binding and address of application endpoints using the `MetadataResolver`. This sample client demonstrates this, showing how to configure the binding and credentials used by `MetadataResolver` by creating and configuring a `MetadataExchangeClient`. - - The same binding and certificate information that appeared in Svcutil.exe.config can be specified imperatively on the `MetadataExchangeClient`: - -```csharp -// Specify the Metadata Exchange binding and its security mode -WSHttpBinding mexBinding = new WSHttpBinding(SecurityMode.Message); -mexBinding.Security.Message.ClientCredentialType = MessageCredentialType.Certificate; - -// Create a MetadataExchangeClient for retrieving metadata, and set the // certificate details -MetadataExchangeClient mexClient = new MetadataExchangeClient(mexBinding); -mexClient.SoapCredentials.ClientCertificate.SetCertificate( StoreLocation.CurrentUser, StoreName.My, - X509FindType.FindBySubjectName, "client.com"); -mexClient.SoapCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust; -mexClient.SoapCredentials.ServiceCertificate.SetDefaultCertificate( StoreLocation.CurrentUser, StoreName.TrustedPeople, - X509FindType.FindBySubjectName, "localhost"); -``` - - With the `mexClient` configured, we can enumerate the contracts we are interested in, and use `MetadataResolver` to fetch a list of endpoints with those contracts: - -```csharp -// The contract we want to fetch metadata for -Collection contracts = new Collection(); -ContractDescription contract = ContractDescription.GetContract(typeof(ICalculator)); -contracts.Add(contract); -// Find endpoints for that contract -EndpointAddress mexAddress = new EndpointAddress(ConfigurationManager.AppSettings["mexAddress"]); -ServiceEndpointCollection endpoints = MetadataResolver.Resolve(contracts, mexAddress, mexClient); -``` - - Finally we can use the information from those endpoints to initialize the binding and address of a `ChannelFactory` used to create channels to communicate with the application endpoints. - -```csharp -ChannelFactory cf = new ChannelFactory(endpoint.Binding, endpoint.Address); -``` - - The key point of this sample client is to demonstrate that, if you are using `MetadataResolver`, and you must specify custom bindings or behaviors for the metadata exchange communication, you can use a `MetadataExchangeClient` to specify those custom settings. - -#### To set up and build the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -#### To run the sample on the same machine - -1. Run Setup.bat from the sample install folder. This installs all the certificates required for running the sample. Note that Setup.bat uses the FindPrivateKey.exe tool, which is installed by running setupCertTool.bat from [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. Run the client application from \MetadataResolverClient\bin or \SvcutilClient\bin. Client activity is displayed on the client console application. - -3. If the client and service are not able to communicate, see [Troubleshooting Tips for WCF Samples](/previous-versions/dotnet/netframework-3.5/ms751511(v=vs.90)). - -4. Remove the certificates by running Cleanup.bat when you have finished with the sample. Other security samples use the same certificates. - -#### To run the sample across machines - -1. On the server, run `setup.bat service`. Running `setup.bat` with the `service` argument creates a service certificate with the fully-qualified domain name of the machine and exports the service certificate to a file named Service.cer. - -2. On the server, edit Web.config to reflect the new certificate name. That is, change the `findValue` attribute in the [\](../../configure-apps/file-schema/wcf/servicecertificate-of-clientcredentials-element.md) element to the fully-qualified domain name of the machine. - -3. Copy the Service.cer file from the service directory to the client directory on the client machine. - -4. On the client, run `setup.bat client`. Running `setup.bat` with the `client` argument creates a client certificate named Client.com and exports the client certificate to a file named Client.cer. - -5. In the App.config file of the `MetadataResolverClient` on the client machine, change the address value of the mex endpoint to match the new address of your service. You do this by replacing localhost with the fully-qualified domain name of the server. Also change the occurrence of "localhost" in the metadataResolverClient.cs file to the new service certificate name (the fully-qualified domain name of the server). Do the same thing for the App.config of the SvcutilClient project. - -6. Copy the Client.cer file from the client directory to the service directory on the server. - -7. On the client, run `ImportServiceCert.bat`. This imports the service certificate from the Service.cer file into the CurrentUser - TrustedPeople store. - -8. On the server, run `ImportClientCert.bat`, This imports the client certificate from the Client.cer file into the LocalMachine - TrustedPeople store. - -9. On the service machine, build the service project in Visual Studio and select the help page in a web browser to verify that it is running. - -10. On the client machine, run the MetadataResolverClient or the SvcutilClient from VS. - - 1. If the client and service are not able to communicate, see [Troubleshooting Tips for WCF Samples](/previous-versions/dotnet/netframework-3.5/ms751511(v=vs.90)). - -#### To clean up after the sample - -- Run Cleanup.bat in the samples folder once you have finished running the sample. - - > [!NOTE] - > This script does not remove service certificates on a client when running this sample across machines. If you have run Windows Communication Foundation (WCF) samples that use certificates across machines, be sure to clear the service certificates that have been installed in the CurrentUser - TrustedPeople store. To do this, use the following command: `certmgr -del -r CurrentUser -s TrustedPeople -c -n `. For example: `certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com`. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Extensibility\Metadata\CustomMexEndpoint` diff --git a/docs/framework/wcf/samples/custom-service-host.md b/docs/framework/wcf/samples/custom-service-host.md deleted file mode 100644 index 8077b717ea5b0..0000000000000 --- a/docs/framework/wcf/samples/custom-service-host.md +++ /dev/null @@ -1,180 +0,0 @@ ---- -description: "Learn more about: Custom Service Host" -title: Custom Service Host -ms.date: "03/30/2017" -ms.assetid: fe16ff50-7156-4499-9c32-13d8a79dc100 ---- -# Custom Service Host - -This sample demonstrates how to use a custom derivative of the class to alter the run-time behavior of a service. This approach provides a reusable alternative to configuring a large number of services in a common way. The sample also demonstrates how to use the class to use a custom ServiceHost in the Internet Information Services (IIS) or Windows Process Activation Service (WAS) hosting environment. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Extensibility\Hosting\CustomServiceHost` - -## About the scenario - - To prevent unintentional disclosure of potentially sensitive service metadata, the default configuration for Windows Communication Foundation (WCF) services disables metadata publishing. This behavior is secure by default, but also means that you cannot use a metadata import tool (such as Svcutil.exe) to generate the client code required to call the service unless the service's metadata publishing behavior is explicitly enabled in configuration. - - Enabling metadata publishing for a large number of services involves adding the same configuration elements to each individual service, which results in a large amount of configuration information that is essentially the same. As an alternative to configuring each service individually, it is possible to write the imperative code that enables metadata publishing once and then reuse that code across several different services. This is accomplished by creating a new class that derives from and overrides the `ApplyConfiguration`() method to imperatively add the metadata publishing behavior. - -> [!IMPORTANT] -> For clarity, this sample demonstrates how to create an unsecured metadata publishing endpoint. Such endpoints are potentially available to anonymous unauthenticated consumers and care must be taken before deploying such endpoints to ensure that publicly disclosing a service's metadata is appropriate. - -## Implementing a custom ServiceHost - - The class exposes several useful virtual methods that inheritors can override to alter the run-time behavior of a service. For example, the `ApplyConfiguration`() method reads service configuration information from the configuration store and alters the host's accordingly. The default implementation reads configuration from the application's configuration file. Custom implementations can override `ApplyConfiguration`() to further alter the using imperative code or even replace the default configuration store entirely. For example, to read a service's endpoint configuration from a database instead of the application's configuration file. - - In this sample, we want to build a custom ServiceHost that adds the ServiceMetadataBehavior (which enables metadata publishing) even if this behavior is not explicitly added in the service's configuration file. To accomplish this, create a new class that inherits from and overrides `ApplyConfiguration`(). - -```csharp -class SelfDescribingServiceHost : ServiceHost -{ - public SelfDescribingServiceHost(Type serviceType, params Uri[] baseAddresses) - : base(serviceType, baseAddresses) { } - - //Overriding ApplyConfiguration() allows us to - //alter the ServiceDescription prior to opening - //the service host. - protected override void ApplyConfiguration() - { - //First, we call base.ApplyConfiguration() - //to read any configuration that was provided for - //the service we're hosting. After this call, - //this.Description describes the service - //as it was configured. - base.ApplyConfiguration(); - - //(rest of implementation elided for clarity) - } -} -``` - - Because we do not want to ignore any configuration that has been provided in the application's configuration file, the first thing our override of `ApplyConfiguration`() does is call the base implementation. Once this method completes, we can imperatively add the to the description using the following imperative code. - -```csharp -ServiceMetadataBehavior mexBehavior = this.Description.Behaviors.Find(); -if (mexBehavior == null) -{ - mexBehavior = new ServiceMetadataBehavior(); - this.Description.Behaviors.Add(mexBehavior); -} -else -{ - //Metadata behavior has already been configured, - //so we do not have any work to do. - return; -} -``` - - The last thing our `ApplyConfiguration`() override must do is add the default metadata endpoint. By convention, one metadata endpoint is created for each URI in the service host's BaseAddresses collection. - -```csharp -//Add a metadata endpoint at each base address -//using the "/mex" addressing convention -foreach (Uri baseAddress in this.BaseAddresses) -{ - if (baseAddress.Scheme == Uri.UriSchemeHttp) - { - mexBehavior.HttpGetEnabled = true; - this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, - MetadataExchangeBindings.CreateMexHttpBinding(), - "mex"); - } - else if (baseAddress.Scheme == Uri.UriSchemeHttps) - { - mexBehavior.HttpsGetEnabled = true; - this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, - MetadataExchangeBindings.CreateMexHttpsBinding(), - "mex"); - } - else if (baseAddress.Scheme == Uri.UriSchemeNetPipe) - { - this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, - MetadataExchangeBindings.CreateMexNamedPipeBinding(), - "mex"); - } - else if (baseAddress.Scheme == Uri.UriSchemeNetTcp) - { - this.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName, - MetadataExchangeBindings.CreateMexTcpBinding(), - "mex"); - } -} -``` - -## Using a custom ServiceHost in self-host - - Now that we have completed our custom ServiceHost implementation, we can use it to add metadata publishing behavior to any service by hosting that service inside of an instance of our `SelfDescribingServiceHost`. The following code shows how to use it in the self-host scenario. - -```csharp -SelfDescribingServiceHost host = - new SelfDescribingServiceHost( typeof( Calculator ) ); -host.Open(); -``` - - Our custom host still reads the service's endpoint configuration from the application's configuration file, as if we had used the default class to host the service. However, because we added the logic to enable metadata publishing inside of our custom host, we no longer must explicitly enable the metadata publishing behavior in configuration. This approach has a distinct advantage when you are building an application that contains several services and you want to enable metadata publishing on each of them without writing the same configuration elements over and over. - -## Using a custom ServiceHost in IIS or WAS - - Using a custom service host in self-host scenarios is straightforward, because it is your application code that is ultimately responsible for creating and opening the service host instance. In the IIS or WAS hosting environment, however, the WCF infrastructure is dynamically instantiating your service's host in response to incoming messages. Custom service hosts can also be used in this hosting environment, but they require some additional code in the form of a ServiceHostFactory. The following code shows a derivative of that returns instances of our custom `SelfDescribingServiceHost`. - -```csharp -public class SelfDescribingServiceHostFactory : ServiceHostFactory -{ - protected override ServiceHost CreateServiceHost(Type serviceType, - Uri[] baseAddresses) - { - //All the custom factory does is return a new instance - //of our custom host class. The bulk of the custom logic should - //live in the custom host (as opposed to the factory) - //for maximum - //reuse value outside of the IIS/WAS hosting environment. - return new SelfDescribingServiceHost(serviceType, - baseAddresses); - } -} -``` - - As you can see, implementing a custom ServiceHostFactory is straightforward. All of the custom logic resides inside of the ServiceHost implementation; the factory returns an instance of the derived class. - - To use a custom factory with a service implementation, we must add some additional metadata to the service's .svc file. - -```aspx-csharp -<% @ServiceHost Service="Microsoft.ServiceModel.Samples.CalculatorService" - Factory="Microsoft.ServiceModel.Samples.SelfDescribingServiceHostFactory" - language=c# Debug="true" %> -``` - - Here we have added an additional `Factory` attribute to the `@ServiceHost` directive, and passed the CLR type name of our custom factory as the attribute's value. When IIS or WAS receives a message for this service, the WCF hosting infrastructure first creates an instance of the ServiceHostFactory and then instantiates the service host itself by calling `ServiceHostFactory.CreateServiceHost()`. - -## Running the sample - - Although this sample does provide a fully functional client and service implementation, the point of the sample is to illustrate how to alter a service's run-time behavior by means of a custom host., do the following steps: - -### Observe the effect of the custom host - -1. Open the service's Web.config file and observe that there is no configuration explicitly enabling metadata for the service. - -2. Open the service's .svc file and observe that its @ServiceHost directive contains a Factory attribute that specifies the name of a custom ServiceHostFactory. - -### Set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. After the solution has been built, run Setup.bat to set up the ServiceModelSamples Application in IIS 7.0. The ServiceModelSamples directory should now appear as an IIS 7.0 Application. - -4. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -5. To remove the IIS 7.0 application, run *Cleanup.bat*. - -## See also - -- [How to: Host a WCF Service in IIS](../feature-details/how-to-host-a-wcf-service-in-iis.md) diff --git a/docs/framework/wcf/samples/custom-token.md b/docs/framework/wcf/samples/custom-token.md deleted file mode 100644 index 06c82a977b838..0000000000000 --- a/docs/framework/wcf/samples/custom-token.md +++ /dev/null @@ -1,633 +0,0 @@ ---- -description: "Learn more about: Custom Token" -title: "Custom Token" -ms.date: "03/30/2017" -ms.assetid: e7fd8b38-c370-454f-ba3e-19759019f03d ---- -# Custom Token - -This sample demonstrates how to add a custom token implementation into a Windows Communication Foundation (WCF) application. The example uses a `CreditCardToken` to securely pass information about client credit cards to the service. The token is passed in the WS-Security message header and is signed and encrypted using the symmetric security binding element along with message body and other message headers. This is useful in cases where the built-in tokens are not sufficient. This sample demonstrates how to provide a custom security token to a service instead of using one of the built-in tokens. The service implements a contract that defines a request-reply communication pattern. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - - To summarize, this sample demonstrates the following: - -- How a client can pass a custom security token to a service. - -- How the service can consume and validate a custom security token. - -- How the WCF service code can obtain the information about received security tokens including the custom security token. - -- How the server's X.509 certificate is used to protect the symmetric key used for message encryption and signature. - -## Client Authentication Using a Custom Security Token - - The service exposes a single endpoint that is programmatically created using `BindingHelper` and `EchoServiceHost` classes. The endpoint consists of an address, a binding, and a contract. The binding is configured with a custom binding using `SymmetricSecurityBindingElement` and `HttpTransportBindingElement`. This sample sets the `SymmetricSecurityBindingElement` to use a service's X.509 certificate to protect the symmetric key during transmission and to pass a custom `CreditCardToken` in a WS-Security message header as a signed and encrypted security token. The behavior specifies the service credentials that are to be used for client authentication and also information about the service X.509 certificate. - -```csharp -public static class BindingHelper -{ - public static Binding CreateCreditCardBinding() - { - var httpTransport = new HttpTransportBindingElement(); - - // The message security binding element will be configured to require a credit card. - // The token that is encrypted with the service's certificate. - var messageSecurity = new SymmetricSecurityBindingElement(); - messageSecurity.EndpointSupportingTokenParameters.SignedEncrypted.Add(new CreditCardTokenParameters()); - X509SecurityTokenParameters x509ProtectionParameters = new X509SecurityTokenParameters(); - x509ProtectionParameters.InclusionMode = SecurityTokenInclusionMode.Never; - messageSecurity.ProtectionTokenParameters = x509ProtectionParameters; - return new CustomBinding(messageSecurity, httpTransport); - } -} -``` - - To consume a credit card token in the message, the sample uses custom service credentials to provide this functionality. The service credentials class is located in the `CreditCardServiceCredentials` class and is added to the behaviors collections of the service host in the `EchoServiceHost.InitializeRuntime` method. - -```csharp -class EchoServiceHost : ServiceHost -{ - string creditCardFile; - - public EchoServiceHost(parameters Uri[] addresses) - : base(typeof(EchoService), addresses) - { - creditCardFile = ConfigurationManager.AppSettings["creditCardFile"]; - if (string.IsNullOrEmpty(creditCardFile)) - { - throw new ConfigurationErrorsException("creditCardFile not specified in service config"); - } - - creditCardFile = String.Format("{0}\\{1}", System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath, creditCardFile); - } - - override protected void InitializeRuntime() - { - // Create a credit card service credentials and add it to the behaviors. - CreditCardServiceCredentials serviceCredentials = new CreditCardServiceCredentials(this.creditCardFile); - serviceCredentials.ServiceCertificate.SetCertificate("CN=localhost", StoreLocation.LocalMachine, StoreName.My); - this.Description.Behaviors.Remove((typeof(ServiceCredentials))); - this.Description.Behaviors.Add(serviceCredentials); - - // Register a credit card binding for the endpoint. - Binding creditCardBinding = BindingHelper.CreateCreditCardBinding(); - this.AddServiceEndpoint(typeof(IEchoService), creditCardBinding, string.Empty); - - base.InitializeRuntime(); - } -} -``` - - The client endpoint is configured in a similar manner as the service endpoint. The client uses the same `BindingHelper` class to create a binding. The rest of the setup is located in the `Client` class. The client also sets information to be contained in the `CreditCardToken` and information about the service X.509 certificate in the setup code by adding a `CreditCardClientCredentials` instance with the proper data to the client endpoint behaviors collection. The sample uses X.509 certificate with subject name set to `CN=localhost` as the service certificate. - -```csharp -Binding creditCardBinding = BindingHelper.CreateCreditCardBinding(); -var serviceAddress = new EndpointAddress("http://localhost/servicemodelsamples/service.svc"); - -// Create a client with given client endpoint configuration. -channelFactory = new ChannelFactory(creditCardBinding, serviceAddress); - -// Configure the credit card credentials on the channel factory. -var credentials = - new CreditCardClientCredentials( - new CreditCardInfo(creditCardNumber, issuer, expirationTime)); -// Configure the service certificate on the credentials. -credentials.ServiceCertificate.SetDefaultCertificate( - "CN=localhost", StoreLocation.LocalMachine, StoreName.My); - -// Replace ClientCredentials with CreditCardClientCredentials. -channelFactory.Endpoint.Behaviors.Remove(typeof(ClientCredentials)); -channelFactory.Endpoint.Behaviors.Add(credentials); - -client = channelFactory.CreateChannel(); - -Console.WriteLine($"Echo service returned: {client.Echo()}"); - -((IChannel)client).Close(); -channelFactory.Close(); -``` - -## Custom Security Token Implementation - - To enable a custom security token in WCF, create an object representation of the custom security token. The sample has this representation in the `CreditCardToken` class. The object representation is responsible for holding all relevant security token information and to provide a list of security keys contained in the security token. In this case, the credit card security token does not contain any security key. - - The next section describes what must be done to enable a custom token to be transmitted over the wire and consumed by a WCF endpoint. - -```csharp -class CreditCardToken : SecurityToken -{ - CreditCardInfo cardInfo; - DateTime effectiveTime = DateTime.UtcNow; - string id; - ReadOnlyCollection securityKeys; - - public CreditCardToken(CreditCardInfo cardInfo) : this(cardInfo, Guid.NewGuid().ToString()) { } - - public CreditCardToken(CreditCardInfo cardInfo, string id) - { - if (cardInfo == null) - throw new ArgumentNullException(nameof(cardInfo)); - - if (id == null) - throw new ArgumentNullException(nameof(id)); - - this.cardInfo = cardInfo; - this.id = id; - - // The credit card token is not capable of any cryptography. - this.securityKeys = new ReadOnlyCollection(new List()); - } - - public CreditCardInfo CardInfo { get { return this.cardInfo; } } - - public override ReadOnlyCollection SecurityKeys { get { return this.securityKeys; } } - - public override DateTime ValidFrom { get { return this.effectiveTime; } } - public override DateTime ValidTo { get { return this.cardInfo.ExpirationDate; } } - public override string Id { get { return this.id; } } -} -``` - -## Getting the Custom Credit Card Token to and from the Message - - Security token serializers in WCF are responsible for creating an object representation of security tokens from the XML in the message and creating a XML form of the security tokens. They are also responsible for other functionality such as reading and writing key identifiers pointing to security tokens, but this example uses only security token-related functionality. To enable a custom token you must implement your own security token serializer. This sample uses the `CreditCardSecurityTokenSerializer` class for this purpose. - - On the service, the custom serializer reads the XML form of the custom token and creates the custom token object representation from it. - - On the client, the `CreditCardSecurityTokenSerializer` class writes the information contained in the security token object representation into the XML writer. - -```csharp -public class CreditCardSecurityTokenSerializer : WSSecurityTokenSerializer -{ - public CreditCardSecurityTokenSerializer(SecurityTokenVersion version) : base() { } - - protected override bool CanReadTokenCore(XmlReader reader) - { - XmlDictionaryReader localReader = XmlDictionaryReader.CreateDictionaryReader(reader); - - if (reader == null) - throw new ArgumentNullException(nameof(reader)); - - if (reader.IsStartElement(Constants.CreditCardTokenName, Constants.CreditCardTokenNamespace)) - return true; - - return base.CanReadTokenCore(reader); - } - - protected override SecurityToken ReadTokenCore(XmlReader reader, SecurityTokenResolver tokenResolver) - { - if (reader == null) - throw new ArgumentNullException(nameof(reader)); - - if (reader.IsStartElement(Constants.CreditCardTokenName, Constants.CreditCardTokenNamespace)) - { - string id = reader.GetAttribute(Constants.Id, Constants.WsUtilityNamespace); - - reader.ReadStartElement(); - - // Read the credit card number. - string creditCardNumber = reader.ReadElementString(Constants.CreditCardNumberElementName, Constants.CreditCardTokenNamespace); - - // Read the expiration date. - string expirationTimeString = reader.ReadElementString(Constants.CreditCardExpirationElementName, Constants.CreditCardTokenNamespace); - DateTime expirationTime = XmlConvert.ToDateTime(expirationTimeString, XmlDateTimeSerializationMode.Utc); - - // Read the issuer of the credit card. - string creditCardIssuer = reader.ReadElementString(Constants.CreditCardIssuerElementName, Constants.CreditCardTokenNamespace); - reader.ReadEndElement(); - - var cardInfo = new CreditCardInfo(creditCardNumber, creditCardIssuer, expirationTime); - - return new CreditCardToken(cardInfo, id); - } - else - { - return WSSecurityTokenSerializer.DefaultInstance.ReadToken(reader, tokenResolver); - } - } - - protected override bool CanWriteTokenCore(SecurityToken token) - { - if (token is CreditCardToken) - return true; - return base.CanWriteTokenCore(token); - } - - protected override void WriteTokenCore(XmlWriter writer, SecurityToken token) - { - if (writer == null) - throw new ArgumentNullException(nameof(writer)); - if (token == null) - throw new ArgumentNullException(nameof(token)); - - CreditCardToken c = token as CreditCardToken; - if (c != null) - { - writer.WriteStartElement(Constants.CreditCardTokenPrefix, Constants.CreditCardTokenName, Constants.CreditCardTokenNamespace); - writer.WriteAttributeString(Constants.WsUtilityPrefix, Constants.Id, Constants.WsUtilityNamespace, token.Id); - writer.WriteElementString(Constants.CreditCardNumberElementName, Constants.CreditCardTokenNamespace, c.CardInfo.CardNumber); - writer.WriteElementString(Constants.CreditCardExpirationElementName, Constants.CreditCardTokenNamespace, XmlConvert.ToString(c.CardInfo.ExpirationDate, XmlDateTimeSerializationMode.Utc)); - writer.WriteElementString(Constants.CreditCardIssuerElementName, Constants.CreditCardTokenNamespace, c.CardInfo.CardIssuer); - writer.WriteEndElement(); - writer.Flush(); - } - else - { - base.WriteTokenCore(writer, token); - } - } -} -``` - -## How Token Provider and Token Authenticator Classes are Created - - Client and service credentials are responsible for providing the security token manager instance. The security token manager instance is used to get token providers, token authenticators and token serializers. - - The token provider creates an object representation of the token based on the information contained in the client or service credentials. The token object representation is then written to the message using the token serializer (discussed in the previous section). - - The token authenticator validates tokens that arrive in the message. The incoming token object representation is created by the token serializer. This object representation is then passed to the token authenticator for validation. After the token is successfully validated, the token authenticator returns a collection of `IAuthorizationPolicy` objects that represent the information contained in the token. This information is used later during the message processing to perform authorization decisions and to provide claims for the application. In this example, the credit card token authenticator uses `CreditCardTokenAuthorizationPolicy` for this purpose. - - The token serializer is responsible for getting the object representation of the token to and from the wire. This is discussed in the previous section. - - In this sample, we use a token provider only on the client and a token authenticator only on the service, because we want to transmit a credit card token only in the client-to-service direction. - - The functionality on the client is located in the `CreditCardClientCredentials`, `CreditCardClientCredentialsSecurityTokenManager` and `CreditCardTokenProvider` classes. - - On the service, the functionality resides in the `CreditCardServiceCredentials`, `CreditCardServiceCredentialsSecurityTokenManager`, `CreditCardTokenAuthenticator` and `CreditCardTokenAuthorizationPolicy` classes. - -```csharp - public class CreditCardClientCredentials : ClientCredentials - { - CreditCardInfo creditCardInfo; - - public CreditCardClientCredentials(CreditCardInfo creditCardInfo) - : base() - { - if (creditCardInfo == null) - throw new ArgumentNullException(nameof(creditCardInfo)); - - this.creditCardInfo = creditCardInfo; - } - - public CreditCardInfo CreditCardInfo - { - get { return this.creditCardInfo; } - } - - protected override ClientCredentials CloneCore() - { - return new CreditCardClientCredentials(this.creditCardInfo); - } - - public override SecurityTokenManager CreateSecurityTokenManager() - { - return new CreditCardClientCredentialsSecurityTokenManager(this); - } - } - - public class CreditCardClientCredentialsSecurityTokenManager : ClientCredentialsSecurityTokenManager - { - CreditCardClientCredentials creditCardClientCredentials; - - public CreditCardClientCredentialsSecurityTokenManager(CreditCardClientCredentials creditCardClientCredentials) - : base (creditCardClientCredentials) - { - this.creditCardClientCredentials = creditCardClientCredentials; - } - - public override SecurityTokenProvider CreateSecurityTokenProvider(SecurityTokenRequirement tokenRequirement) - { - // Handle this token for Custom. - if (tokenRequirement.TokenType == Constants.CreditCardTokenType) - return new CreditCardTokenProvider(this.creditCardClientCredentials.CreditCardInfo); - // Return server cert. - else if (tokenRequirement is InitiatorServiceModelSecurityTokenRequirement) - { - if (tokenRequirement.TokenType == SecurityTokenTypes.X509Certificate) - { - return new X509SecurityTokenProvider(creditCardClientCredentials.ServiceCertificate.DefaultCertificate); - } - } - - return base.CreateSecurityTokenProvider(tokenRequirement); - } - - public override SecurityTokenSerializer CreateSecurityTokenSerializer(SecurityTokenVersion version) - { - - return new CreditCardSecurityTokenSerializer(version); - } - - } - - class CreditCardTokenProvider : SecurityTokenProvider - { - CreditCardInfo creditCardInfo; - - public CreditCardTokenProvider(CreditCardInfo creditCardInfo) : base() - { - if (creditCardInfo == null) - throw new ArgumentNullException(nameof(creditCardInfo)); - - this.creditCardInfo = creditCardInfo; - } - - protected override SecurityToken GetTokenCore(TimeSpan timeout) - { - SecurityToken result = new CreditCardToken(this.creditCardInfo); - return result; - } - } - - public class CreditCardServiceCredentials : ServiceCredentials - { - string creditCardFile; - - public CreditCardServiceCredentials(string creditCardFile) - : base() - { - if (creditCardFile == null) - throw new ArgumentNullException(nameof(creditCardFile)); - - this.creditCardFile = creditCardFile; - } - - public string CreditCardDataFile - { - get { return this.creditCardFile; } - } - - protected override ServiceCredentials CloneCore() - { - return new CreditCardServiceCredentials(this.creditCardFile); - } - - public override SecurityTokenManager CreateSecurityTokenManager() - { - return new CreditCardServiceCredentialsSecurityTokenManager(this); - } - } - - public class CreditCardServiceCredentialsSecurityTokenManager : ServiceCredentialsSecurityTokenManager - { - CreditCardServiceCredentials creditCardServiceCredentials; - - public CreditCardServiceCredentialsSecurityTokenManager(CreditCardServiceCredentials creditCardServiceCredentials) - : base(creditCardServiceCredentials) - { - this.creditCardServiceCredentials = creditCardServiceCredentials; - } - - public override SecurityTokenAuthenticator CreateSecurityTokenAuthenticator(SecurityTokenRequirement tokenRequirement, out SecurityTokenResolver outOfBandTokenResolver) - { - if (tokenRequirement.TokenType == Constants.CreditCardTokenType) - { - outOfBandTokenResolver = null; - return new CreditCardTokenAuthenticator(creditCardServiceCredentials.CreditCardDataFile); - } - - return base.CreateSecurityTokenAuthenticator(tokenRequirement, out outOfBandTokenResolver); - } - - public override SecurityTokenSerializer CreateSecurityTokenSerializer(SecurityTokenVersion version) - { - return new CreditCardSecurityTokenSerializer(version); - } - } - - class CreditCardTokenAuthenticator : SecurityTokenAuthenticator - { - string creditCardsFile; - public CreditCardTokenAuthenticator(string creditCardsFile) - { - this.creditCardsFile = creditCardsFile; - } - - protected override bool CanValidateTokenCore(SecurityToken token) - { - return (token is CreditCardToken); - } - - protected override ReadOnlyCollection ValidateTokenCore(SecurityToken token) - { - CreditCardToken creditCardToken = token as CreditCardToken; - - if (creditCardToken.CardInfo.ExpirationDate < DateTime.UtcNow) - throw new SecurityTokenValidationException("The credit card has expired."); - if (!IsCardNumberAndExpirationValid(creditCardToken.CardInfo)) - throw new SecurityTokenValidationException("Unknown or invalid credit card."); - - // the credit card token has only 1 claim - the card number. The issuer for the claim is the - // credit card issuer - - var cardIssuerClaimSet = new DefaultClaimSet(new Claim(ClaimTypes.Name, creditCardToken.CardInfo.CardIssuer, Rights.PossessProperty)); - var cardClaimSet = new DefaultClaimSet(cardIssuerClaimSet, new Claim(Constants.CreditCardNumberClaim, creditCardToken.CardInfo.CardNumber, Rights.PossessProperty)); - var policies = new List(1); - policies.Add(new CreditCardTokenAuthorizationPolicy(cardClaimSet)); - return policies.AsReadOnly(); - } - - /// - /// Helper method to check if a given credit card entry is present in the User DB - /// - private bool IsCardNumberAndExpirationValid(CreditCardInfo cardInfo) - { - try - { - using (var myStreamReader = new StreamReader(this.creditCardsFile)) - { - string line = ""; - while ((line = myStreamReader.ReadLine()) != null) - { - string[] splitEntry = line.Split('#'); - if (splitEntry[0] == cardInfo.CardNumber) - { - string expirationDateString = splitEntry[1].Trim(); - DateTime expirationDateOnFile = DateTime.Parse(expirationDateString, System.Globalization.DateTimeFormatInfo.InvariantInfo, System.Globalization.DateTimeStyles.AdjustToUniversal); - if (cardInfo.ExpirationDate == expirationDateOnFile) - { - string issuer = splitEntry[2]; - return issuer.Equals(cardInfo.CardIssuer, StringComparison.InvariantCultureIgnoreCase); - } - else - { - return false; - } - } - } - return false; - } - } - catch (Exception e) - { - throw new Exception("BookStoreService: Error while retrieving credit card information from User DB " + e.ToString()); - } - } - } - - public class CreditCardTokenAuthorizationPolicy : IAuthorizationPolicy - { - string id; - ClaimSet issuer; - IEnumerable issuedClaimSets; - - public CreditCardTokenAuthorizationPolicy(ClaimSet issuedClaims) - { - if (issuedClaims == null) - throw new ArgumentNullException(nameof(issuedClaims)); - this.issuer = issuedClaims.Issuer; - this.issuedClaimSets = new ClaimSet[] { issuedClaims }; - this.id = Guid.NewGuid().ToString(); - } - - public ClaimSet Issuer { get { return this.issuer; } } - - public string Id { get { return this.id; } } - - public bool Evaluate(EvaluationContext context, ref object state) - { - foreach (ClaimSet issuance in this.issuedClaimSets) - { - context.AddClaimSet(this, issuance); - } - - return true; - } - } -``` - -## Displaying the Callers' Information - - To display the caller's information, use the `ServiceSecurityContext.Current.AuthorizationContext.ClaimSets` as shown in the following sample code. The `ServiceSecurityContext.Current.AuthorizationContext.ClaimSets` contains authorization claims associated with the current caller. The claims are supplied by the `CreditCardToken` class in its `AuthorizationPolicies` collection. - -```csharp -bool TryGetStringClaimValue(ClaimSet claimSet, string claimType, out string claimValue) -{ - claimValue = null; - IEnumerable matchingClaims = claimSet.FindClaims(claimType, Rights.PossessProperty); - if (matchingClaims == null) - return false; - IEnumerator enumerator = matchingClaims.GetEnumerator(); - enumerator.MoveNext(); - claimValue = (enumerator.Current.Resource == null) ? null : - enumerator.Current.Resource.ToString(); - return true; -} - -string GetCallerCreditCardNumber() -{ - foreach (ClaimSet claimSet in - ServiceSecurityContext.Current.AuthorizationContext.ClaimSets) - { - string creditCardNumber = null; - if (TryGetStringClaimValue(claimSet, - Constants.CreditCardNumberClaim, out creditCardNumber)) - { - string issuer; - if (!TryGetStringClaimValue(claimSet.Issuer, - ClaimTypes.Name, out issuer)) - { - issuer = "Unknown"; - } - return $"Credit card '{creditCardNumber}' issued by '{issuer}'"; - } - } - return "Credit card is not known"; -} -``` - - When you run the sample, the operation requests and responses are displayed in the client console window. Press ENTER in the client window to shut down the client. - -## Setup Batch File - - The Setup.bat batch file included with this sample allows you to configure the server with relevant certificates to run the IIS-hosted application that requires server certificate-based security. This batch file must be modified to work across computers or to work in a non-hosted case. - - The following provides a brief overview of the different sections of the batch files so that they can be modified to run in the appropriate configuration. - -- Creating the server certificate: - - The following lines from the `Setup.bat` batch file create the server certificate to be used. The `%SERVER_NAME%` variable specifies the server name. Change this variable to specify your own server name. The default in this batch file is localhost. If you change the `%SERVER_NAME%` variable, you must go through the Client.cs and Service.cs files and replace all instances of localhost with the server name that you use in the Setup.bat script. - - The certificate is stored in My (Personal) store under the `LocalMachine` store location. The certificate is stored in the LocalMachine store for the IIS-hosted services. For self-hosted services, you should modify the batch file to store the client certificate in the CurrentUser store location by replacing the string LocalMachine with CurrentUser. - - ```bat - echo ************ - echo Server cert setup starting - echo %SERVER_NAME% - echo ************ - echo making server cert - echo ************ - makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe - ``` - -- Installing the server certificate into client's trusted certificate store: - - The following lines in the Setup.bat batch file copy the server certificate into the client trusted people store. This step is required because certificates generated by Makecert.exe are not implicitly trusted by the client system. If you already have a certificate that is rooted in a client trusted root certificate—for example, a Microsoft issued certificate—this step of populating the client certificate store with the server certificate is not required. - - ```bat - echo ************ - echo copying server cert to client's TrustedPeople store - echo ************ - certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople - ``` - -- To enable access to the certificate private key from the IIS-hosted service, the user account under which the IIS-hosted process is running must be granted appropriate permissions for the private key. This is accomplished by last steps in the Setup.bat script. - - ```bat - echo ************ - echo setting privileges on server certificates - echo ************ - for /F "delims=" %%i in ('"%ProgramFiles%\ServiceModelSampleTools\FindPrivateKey.exe" My LocalMachine -n CN^=%SERVER_NAME% -a') do set PRIVATE_KEY_FILE=%%i - set WP_ACCOUNT=NT AUTHORITY\NETWORK SERVICE - (ver | findstr /C:"5.1") && set WP_ACCOUNT=%COMPUTERNAME%\ASPNET - echo Y|cacls.exe "%PRIVATE_KEY_FILE%" /E /G "%WP_ACCOUNT%":R - iisreset - ``` - -> [!NOTE] -> The Setup.bat batch file is designed to be run from a Visual Studio 2012 Command Prompt. The PATH environment variable set within the Visual Studio 2012 Command Prompt points to the directory that contains executables required by the Setup.bat script. - -#### To set up and build the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -#### To run the sample on the same computer - -1. Open a Visual Studio 2012 Command Prompt window with administrator privileges and run Setup.bat from the sample install folder. This installs all the certificates required for running the sample.Make sure that the path includes the folder where Makecert.exe is located. - -> [!NOTE] -> Be sure to remove the certificates by running Cleanup.bat when finished with the sample. Other security samples use the same certificates. - -1. Launch Client.exe from client\bin directory. Client activity is displayed on the client console application. - -2. If the client and service are not able to communicate, see [Troubleshooting Tips for WCF Samples](/previous-versions/dotnet/netframework-3.5/ms751511(v=vs.90)). - -#### To run the sample across computer - -1. Create a directory on the service computer for the service binaries. - -2. Copy the service program files into the service directory on the service computer. Do not forget to copy CreditCardFile.txt; otherwise the credit card authenticator cannot validate credit card information sent from the client. Also copy the Setup.bat and Cleanup.bat files to the service computer. - -3. You must have a server certificate with the subject name that contains the fully-qualified domain name of the computer. You can create one using the Setup.bat if you change the `%SERVER_NAME%` variable to fully-qualified name of the computer where the service is hosted. Note that the Setup.bat file must be run in a Developer Command Prompt for Visual Studio opened with administrator privileges. - -4. Copy the server certificate into the CurrentUser-TrustedPeople store on the client. You must do this only if the server certificate is not issued by a trusted issuer. - -5. In the EchoServiceHost.cs file, change the value of the certificate subject name to specify a fully-qualified computer name instead of localhost. - -6. Copy the client program files from the \client\bin\ folder, under the language-specific folder, to the client computer. - -7. In the Client.cs file, change the address value of the endpoint to match the new address of your service. - -8. In the Client.cs file change the subject name of the service X.509 certificate to match the fully-qualified computer name of the remote host instead of localhost. - -9. On the client computer, launch Client.exe from a command prompt window. - -10. If the client and service are not able to communicate, see [Troubleshooting Tips for WCF Samples](/previous-versions/dotnet/netframework-3.5/ms751511(v=vs.90)). - -#### To clean up after the sample - -1. Run Cleanup.bat in the samples folder once you have finished running the sample. diff --git a/docs/framework/wcf/samples/custom-wsdl-publication.md b/docs/framework/wcf/samples/custom-wsdl-publication.md deleted file mode 100644 index bbfbd8cd33d71..0000000000000 --- a/docs/framework/wcf/samples/custom-wsdl-publication.md +++ /dev/null @@ -1,308 +0,0 @@ ---- -description: "Learn more about: Custom WSDL Publication" -title: "Custom WSDL Publication" -ms.date: "03/30/2017" -ms.assetid: 3b3e8103-2c95-4db3-a05b-46aa8e9d4d29 ---- -# Custom WSDL Publication - -This sample demonstrates how to: - -- Implement a on a custom attribute to export attribute properties as WSDL annotations. - -- Implement to import the custom WSDL annotations. - -- Implement and on a custom contract behavior and a custom operation behavior, respectively, to write imported annotations as comments in the CodeDom for the imported contract and operation. - -- Use the to download the WSDL, a to import the WSDL using the custom WSDL importer, and the to generate Windows Communication Foundation (WCF) client code with the WSDL annotations as /// and ''' comments in C# and Visual Basic. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - -## Service - - The service in this sample is marked with two custom attributes. The first, the `WsdlDocumentationAttribute`, accepts a string in the constructor and can be applied to provide a contract interface or operation with a string that describes its usage. The second, `WsdlParamOrReturnDocumentationAttribute`, can be applied to return values or parameters to describe those values in the operation. The following example shows a service contract, `ICalculator`, described using these attributes. - -```csharp -// Define a service contract. -[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")] -// Document it. -[WsdlDocumentation("The ICalculator contract performs basic calculation services.")] -public interface ICalculator -{ - [OperationContract] - [WsdlDocumentation("The Add operation adds two numbers and returns the result.")] - [return:WsdlParamOrReturnDocumentation("The result of adding the two arguments together.")] - double Add( - [WsdlParamOrReturnDocumentation("The first value to add.")]double n1, - [WsdlParamOrReturnDocumentation("The second value to add.")]double n2 - ); - - [OperationContract] - [WsdlDocumentation("The Subtract operation subtracts the second argument from the first.")] - [return:WsdlParamOrReturnDocumentation("The result of the second argument subtracted from the first.")] - double Subtract( - [WsdlParamOrReturnDocumentation("The value from which the second is subtracted.")]double n1, - [WsdlParamOrReturnDocumentation("The value that is subtracted from the first.")]double n2 - ); - - [OperationContract] - [WsdlDocumentation("The Multiply operation multiplies two values.")] - [return:WsdlParamOrReturnDocumentation("The result of multiplying the first and second arguments.")] - double Multiply( - [WsdlParamOrReturnDocumentation("The first value to multiply.")]double n1, - [WsdlParamOrReturnDocumentation("The second value to multiply.")]double n2 - ); - - [OperationContract] - [WsdlDocumentation("The Divide operation returns the value of the first argument divided by the second argument.")] - [return:WsdlParamOrReturnDocumentation("The result of dividing the first argument by the second.")] - double Divide( - [WsdlParamOrReturnDocumentation("The numerator.")]double n1, - [WsdlParamOrReturnDocumentation("The denominator.")]double n2 - ); -} -``` - - The `WsdlDocumentationAttribute` implements and , so the attribute instances are added to the corresponding or when the service is opened. The attribute also implements . When is called, the that is used to export the metadata and the that contains the service description objects are passed in as parameters enabling the modification of the exported metadata. - - In this sample, depending upon whether the export context object has a or an , a comment is extracted from the attribute using the text property and is added to the WSDL annotation element as shown in the following code. - -```csharp -public void ExportContract(WsdlExporter exporter, WsdlContractConversionContext context) -{ - if (contractDescription != null) - { - // Inside this block it is the contract-level comment attribute. - // This.Text returns the string for the contract attribute. - // Set the doc element; if this isn't done first, there is no XmlElement in the - // DocumentElement property. - context.WsdlPortType.Documentation = string.Empty; - // Contract comments. - XmlDocument owner = context.WsdlPortType.DocumentationElement.OwnerDocument; - XmlElement summaryElement = owner.CreateElement("summary"); - summaryElement.InnerText = this.Text; - context.WsdlPortType.DocumentationElement.AppendChild(summaryElement); - } - else - { - Operation operation = context.GetOperation(operationDescription); - if (operation != null) - { - // We are dealing strictly with the operation here. - // This.Text returns the string for the operation-level attributes. - // Set the doc element; if this isn't done first, there is no XmlElement in the - // DocumentElement property. - operation.Documentation = String.Empty; - - // Operation C# triple comments. - XmlDocument owner = operation.DocumentationElement.OwnerDocument; - XmlElement newSummaryElement = owner.CreateElement("summary"); - newSummaryElement.InnerText = this.Text; - operation.DocumentationElement.AppendChild(newSummaryElement); - } - } -} -``` - - If an operation is being exported, the sample uses reflection to obtain any `WsdlParamOrReturnDocumentationAttribute` values for parameters and return values and adds them to the WSDL annotation elements for that operation as follows. - -```csharp -// Get returns information -ParameterInfo returnValue = operationDescription.SyncMethod.ReturnParameter; -object[] returnAttrs = returnValue.GetCustomAttributes(typeof(WsdlParamOrReturnDocumentationAttribute), false); -if (returnAttrs.Length != 0) -{ - // text. - XmlElement returnsElement = owner.CreateElement("returns"); - returnsElement.InnerText = ((WsdlParamOrReturnDocumentationAttribute)returnAttrs[0]).ParamComment; - operation.DocumentationElement.AppendChild(returnsElement); -} - -// Get parameter information. -ParameterInfo[] args = operationDescription.SyncMethod.GetParameters(); -for (int i = 0; i < args.Length; i++) -{ - object[] docAttrs = args[i].GetCustomAttributes(typeof(WsdlParamOrReturnDocumentationAttribute), false); - if (docAttrs.Length == 1) - { - // Text. - XmlElement newParamElement = owner.CreateElement("param"); - XmlAttribute paramName = owner.CreateAttribute("name"); - paramName.Value = args[i].Name; - newParamElement.InnerText = ((WsdlParamOrReturnDocumentationAttribute)docAttrs[0]).ParamComment; - newParamElement.Attributes.Append(paramName); - operation.DocumentationElement.AppendChild(newParamElement); - } -} -``` - - The sample then publishes metadata in the standard way, using the following configuration file. - -```xml - - - - - - - - - - - - - - - - - - -``` - -## Svcutil client - - This sample does not use Svcutil.exe. The contract is provided in the generatedClient.cs file so that after the sample demonstrates custom WSDL import and code generation, the service can be invoked. To use the following custom WSDL importer for this example, you can run Svcutil.exe and specify the `/svcutilConfig` option, giving the path to the client configuration file used in this sample, which references the `WsdlDocumentation.dll` library. To load the `WsdlDocumentationImporter`, however, Svuctil.exe must be able to locate and load the `WsdlDocumentation.dll` library, which means either that it is registered in the global assembly cache, in the path, or is in the same directory as Svcutil.exe. For a basic sample such as this, the easiest thing to do is to copy Svcutil.exe and the client configuration file into the same directory as `WsdlDocumentation.dll` and run it from there. - -## The Custom WSDL Importer - - The custom object `WsdlDocumentationImporter` also implements and to be added to the imported ServiceEndpoints and and to be invoked to modify the code generation when the contract or operation code is being created. - - First, in the method, the sample determines whether the WSDL annotation is at the contract or operation level, and adds itself as a behavior at the appropriate scope, passing the imported annotation text to its constructor. - -```csharp -public void ImportContract(WsdlImporter importer, WsdlContractConversionContext context) -{ - // Contract Documentation - if (context.WsdlPortType.Documentation != null) - { - // System examines the contract behaviors to see whether any implement IWsdlImportExtension. - context.Contract.Behaviors.Add(new WsdlDocumentationImporter(context.WsdlPortType.Documentation)); - } - // Operation Documentation - foreach (Operation operation in context.WsdlPortType.Operations) - { - if (operation.Documentation != null) - { - OperationDescription operationDescription = context.Contract.Operations.Find(operation.Name); - if (operationDescription != null) - { - // System examines the operation behaviors to see whether any implement IWsdlImportExtension. - operationDescription.Behaviors.Add(new WsdlDocumentationImporter(operation.Documentation)); - } - } - } -} -``` - - Then, when the code is generated, the system invokes the and methods, passing the appropriate context information. The sample formats the custom WSDL annotations and inserts them as comments into the CodeDom. - -```csharp -public void GenerateContract(ServiceContractGenerationContext context) -{ - Debug.WriteLine("In generate contract."); - context.ContractType.Comments.AddRange(FormatComments(text)); -} - -public void GenerateOperation(OperationContractGenerationContext context) -{ - context.SyncMethod.Comments.AddRange(FormatComments(text)); - Debug.WriteLine("In generate operation."); -} -``` - -## The Client Application - - The client application loads the custom WSDL importer by specifying it in the application configuration file. - -```xml - - - - - - - - -``` - - Once the custom importer has been specified, the WCF metadata system loads the custom importer into any created for that purpose. This sample uses the to download the metadata, the properly configured to import the metadata using the custom importer the sample creates, and the to compile the modified contract information into both Visual Basic and C# client code that can be used in Visual Studio to support Intellisense or compiled into XML documentation. - -```csharp -/// From WSDL Documentation: -/// -/// The ICalculator contract performs basic calculation -/// services. -/// -[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] -[System.ServiceModel.ServiceContractAttribute(Namespace="http://Microsoft.ServiceModel.Samples", ConfigurationName="ICalculator")] -public interface ICalculator -{ - - /// From WSDL Documentation: - /// - /// The Add operation adds two numbers and returns the - /// result.The result of adding the two arguments - /// together.The first value to add.The second value to add. - /// - [System.ServiceModel.OperationContractAttribute(Action="http://Microsoft.ServiceModel.Samples/ICalculator/Add", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/AddResponse")] - double Add(double n1, double n2); - - /// From WSDL Documentation: - /// - /// The Subtract operation subtracts the second argument from the - /// first.The result of the second argument subtracted from the - /// first.The value from which the second is - /// subtracted.The value that is subtracted from the - /// first. - /// - [System.ServiceModel.OperationContractAttribute(Action="http://Microsoft.ServiceModel.Samples/ICalculator/Subtract", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/SubtractResponse")] - double Subtract(double n1, double n2); - - /// From WSDL Documentation: - /// - /// The Multiply operation multiplies two values.The - /// result of multiplying the first and second arguments.The first value to multiply.The second value - /// to multiply. - /// - [System.ServiceModel.OperationContractAttribute(Action="http://Microsoft.ServiceModel.Samples/ICalculator/Multiply", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/MultiplyResponse")] - double Multiply(double n1, double n2); - - /// From WSDL Documentation: - /// - /// The Divide operation returns the value of the first argument divided - /// by the second argument.The result of dividing the first - /// argument by the second.The numerator.The denominator. - /// - [System.ServiceModel.OperationContractAttribute(Action="http://Microsoft.ServiceModel.Samples/ICalculator/Divide", ReplyAction="http://Microsoft.ServiceModel.Samples/ICalculator/DivideResponse")] - double Divide(double n1, double n2); -} -``` - -#### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Extensibility\Metadata\WsdlDocumentation` diff --git a/docs/framework/wcf/samples/customchannelstester.md b/docs/framework/wcf/samples/customchannelstester.md deleted file mode 100644 index 878adbb23ae5b..0000000000000 --- a/docs/framework/wcf/samples/customchannelstester.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -description: "Learn more about: CustomChannelsTester" -title: "CustomChannelsTester" -ms.date: "03/30/2017" -ms.assetid: ee1fa307-98b1-4647-8860-2e9217ba6082 ---- -# CustomChannelsTester - -The `CustomChannelsTester` is a tool that you can use to test your custom channel implementations against a set of predefined service contracts. You can select the set of service contracts and pass it to the tool using an XML file. The tool then generates the service and client that exercises your custom channel implementations during message exchange. - -### To build the tool - -1. To build the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -2. Building the solution generates three files: CustomChannelsTester.exe, TestSpec.xml and SampleRun.cmd. The file SampleRun.cmd has a sample command line that shows how to use this tool to test the [Transport: UDP](transport-udp.md) sample. - -### To run the tool - -- At the command prompt type the following command: - - ```console - CustomChannelsTester.exe /binding:YourCustomBindngName /dll:TheAssemblyWhereThisTypeisDefined /testspec:XmlFileNameWhichContainsTestOptions - ``` - - Using the `/binding` option is required. - - `/dll` is required if "binding" is not a system-provided binding provided by Windows Communication Foundation (WCF). - - `/testspec` is optional. - - This creates server and clients based on the test specifications and the binding. - - Executes the client and server and returns the results. - - The following is the sample XML for the description of the test specifications (testspec.xml): - - ```xml - - - true - - false - - true - - true - - - - ReplaceThisWithTheServerMachineName - - 8000 - - - - 300 - - 60 - - 1 - - 1 - - - ``` diff --git a/docs/framework/wcf/samples/data-binding-in-a-windows-forms-client.md b/docs/framework/wcf/samples/data-binding-in-a-windows-forms-client.md deleted file mode 100644 index bbe1ea7b5f152..0000000000000 --- a/docs/framework/wcf/samples/data-binding-in-a-windows-forms-client.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -description: "Learn more about: Data Binding in a Windows Forms Client" -title: "Data Binding in a Windows Forms Client" -ms.date: "03/30/2017" -ms.assetid: a2a30b37-d6e2-4552-820e-e60b2bbe8829 ---- -# Data Binding in a Windows Forms Client - -This sample demonstrates how to bind to data returned by a Windows Communication Foundation (WCF) service in a Windows Forms application. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this article. - - This sample demonstrates a service that implements a contract that defines a request-reply communication pattern. The sample consists of a client Windows Forms application (.exe) and a WCF service hosted by Internet Information Services (IIS). - - The contract is defined by the `IWeatherService` interface, which exposes an operation named `GetWeatherData`. This operation accepts an array of cities and returns an array of `WeatherData` objects that represent the high and low forecasted temperature for a city. - - The data binding occurs on the client in the Windows Forms application. A `DataGridView` is defined in the Windows Forms designer, which is a graphical representation of the data. An intermediary named `BindingSource` is also created. The data source of `BindingSource` is set to the data array returned by the service. The purpose of the `BindingSource` is to provide a layer of indirection between the data and the data view. All interaction with the data, such as navigating, sorting, filtering, and updating, is accomplished with calls to the `BindingSource` component. To accomplish data binding to the `DataGridView`, the `datasource` of the `DataGridView` is then set to the `BindingSource` object. All of the data returned from the WCF service is then displayed graphically to the user. Every time the user clicks the button, the returned data is automatically updated in the data-bound `DataGridView`. - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Scenario\DataBinding\WindowsForms` diff --git a/docs/framework/wcf/samples/data-binding-in-a-wpf-client.md b/docs/framework/wcf/samples/data-binding-in-a-wpf-client.md deleted file mode 100644 index dd788ba5b24fc..0000000000000 --- a/docs/framework/wcf/samples/data-binding-in-a-wpf-client.md +++ /dev/null @@ -1,79 +0,0 @@ ---- -description: "Learn more about: Data Binding in a Windows Presentation Foundation Client" -title: "Data Binding in a Windows Presentation Foundation Client" -ms.date: "03/30/2017" -ms.assetid: bb8c8293-5973-4aef-9b07-afeff5d3293c ---- -# Data Binding in a Windows Presentation Foundation Client - -This sample demonstrates the use of data binding in a Windows Presentation Foundation (WPF) client. The sample uses a Windows Communication Foundation (WCF) service that randomly generates an array of albums to return to the client. Each album has a name, a price, and a list of album tracks. The album tracks have a name and duration. The information that is returned by the service is automatically bound to the user interface (UI) provided by the Windows Presentation Foundation (WPF) client. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - - Data binding allows a data source to be automatically bound to a UI. This simplifies the programming model because it does not require that you programmatically update each UI element with the data from a data object or an array of data objects. You can bind an object to a single UI element or an array to a control that takes multiple inputs, such as a `ListBox`. The following code shows how to bind data to the `DataContext` of a UI element. - -```csharp -// Event handler executed when call is complete -void client_GetAlbumListCompleted(object sender, GetAlbumListCompletedEventArgs e) -{ - // This is on the UI thread, myPanel can be accessed directly - myPanel.DataContext = e.Result; -} -``` - - In the previous sample, the `DataContext` for the `grid` layout element named `myPanel` is set to the data returned by the `GetAlbumList` method. The `DataContext` allows elements to inherit information from their parent elements about the data source that is used for binding, as well as other characteristics of the binding such as the path. The line of code must be executed every time the data on the server is updated. For example, it is executed when the window is initialized and when a new album is added. - - In the following sample XAML code, the `ListBox` specifies `ItemsSource="{Binding }"`. - -```xml - -``` - - This specifies that the data bound to the top-level UI element is also bound to this control (that is, the array of Albums). In addition, `ItemTemplate="{StaticResource AlbumStyle}"` specifies the data template to be used for each item in the `ListBox`. You can also define data templates to specify how the data should be formatted. These data templates can be reused for other UI elements in the application, the advantage is that the data template is defined and maintained in one place. - - The `AlbumStyle` data template lays out a grid with two `TextBlock`s side by side. One specifies the name of the Album and the other the number of Tracks in the album. - -```xaml - - - - - - - - - - -``` - - The following XAML code creates a second `ListBox`. - -```xaml - -``` - - The code specifies a path for the `ItemsSource`. This indicates that the data bound to this control is not the top-level data but a property of the top-level data named `Tracks`. This property represents the array of tracks contained within the album. In addition, a different `DataTemplate` named `TrackStyle` is specified. The layout of the `TrackStyle` template is similar to that of the `AlbumStyle` template, but the `TextBlock`s are bound to different properties. This is because the two templates are used with different data objects. - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Scenario\DataBinding\WPFDataBinding` diff --git a/docs/framework/wcf/samples/data-binding-in-an-aspnet-client.md b/docs/framework/wcf/samples/data-binding-in-an-aspnet-client.md deleted file mode 100644 index a2ca2d2840dc6..0000000000000 --- a/docs/framework/wcf/samples/data-binding-in-an-aspnet-client.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -description: "Learn more about: Data Binding in an ASP.NET Client" -title: "Data Binding in an ASP.NET Client" -ms.date: "03/30/2017" -ms.assetid: 68b49fa6-94e7-4d4c-a34e-902a2b3770b6 ---- -# Data Binding in an ASP.NET Client - -This sample demonstrates how to bind data returned by a typical Windows Communication Foundation (WCF) service in a Web Forms application. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - - This sample demonstrates a service that implements a contract that defines a request-reply communication pattern. The sample consists of a client Web Forms application accessible from a browser and a WCF service hosted by Internet Information Services (IIS). - - The service implements a contract that defines a request-reply communication pattern. The contract is defined by the `IWeatherService` interface, which exposes an operation named `GetWeatherData`. This operation accepts an array of cities and returns an array of `WeatherData` objects that represent the high and low forecasted temperature for a city. - - On the ASP.NET client .aspx page, a DataGrid Web control is defined, which contains the graphical representation of the data returned by the service. Code on the .aspx page calls the WCF service for weather data and returns the data to an array of `WeatherData` objects. The DataGrid specifies where to get its data from by setting its `DataSource` property to that array. The data binding occurs with a call to the DataGrid's `DataBind` method. All of this code is contained inside the .`aspx` page's `Page_Load` method, so every time the user refreshes the browser page, the data is updated in the DataGrid. - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. This sample's client is a Web site that runs under a development Web server. To launch the development Web server, type the following at the command prompt: `%SystemDrive%\Program Files\Common Files\Microsoft Shared\DevServer\9.0\WebDev.WebServer.EXE" /port:8000 /path:\CS\client /vpath:/client`. Then browse to `http://localhost:8000/client`. To run this sample across computers, replace all references to `localhost` in the client's Web.config file with the computer name of the server. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Scenario\DataBinding\WebForms` diff --git a/docs/framework/wcf/samples/data-binding-scenarios.md b/docs/framework/wcf/samples/data-binding-scenarios.md deleted file mode 100644 index 733414751b039..0000000000000 --- a/docs/framework/wcf/samples/data-binding-scenarios.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -description: "Learn more about: Data Binding Scenarios" -title: "Data Binding Scenarios" -ms.date: "03/30/2017" -ms.assetid: a2c10dc4-84af-4dab-baee-e9c84ca26ebf ---- -# Data Binding Scenarios - -This section contains samples that demonstrate Windows Communication Foundation (WCF) data binding scenarios. - -## In This Section - - [Data Binding in a Windows Forms Client](data-binding-in-a-windows-forms-client.md) - Demonstrates how to bind to data returned by a WCF service in a Windows Forms application. - - [Data Binding in an ASP.NET Client](data-binding-in-an-aspnet-client.md) - Demonstrates how to bind data returned by a typical WCF service in a Web Forms application. - - [Data Binding in a Windows Presentation Foundation Client](data-binding-in-a-wpf-client.md) - Demonstrates the use of data binding in a Windows Presentation Foundation (WPF) client. diff --git a/docs/framework/wcf/samples/data-contracts.md b/docs/framework/wcf/samples/data-contracts.md deleted file mode 100644 index 6a46a030b7041..0000000000000 --- a/docs/framework/wcf/samples/data-contracts.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -description: "Learn more about: Data Contracts" -title: "Data Contracts" -ms.date: "03/30/2017" -ms.assetid: 941049b6-8e98-497f-ab3f-19848241699f ---- -# Data Contracts - -This section contains samples that demonstrate data contracts in Windows Communication Foundation (WCF). - -## In This Section - - [Basic Data Contract](basic-data-contract.md) - Demonstrates how to implement a data contract. - - [DataContractSerializer Sample](datacontractserializer-sample.md) - Demonstrates the , which performs general serialization and deserialization services for the data contract classes. - - [Known Types](known-types.md) - Demonstrates how to specify information about derived types in a data contract. - - [Object References](object-references.md) - Demonstrates how to pass objects by references between server and client. - - [POCO Support](poco-support.md) - Demonstrates the serialization support for unmarked types; that is, types to which serialization attributes have not been applied, sometimes referred to as Plain Old CLR Object (POCO) types. - - [Usage of Serialization Binder](usage-of-serialization-binder.md) - This sample shows how to use the to change the version of a generic type when it is serialized. diff --git a/docs/framework/wcf/samples/datacontract-surrogate.md b/docs/framework/wcf/samples/datacontract-surrogate.md deleted file mode 100644 index 5bb8b8d4355b6..0000000000000 --- a/docs/framework/wcf/samples/datacontract-surrogate.md +++ /dev/null @@ -1,266 +0,0 @@ ---- -description: "Learn more about: DataContract Surrogate" -title: "DataContract Surrogate" -ms.date: "03/30/2017" -ms.assetid: b0188f3c-00a9-4cf0-a887-a2284c8fb014 ---- -# DataContract Surrogate - -This sample demonstrates how processes like serialization, deserialization, schema export, and schema import can be customized using a data contract surrogate class. This sample shows how to use a surrogate in a client and server scenario where data is serialized and transmitted between a Windows Communication Foundation (WCF) client and service. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - - The sample uses the following service contract: - -```csharp -[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")] -[AllowNonSerializableTypes] -public interface IPersonnelDataService -{ - [OperationContract] - void AddEmployee(Employee employee); - - [OperationContract] - Employee GetEmployee(string name); -} -``` - - The `AddEmployee` operation allows users to add data about new employees and the `GetEmployee` operation supports search for employees based on name. - - These operations use the following data type: - -```csharp -[DataContract(Namespace = "http://Microsoft.ServiceModel.Samples")] -class Employee -{ - [DataMember] - public DateTime dateHired; - - [DataMember] - public Decimal salary; - - [DataMember] - public Person person; -} -``` - - In the `Employee` type, the `Person` class (shown in the following sample code) cannot be serialized by the because it is not a valid data contract class. - -```csharp -public class Person -{ - public string firstName; - - public string lastName; - - public int age; - - public Person() { } -} -``` - - You can apply the attribute to the `Person` class, but this is not always possible. For example, the `Person` class can be defined in a separate assembly over which you have no control. - - Given this restriction, one way to serialize the `Person` class is to substitute it with another class that is marked with and copy over necessary data to the new class. The objective is to make the `Person` class appear as a DataContract to the . Note that this is one way to serialize non-data contract classes. - - The sample logically replaces the `Person` class with a different class named `PersonSurrogated`. - -```csharp -[DataContract(Name="Person", Namespace = "http://Microsoft.ServiceModel.Samples")] -public class PersonSurrogated -{ - [DataMember] - public string FirstName; - - [DataMember] - public string LastName; - - [DataMember] - public int Age; -} -``` - - The data contract surrogate is used to achieve this replacement. A data contract surrogate is a class that implements . In this sample, the `AllowNonSerializableTypesSurrogate` class implements this interface. - - In the interface implementation, the first task is to establish a type mapping from `Person` to `PersonSurrogated`. This is used both at serialization time as well as at schema export time. This mapping is achieved by implementing the method. - -```csharp -public Type GetDataContractType(Type type) -{ - if (typeof(Person).IsAssignableFrom(type)) - { - return typeof(PersonSurrogated); - } - return type; -} -``` - - The method maps a `Person` instance to a `PersonSurrogated` instance during serialization, as shown in the following sample code. - -```csharp -public object GetObjectToSerialize(object obj, Type targetType) -{ - if (obj is Person) - { - Person person = (Person)obj; - PersonSurrogated personSurrogated = new PersonSurrogated(); - personSurrogated.FirstName = person.firstName; - personSurrogated.LastName = person.lastName; - personSurrogated.Age = person.age; - return personSurrogated; - } - return obj; -} -``` - - The method provides the reverse mapping for deserialization, as shown in the following sample code. - -```csharp -public object GetDeserializedObject(object obj, -Type targetType) -{ - if (obj is PersonSurrogated) - { - PersonSurrogated personSurrogated = (PersonSurrogated)obj; - Person person = new Person(); - person.firstName = personSurrogated.FirstName; - person.lastName = personSurrogated.LastName; - person.age = personSurrogated.Age; - return person; - } - return obj; -} -``` - - To map the `PersonSurrogated` data contract to the existing `Person` class during schema import, the sample implements the method, as shown in the following sample code. - -```csharp -public Type GetReferencedTypeOnImport(string typeName, - string typeNamespace, object customData) -{ -if ( -typeNamespace.Equals("http://schemas.datacontract.org/2004/07/DCSurrogateSample") -) - { - if (typeName.Equals("PersonSurrogated")) - { - return typeof(Person); - } - } - return null; -} -``` - - The following sample code completes the implementation of the interface. - -```csharp -public System.CodeDom.CodeTypeDeclaration ProcessImportedType( - System.CodeDom.CodeTypeDeclaration typeDeclaration, - System.CodeDom.CodeCompileUnit compileUnit) -{ - return typeDeclaration; -} -public object GetCustomDataToExport(Type clrType, - Type dataContractType) -{ - return null; -} - -public object GetCustomDataToExport( -System.Reflection.MemberInfo memberInfo, Type dataContractType) -{ - return null; -} -public void GetKnownCustomDataTypes( - KnownTypeCollection customDataTypes) -{ - // It does not matter what we do here. - throw new NotImplementedException(); -} -``` - - In this sample, the surrogate is enabled in ServiceModel by an attribute called `AllowNonSerializableTypesAttribute`. Developers would need to apply this attribute on their service contract as shown on the `IPersonnelDataService` service contract above. This attribute implements `IContractBehavior` and sets up the surrogate on operations in its `ApplyClientBehavior` and `ApplyDispatchBehavior` methods. - - The attribute is not necessary in this case - it is used for demonstration purposes in this sample. Users can alternatively enable a surrogate by manually adding a similar `IContractBehavior`, `IEndpointBehavior` or `IOperationBehavior` using code or using configuration. - - The `IContractBehavior` implementation looks for operations that use DataContract by checking if they have a `DataContractSerializerOperationBehavior` registered. If they do, it sets the `DataContractSurrogate` property on that behavior. The following sample code shows how this is done. Setting the surrogate on this operation behavior enables it for serialization and deserialization. - -```csharp -public void ApplyClientBehavior(ContractDescription description, ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime proxy) -{ - foreach (OperationDescription opDesc in description.Operations) - { - ApplyDataContractSurrogate(opDesc); - } -} - -public void ApplyDispatchBehavior(ContractDescription description, ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.DispatchRuntime dispatch) -{ - foreach (OperationDescription opDesc in description.Operations) - { - ApplyDataContractSurrogate(opDesc); - } -} - -private static void ApplyDataContractSurrogate(OperationDescription description) -{ - DataContractSerializerOperationBehavior dcsOperationBehavior = description.Behaviors.Find(); - if (dcsOperationBehavior != null) - { - if (dcsOperationBehavior.DataContractSurrogate == null) - dcsOperationBehavior.DataContractSurrogate = new AllowNonSerializableTypesSurrogate(); - } -} -``` - - Additional steps need to be taken to plug in the surrogate for use during metadata generation. One mechanism to do this is to provide an `IWsdlExportExtension` which is what this sample demonstrates. Another way is to modify the `WsdlExporter` directly. - - The `AllowNonSerializableTypesAttribute` attribute implements `IWsdlExportExtension` and `IContractBehavior`. The extension can be either an `IContractBehavior` or `IEndpointBehavior` in this case. Its `IWsdlExportExtension.ExportContract` method implementation enables the surrogate by adding it to the `XsdDataContractExporter` used during schema generation for DataContract. The following code snippet shows how to do this. - -```csharp -public void ExportContract(WsdlExporter exporter, WsdlContractConversionContext context) -{ - if (exporter == null) - throw new ArgumentNullException("exporter"); - - object dataContractExporter; - XsdDataContractExporter xsdDCExporter; - if (!exporter.State.TryGetValue(typeof(XsdDataContractExporter), out dataContractExporter)) - { - xsdDCExporter = new XsdDataContractExporter(exporter.GeneratedXmlSchemas); - exporter.State.Add(typeof(XsdDataContractExporter), xsdDCExporter); - } - else - { - xsdDCExporter = (XsdDataContractExporter)dataContractExporter; - } - if (xsdDCExporter.Options == null) - xsdDCExporter.Options = new ExportOptions(); - - if (xsdDCExporter.Options.DataContractSurrogate == null) - xsdDCExporter.Options.DataContractSurrogate = new AllowNonSerializableTypesSurrogate(); -} -``` - - When you run the sample, the client calls AddEmployee followed by a GetEmployee call to check if the first call was successful. The result of the GetEmployee operation request is displayed in the client console window. The GetEmployee operation must succeed in finding the employee and print "found". - -> [!NOTE] -> This sample shows how to plug in a surrogate for serialize, deserialize and metadata generation. It does not show how to plug in a surrogate for code generation from metadata. To see a sample of how a surrogate can be used to plug into client code generation, see the [Custom WSDL Publication](custom-wsdl-publication.md) sample. - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Extensibility\DataContract` diff --git a/docs/framework/wcf/samples/datacontractresolver.md b/docs/framework/wcf/samples/datacontractresolver.md deleted file mode 100644 index bd5aab3d4f27b..0000000000000 --- a/docs/framework/wcf/samples/datacontractresolver.md +++ /dev/null @@ -1,167 +0,0 @@ ---- -description: "Learn more about: DataContractResolver" -title: "DataContractResolver" -ms.date: "03/30/2017" -ms.assetid: 6c200c02-bc14-4b8d-bbab-9da31185b805 ---- -# DataContractResolver - -This sample demonstrates how the serialization and deserialization processes can be customized by using the class. This sample shows how to use a DataContractResolver to map CLR types to and from an xsi:type representation during serialization and deserialization. - -## Sample Details - - The sample defines the following CLR types. - -```csharp -using System; -using System.Runtime.Serialization; - -namespace Types -{ - [DataContract] - public class Customer - { - [DataMember] - public string Name { get; set; } - } - - [DataContract] - public class VIPCustomer : Customer - { - [DataMember] - public string VipInfo { get; set; } - } - - [DataContract] - public class RegularCustomer : Customer - { - } - - [DataContract] - public class PreferredVIPCustomer : VIPCustomer - { - } -} -``` - - The sample loads the assembly, extracts each of these types, and then serializes and deserializes them. The is plugged into the serialization process by passing an instance of the -derived class to the constructor, as shown in the following example. - -```csharp -this.serializer = new DataContractSerializer(typeof(Object), null, int.MaxValue, false, true, null, new MyDataContractResolver(assembly)); -``` - - The sample then serializes the CLR types as shown in the following code example. - -```csharp -Assembly assembly = Assembly.Load(new AssemblyName("Types")); - -public void serialize(Type type) -{ - Object instance = Activator.CreateInstance(type); - - Console.WriteLine("----------------------------------------"); - Console.WriteLine(); - Console.WriteLine("Serializing type: {0}", type.Name); - Console.WriteLine(); - this.buffer = new StringBuilder(); - using (XmlWriter xmlWriter = XmlWriter.Create(this.buffer)) - { - try - { - this.serializer.WriteObject(xmlWriter, instance); - } - catch (SerializationException error) - { - Console.WriteLine(error.ToString()); - } - } - Console.WriteLine(this.buffer.ToString()); -} -``` - - The sample then deserializes the xsi:types as shown in the following code example. - -```csharp -public void deserialize(Type type) -{ - Console.WriteLine(); - Console.WriteLine("Deserializing type: {0}", type.Name); - Console.WriteLine(); - using (XmlReader xmlReader = XmlReader.Create(new StringReader(this.buffer.ToString()))) - { - Object obj = this.serializer.ReadObject(xmlReader); - } -} -``` - - Since the custom is passed in to the constructor, the is called during serialization to map a CLR type to an equivalent `xsi:type`. Similarly the is called during deserialization to map the `xsi:type` to an equivalent CLR type. In this sample, the is defined as shown in the following example. - - The following code example is a class deriving from . - -```csharp -class MyDataContractResolver : DataContractResolver -{ - private Dictionary dictionary = new Dictionary(); - Assembly assembly; - - public MyDataContractResolver(Assembly assembly) - { - this.assembly = assembly; - } - - // Used at deserialization - // Allows users to map xsi:type name to any Type - public override Type ResolveName(string typeName, string typeNamespace, DataContractResolver knownTypeResolver) - { - XmlDictionaryString tName; - XmlDictionaryString tNamespace; - if (dictionary.TryGetValue(typeName, out tName) && dictionary.TryGetValue(typeNamespace, out tNamespace)) - { - return this.assembly.GetType(tNamespace.Value + "." + tName.Value); - } - else - { - return null; - } - } - - // Used at serialization - // Maps any Type to a new xsi:type representation - public override void ResolveType(Type dataContractType, DataContractResolver knownTypeResolver, out XmlDictionaryString typeName, out XmlDictionaryString typeNamespace) - { - string name = dataContractType.Name; - string namesp = dataContractType.Namespace; - typeName = new XmlDictionaryString(XmlDictionary.Empty, name, 0); - typeNamespace = new XmlDictionaryString(XmlDictionary.Empty, namesp, 0); - if (!dictionary.ContainsKey(dataContractType.Name)) - { - dictionary.Add(name, typeName); - } - if (!dictionary.ContainsKey(dataContractType.Namespace)) - { - dictionary.Add(namesp, typeNamespace); - } - } -} -``` - - As part of the sample, the Types project generates the assembly with all the types that are used in this sample. Use this project to add, remove or modify the types that will be serialized. - -#### To use this sample - -1. Using Visual Studio 2012, open the DCRSample.sln solution file. - -2. To run the solution, press F5 - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Contract\Data\DataContractResolver` - -## See also - -- [Using a Data Contract Resolver](../feature-details/using-a-data-contract-resolver.md) diff --git a/docs/framework/wcf/samples/datacontractserializer-datacontractresolver-netdatacontractserializer.md b/docs/framework/wcf/samples/datacontractserializer-datacontractresolver-netdatacontractserializer.md deleted file mode 100644 index 09265448de941..0000000000000 --- a/docs/framework/wcf/samples/datacontractserializer-datacontractresolver-netdatacontractserializer.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -description: "Learn more about: Using DataContractSerializer and DataContractResolver to Provide the Functionality of NetDataContractSerializer" -title: "Using DataContractSerializer and DataContractResolver to Provide the Functionality of NetDataContractSerializer" -ms.date: "03/30/2017" -ms.assetid: 1376658f-f695-45f7-a7e0-94664e9619ff ---- -# Using DataContractSerializer and DataContractResolver to Provide the Functionality of NetDataContractSerializer - -This sample demonstrates how the use of with an appropriate provides the same functionality as . This sample shows how to create the appropriate and how to add it to the . - -## Sample details - - differs from in one important way: includes CLR type information in the serialized XML, whereas does not. Therefore, can be used only if both the serializing and deserializing ends share the same CLR types. However, it is recommended to use because its performance is better than . You can change the information that is serialized in by adding a to it. - - This sample consists of two projects. The first project uses to serialize an object. The second project uses with a to provide the same functionality as the first project. - - The following code example shows the implementation of a custom named `MyDataContractResolver` that is added to the in the DCSwithDCR project. - -```csharp -class MyDataContractResolver : DataContractResolver -{ - private XmlDictionary dictionary = new XmlDictionary(); - - public MyDataContractResolver() - { - } - - // Used at deserialization - // Allows users to map xsi:type name to any Type - public override Type ResolveName(string typeName, string typeNamespace, DataContractResolver knownTypeResolver) - { - Type type = knownTypeResolver.ResolveName(typeName, typeNamespace, null); - type ??= Type.GetType(typeName + ", " + typeNamespace); - return type; - } - - // Used at serialization - // Maps any Type to a new xsi:type representation - public override void ResolveType(Type dataContractType, DataContractResolver knownTypeResolver, out XmlDictionaryString typeName, out XmlDictionaryString typeNamespace) - { - knownTypeResolver.ResolveType(dataContractType, null, out typeName, out typeNamespace); - if (typeName == null || typeNamespace == null) - { - XmlDictionary dictionary = new XmlDictionary(); - typeName = dictionary.Add(dataContractType.FullName); - typeNamespace = dictionary.Add(dataContractType.Assembly.FullName); - } - } -} -``` - -#### To use this sample - -1. Using Visual Studio 2012, open the DCRSample.sln solution file. - -2. Right-click the solution file and choose **Properties**. - -3. In the **Solution Property Pages** dialog, under **Common Properties**, **Startup Project**, select **Multiple startup projects:**. - -4. Next to the **DCSwithDCR** project, select **Start** from the **Action** dropdown. - -5. Next to the **NetDCS** project, select **Start** from the **Action** dropdown. - -6. Click **OK** to close the dialog. - -7. To build the solution, press CTRL+SHIFT+B. - -8. To run the solution, press CTRL+F5. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Contract\Data\NetDcSasDcSwithDCR` diff --git a/docs/framework/wcf/samples/datacontractserializer-sample.md b/docs/framework/wcf/samples/datacontractserializer-sample.md deleted file mode 100644 index 5ff3bf689c584..0000000000000 --- a/docs/framework/wcf/samples/datacontractserializer-sample.md +++ /dev/null @@ -1,138 +0,0 @@ ---- -title: "DataContractSerializer Sample" -description: This sample demonstrates DataContractSerializer in WCF, which performs general serialization and deserialization services for the data contract classes. -ms.date: "03/30/2017" -helpviewer_keywords: - - "XML Formatter" -ms.assetid: e0a2fe89-3534-48c8-aa3c-819862224571 ---- -# DataContractSerializer Sample - -The DataContractSerializer sample demonstrates the , which performs general serialization and deserialization services for the data contract classes. The sample creates a `Record` object, serializes it to a memory stream and deserializes the memory stream back to another `Record` object to demonstrate the use of the . The sample then serializes the `Record` object using a binary writer to demonstrate how the writer affects serialization. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - - The data contract for `Record` is shown in the following sample code. - -```csharp -[DataContract(Namespace="http://Microsoft.ServiceModel.Samples")] -internal class Record -{ - private double n1; - private double n2; - private string operation; - private double result; - - internal Record(double n1, double n2, string operation, double result) - { - this.n1 = n1; - this.n2 = n2; - this.operation = operation; - this.result = result; - } - - [DataMember] - internal double OperandNumberOne - { - get { return n1; } - set { n1 = value; } - } - - [DataMember] - internal double OperandNumberTwo - { - get { return n2; } - set { n2 = value; } - } - - [DataMember] - internal string Operation - { - get { return operation; } - set { operation = value; } - } - - [DataMember] - internal double Result - { - get { return result; } - set { result = value; } - } - - public override string ToString() - { - return $"Record: {n1} {operation} {n2} = {result}"; - } -} -``` - - The sample code creates a `Record` object named `record1` then displays the object. - -```csharp -Record record1 = new Record(1, 2, "+", 3); -Console.WriteLine("Original record: {0}", record1.ToString()); -``` - - The sample then uses the to serialize `record1` into a memory stream. - -```csharp -MemoryStream stream1 = new MemoryStream(); - -//Serialize the Record object to a memory stream using DataContractSerializer. -DataContractSerializer serializer = new DataContractSerializer(typeof(Record)); -serializer.WriteObject(stream1, record1); -``` - - Next, the sample uses the to deserialize the memory stream back into a new `Record` object and displays it. - -```csharp -stream1.Position = 0; - -//Deserialize the Record object back into a new record object. -Record record2 = (Record)serializer.ReadObject(stream1); - -Console.WriteLine("Deserialized record: {0}", record2.ToString()); -``` - - By default, the `DataContractSerializer` encodes objects into a stream using a textual representation of XML. However, you can influence the encoding of the XML by passing in a different writer. The sample creates a binary writer by calling . It then passes the writer and the record object to the serializer when it calls . Finally, the sample flushes the writer and reports on the length of the streams. - -```csharp -MemoryStream stream2 = new MemoryStream(); - -XmlDictionaryWriter binaryDictionaryWriter = XmlDictionaryWriter.CreateBinaryWriter(stream2); -serializer.WriteObject(binaryDictionaryWriter, record1); -binaryDictionaryWriter.Flush(); - -//report the length of the streams -Console.WriteLine("Text Stream is {0} bytes long", stream1.Length); -Console.WriteLine("Binary Stream is {0} bytes long", stream2.Length); -``` - - When you run the sample, the original record and the deserialized record are displayed, followed by the comparison between the length of the text encoding and the binary encoding. Press ENTER in the client window to shut down the client. - -```console -Original record: Record: 1 + 2 = 3 -Deserialized record: Record: 1 + 2 = 3 -Text Stream is 233 bytes long -Binary Stream is 156 bytes long - -Press to terminate client. -``` - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample, start the client from the command prompt by typing client\bin\client.exe. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Contract\Data\DataContractSerializer` diff --git a/docs/framework/wcf/samples/dead-letter-queues.md b/docs/framework/wcf/samples/dead-letter-queues.md deleted file mode 100644 index d86a6526f0689..0000000000000 --- a/docs/framework/wcf/samples/dead-letter-queues.md +++ /dev/null @@ -1,359 +0,0 @@ ---- -description: "Learn more about: Dead Letter Queues" -title: "Dead Letter Queues" -ms.date: "03/30/2017" -ms.assetid: ff664f33-ad02-422c-9041-bab6d993f9cc ---- -# Dead Letter Queues - -This sample demonstrates how to handle and process messages that have failed delivery. It is based on the [Transacted MSMQ Binding](transacted-msmq-binding.md) sample. This sample uses the `netMsmqBinding` binding. The service is a self-hosted console application to enable you to observe the service receiving queued messages. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - -> [!NOTE] -> This sample demonstrates each application dead letter queue that is only available on Windows Vista. The sample can be modified to use the default system-wide queues for MSMQ 3.0 on Windows Server 2003 and Windows XP. - - In queued communication, the client communicates to the service using a queue. More precisely, the client sends messages to a queue. The service receives messages from the queue. The service and client therefore, do not have to be running at the same time to communicate using a queue. - - Because queued communication can involve a certain amount of dormancy, you may want to associate a time-to-live value on the message to ensure that the message does not get delivered to the application if it has gone past the time. There are also cases, where an application must be informed whether a message failed delivery. In all of these cases, such as when the time-to-live on the message has expired or the message failed delivery, the message is put in a dead letter queue. The sending application can then read the messages in the dead-letter queue and take corrective actions that range from no action to correcting the reasons for failed delivery and resending the message. - - The dead-letter queue in the `NetMsmqBinding` binding is expressed in the following properties: - -- property to express the kind of dead-letter queue required by the client. This enumeration has the following values: - -- `None`: No dead-letter queue is required by the client. - -- `System`: The system dead-letter queue is used to store dead messages. The system dead-letter queue is shared by all applications running on the computer. - -- `Custom`: A custom dead-letter queue specified using the property is used to store dead messages. This feature is only available on Windows Vista. This is used when the application must use its own dead letter queue instead of sharing it with other applications running on the same computer. - -- property to express the specific queue to use as a dead-letter queue. This is available only in Windows Vista. - - In this sample, the client sends a batch of messages to the service from within the scope of a transaction and specifies an arbitrarily low value for "time-to-live" for these messages (about 2 seconds). The client also specifies a custom dead-letter queue to use to enqueue the messages that have expired. - - The client application can read the messages in the dead-letter queue and either retry sending the message or correct the error that caused the original message to be placed in the dead-letter queue and send the message. In the sample, the client displays an error message. - - The service contract is `IOrderProcessor`, as shown in the following sample code. - -```csharp -[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")] -public interface IOrderProcessor -{ - [OperationContract(IsOneWay = true)] - void SubmitPurchaseOrder(PurchaseOrder po); -} -``` - - The service code in the sample is that of the [Transacted MSMQ Binding](transacted-msmq-binding.md). - - Communication with the service takes place within the scope of a transaction. The service reads messages from the queue, performs the operation and then displays the results of the operation. The application also creates a dead-letter queue for dead-letter messages. - -```csharp -//The service contract is defined in generatedClient.cs, generated from the service by the svcutil tool. - -//Client implementation code. -class Client -{ - static void Main() - { - // Get MSMQ queue name from app settings in configuration - string deadLetterQueueName = ConfigurationManager.AppSettings["deadLetterQueueName"]; - - // Create the transacted MSMQ queue for storing dead message if necessary. - if (!MessageQueue.Exists(deadLetterQueueName)) - MessageQueue.Create(deadLetterQueueName, true); - - // Create a proxy with given client endpoint configuration - OrderProcessorClient client = new OrderProcessorClient("OrderProcessorEndpoint"); - - // Create the purchase order - PurchaseOrder po = new PurchaseOrder(); - po.CustomerId = "somecustomer.com"; - po.PONumber = Guid.NewGuid().ToString(); - - PurchaseOrderLineItem lineItem1 = new PurchaseOrderLineItem(); - lineItem1.ProductId = "Blue Widget"; - lineItem1.Quantity = 54; - lineItem1.UnitCost = 29.99F; - - PurchaseOrderLineItem lineItem2 = new PurchaseOrderLineItem(); - lineItem2.ProductId = "Red Widget"; - lineItem2.Quantity = 890; - lineItem2.UnitCost = 45.89F; - - po.orderLineItems = new PurchaseOrderLineItem[2]; - po.orderLineItems[0] = lineItem1; - po.orderLineItems[1] = lineItem2; - - //Create a transaction scope. - using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required)) - { - // Make a queued call to submit the purchase order - client.SubmitPurchaseOrder(po); - // Complete the transaction. - scope.Complete(); - } - - client.Close(); - - Console.WriteLine(); - Console.WriteLine("Press to terminate client."); - Console.ReadLine(); - } -} -``` - - The client's configuration specifies a short duration for the message to reach the service. If the message cannot be transmitted within the duration specified, the message expires and is moved to the dead-letter queue. - -> [!NOTE] -> It is possible for the client to deliver the message to the service queue within the specified time. To ensure you see the dead-letter service in action, you should run the client before starting the service. The message times out and is delivered to the dead-letter service. - - The application must define which queue to use as its dead-letter queue. If no queue is specified, the default system-wide transactional dead-letter queue is used to queue dead messages. In this example, the client application specifies its own application dead-letter queue. - -```xml - - - - - - - - - - - - - - - - - - - - - -``` - - The dead-letter message service reads messages from the dead-letter queue. The dead-letter message service implements the `IOrderProcessor` contract. Its implementation however is not to process orders. The dead-letter message service is a client service and does not have the facility to process orders. - -> [!NOTE] -> The dead-letter queue is a client queue and is local to the client queue manager. - - The dead-letter message service implementation checks for the reason a message failed delivery and takes corrective measures. The reason for a message failure is captured in two enumerations, and . You can retrieve the from the as shown in the following sample code: - -```csharp -public void SubmitPurchaseOrder(PurchaseOrder po) -{ - Console.WriteLine("Submitting purchase order did not succeed ", po); - MsmqMessageProperty mqProp = - OperationContext.Current.IncomingMessageProperties[ - MsmqMessageProperty.Name] as MsmqMessageProperty; - Console.WriteLine("Message Delivery Status: {0} ", - mqProp.DeliveryStatus); - Console.WriteLine("Message Delivery Failure: {0}", - mqProp.DeliveryFailure); - Console.WriteLine(); - … -} -``` - - Messages in the dead-letter queue are messages that are addressed to the service that is processing the message. Therefore, when the dead-letter message service reads messages from the queue, the Windows Communication Foundation (WCF) channel layer finds the mismatch in endpoints and does not dispatch the message. In this case, the message is addressed to the order processing service but is received by the dead-letter message service. To receive a message that is addressed to a different endpoint, an address filter to match any address is specified in the `ServiceBehavior`. This is required to successfully process messages that are read from the dead-letter queue. - - In this sample, the dead-letter message service resends the message if the reason for failure is that the message timed out. For all other reasons, it displays the delivery failure, as shown in the following sample code: - -```csharp -// Service class that implements the service contract. -// Added code to write output to the console window. -[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single, ConcurrencyMode=ConcurrencyMode.Single, AddressFilterMode=AddressFilterMode.Any)] -public class PurchaseOrderDLQService : IOrderProcessor -{ - OrderProcessorClient orderProcessorService; - public PurchaseOrderDLQService() - { - orderProcessorService = new OrderProcessorClient("OrderProcessorEndpoint"); - } - - [OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)] - public void SubmitPurchaseOrder(PurchaseOrder po) - { - Console.WriteLine("Submitting purchase order did not succeed ", po); - MsmqMessageProperty mqProp = OperationContext.Current.IncomingMessageProperties[MsmqMessageProperty.Name] as MsmqMessageProperty; - - Console.WriteLine("Message Delivery Status: {0} ", mqProp.DeliveryStatus); - Console.WriteLine("Message Delivery Failure: {0}", mqProp.DeliveryFailure); - Console.WriteLine(); - - // resend the message if timed out - if (mqProp.DeliveryFailure == DeliveryFailure.ReachQueueTimeout || - mqProp.DeliveryFailure == DeliveryFailure.ReceiveTimeout) - { - // re-send - Console.WriteLine("Purchase order Time To Live expired"); - Console.WriteLine("Trying to resend the message"); - - // reuse the same transaction used to read the message from dlq to enqueue the message to app. queue - orderProcessorService.SubmitPurchaseOrder(po); - Console.WriteLine("Purchase order resent"); - } - } - - // Host the service within this EXE console application. - public static void Main() - { - // Create a ServiceHost for the PurchaseOrderDLQService type. - using (ServiceHost serviceHost = new ServiceHost(typeof(PurchaseOrderDLQService))) - { - // Open the ServiceHostBase to create listeners and start listening for messages. - serviceHost.Open(); - - // The service can now be accessed. - Console.WriteLine("The dead letter service is ready."); - Console.WriteLine("Press to terminate service."); - Console.WriteLine(); - Console.ReadLine(); - } - } -} -``` - - The following sample shows the configuration for a dead-letter message: - -```xml - - - - - - - - - - - - - - - - - - - - - - - -``` - - In running the sample, there are 3 executables to run to see how the dead-letter queue works for each application; the client, service and a dead-letter service that reads from the dead-letter queue for each application and resends the message to the service. All are console applications with output in console windows. - -> [!NOTE] -> Because queuing is in use, the client and service do not have to be up and running at the same time. You can run the client, shut it down, and then start up the service and it still receives its messages. You should start the service and shut it down so that the queue can be created. - - When running the client, the client displays the message: - -```console -Press to terminate client. -``` - - The client attempted to send the message but with a short timeout, the message expired and is now queued in the dead-letter queue for each application. - - You then run the dead-letter service, which reads the message and displays the error code and resends the message back to the service. - -```console -The dead letter service is ready. -Press to terminate service. - -Submitting purchase order did not succeed -Message Delivery Status: InDoubt -Message Delivery Failure: ReachQueueTimeout - -Purchase order Time To Live expired -Trying to resend the message -Purchase order resent -``` - - The service starts and then reads the resent message and processes it. - -```console -The service is ready. -Press to terminate service. - -Processing Purchase Order: 97897eff-f926-4057-a32b-af8fb11b9bf9 - Customer: somecustomer.com - OrderDetails - Order LineItem: 54 of Blue Widget @unit price: $29.99 - Order LineItem: 890 of Red Widget @unit price: $45.89 - Total cost of this order: $42461.56 - Order status: Pending -``` - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. If the service is run first, it will check to ensure that the queue is present. If the queue is not present, the service will create one. You can run the service first to create the queue, or you can create one via the MSMQ Queue Manager. Follow these steps to create a queue in Windows 2008. - - 1. Open Server Manager in Visual Studio 2012. - - 2. Expand the **Features** tab. - - 3. Right-click **Private Message Queues**, and select **New**, **Private Queue**. - - 4. Check the **Transactional** box. - - 5. Enter `ServiceModelSamplesTransacted` as the name of the new queue. - -3. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -4. To run the sample in a single- or cross-computer configuration change queue names appropriately, replacing localhost with full name of the computer and follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -### To run the sample on a computer joined to a workgroup - -1. If your computer is not part of a domain, turn off transport security by setting the authentication mode and protection level to `None` as shown in the following sample configuration: - - ```xml - - - - - - - - ``` - - Ensure the endpoint is associated with the binding by setting the endpoint's `bindingConfiguration` attribute. - -2. Ensure that you change the configuration on the DeadLetterService, server and the client before you run the sample. - - > [!NOTE] - > Setting `security mode` to `None` is equivalent to setting `MsmqAuthenticationMode`, `MsmqProtectionLevel` and `Message` security to `None`. - -## Comments - - By default with the `netMsmqBinding` binding transport, security is enabled. Two properties, `MsmqAuthenticationMode` and `MsmqProtectionLevel`, together determine the type of transport security. By default the authentication mode is set to `Windows` and the protection level is set to `Sign`. For MSMQ to provide the authentication and signing feature, it must be part of a domain. If you run this sample on a computer that is not part of a domain, you receive the following error: "User's internal message queuing certificate does not exist". - -> [!IMPORTANT] -> The samples may already be installed on your computer. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Binding\Net\MSMQ\DeadLetter` diff --git a/docs/framework/wcf/samples/default-message-contract.md b/docs/framework/wcf/samples/default-message-contract.md deleted file mode 100644 index 90f4c16e60571..0000000000000 --- a/docs/framework/wcf/samples/default-message-contract.md +++ /dev/null @@ -1,182 +0,0 @@ ---- -description: "Learn more about: Default Message Contract" -title: "Default Message Contract" -ms.date: "03/30/2017" -helpviewer_keywords: - - "Message Contract" -ms.assetid: 5a200b78-1a46-4104-b7fb-da6dbab33893 ---- -# Default Message Contract - -The Default Message Contract sample demonstrates a service where a custom user-defined message is passed to and from service operations. This sample is based on the [Getting Started](getting-started-sample.md) that implements a calculator interface as a typed service. Instead of the individual service operations for addition, subtraction, multiplication, and division used in the [Getting Started](getting-started-sample.md), this sample passes a custom message that contains both the operands and the operator, and returns the result of the arithmetic calculation. - - The client is a console program (.exe) and the service library (.dll) is hosted by Internet Information Services (IIS). Client activity is visible in the console window. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - - In the service, a single service operation is defined that accepts and returns custom messages of type `MyMessage`. Although in this sample the request and response messages are of the same type, they could of course be different message contracts if necessary. - -```csharp -[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")] -public interface ICalculator -{ - [OperationContract(Action="http://test/MyMessage_action", - ReplyAction="http://test/MyMessage_action")] - MyMessage Calculate(MyMessage request); -} -``` - - The custom message `MyMessage` is defined in a class annotated with , and attributes. Only the third constructor is used in this sample. Using message contracts allows you to exercise full control over the SOAP message. In this sample, the attribute is used to put `Operation` in a SOAP header. The operands `N1`, `N2` and the `Result` appear within the SOAP body because they have the attribute applied. - -```csharp -[MessageContract] -public class MyMessage -{ - private string operation; - private double n1; - private double n2; - private double result; - - //Constructor - create an empty message. - - public MyMessage() {} - - //Constructor - create a message and populate its members. - - public MyMessage(double n1, double n2, string operation, - double result) - { - this.n1 = n1; - this.n2 = n2; - this.operation = operation; - this.result = result; - } - - //Constructor - create a message from another message. - - public MyMessage(MyMessage message) - { - this.n1 = message.n1; - this.n2 = message.n2; - this.operation = message.operation; - this.result = message.result; - } - - [MessageHeader] - public string Operation - { - get { return operation; } - set { operation = value; } - } - - [MessageBodyMember] - public double N1 - { - get { return n1; } - set { n1 = value; } - } - - [MessageBodyMember] - public double N2 - { - get { return n2; } - set { n2 = value; } - } - - [MessageBodyMember] - public double Result - { - get { return result; } - set { result = value; } - } -} -``` - - The implementation class contains the code for the `Calculate` service operation. The `CalculateService` class obtains the operands and operator from the request message and creates a response message that contains the result of the requested calculation, as shown in the following sample code. - -```csharp -// Service class which implements the service contract. -public class CalculatorService : ICalculator -{ - // Perform a calculation. - - public MyMessage Calculate(MyMessage request) - { - MyMessage response = new MyMessage(request); - switch (request.Operation) - { - case "+": - response.Result = request.N1 + request.N2; - break; - case "-": - response.Result = request.N1 - request.N2; - break; - case "*": - response.Result = request.N1 * request.N2; - break; - case "/": - response.Result = request.N1 / request.N2; - break; - default: - response.Result = 0.0D; - break; - } - return response; - } -} -``` - - The generated client code for the client was created with the [ServiceModel Metadata Utility Tool (Svcutil.exe)](../servicemodel-metadata-utility-tool-svcutil-exe.md) tool. The tool automatically creates message contract types in the generated client code if necessary. The `/messageContract` command option may be specified to force the generation of message contracts. - -```console -svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" /o:client\generatedClient.cs http://localhost/servicemodelsamples/service.svc/mex -``` - - The following sample code demonstrates the client using the `MyMessage` message. - -```csharp -// Create a client with given client endpoint configuration -CalculatorClient client = new CalculatorClient(); - -// Perform addition using a typed message. - -MyMessage request = new MyMessage() - { - N1 = 100D, - N2 = 15.99D, - Operation = "+" - }; -MyMessage response = ((ICalculator)client).Calculate(request); -Console.WriteLine("Add({0},{1}) = {2}", request.N1, request.N2, response.Result); -``` - - When you run the sample, the calculations are displayed in the client console window. Press ENTER in the client window to shut down the client. - -```console -Add(100,15.99) = 115.99 -Subtract(145,76.54) = 68.46 -Multiply(9,81.25) = 731.25 -Divide(22,7) = 3.14285714285714 - -Press to terminate client. -``` - - At this point, custom user-defined messages have passed between the client and the service operation. The message contract defined that the operands and results were in the message body and that the operator was in a message header. Message logging can be configured to observe this message structure. - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Contract\Message\Default` diff --git a/docs/framework/wcf/samples/default-nettcpbinding.md b/docs/framework/wcf/samples/default-nettcpbinding.md deleted file mode 100644 index f5cf3947ea403..0000000000000 --- a/docs/framework/wcf/samples/default-nettcpbinding.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -description: "Learn more about: Default NetTcpBinding" -title: "Default NetTcpBinding" -ms.date: "03/30/2017" -helpviewer_keywords: - - "Net profile TCP" -ms.assetid: e8475fe6-0ecd-407a-8e7e-45860561bb74 ---- -# Default NetTcpBinding - -This sample demonstrates the use of the binding. This sample is based on the [Getting Started](getting-started-sample.md) that implements a calculator service. In this sample, the service is self-hosted. Both the client and service are console applications. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Binding\Net\TCP\Default` - - The binding is specified in the configuration files for the client and service. The binding type is specified in the `binding` attribute of the [\](../../configure-apps/file-schema/wcf/endpoint-element.md) element as shown in the following sample configuration. - -```xml - -``` - - The previous sample shows how to configure an endpoint to use the `netTcpBinding` binding with the default settings. If you want to configure the `netTcpBinding` binding and change some of its settings, it is necessary to define a binding configuration. The endpoint must reference the binding configuration by name with a `bindingConfiguration` attribute. In this sample, the binding configuration is named `Binding1` and is defined as shown in the following sample configuration. - -```xml - - - ... - - ... - - - - - - - - - - - - - - -``` - - When you run the sample, the operation requests and responses are displayed in the client console window. Press ENTER in the client window to shut down the client. - -```console -Add(100,15.99) = 115.99 -Subtract(145,76.54) = 68.46 -Multiply(9,81.25) = 731.25 -Divide(22,7) = 3.14285714285714 - -Press ENTER to terminate client. -``` - -### To set up, build, and run the sample - -1. Install ASP.NET 4.0 using the following command. - - ```console - %windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable - ``` - -2. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -3. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -4. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - - > [!NOTE] - > Because the server is self-hosted, you must specify an identity in the client's App.config file to run the sample in a cross-machine configuration. - - ```xml - - - - - - - - ``` diff --git a/docs/framework/wcf/samples/default-service-behavior.md b/docs/framework/wcf/samples/default-service-behavior.md deleted file mode 100644 index 6a0e37b90088f..0000000000000 --- a/docs/framework/wcf/samples/default-service-behavior.md +++ /dev/null @@ -1,91 +0,0 @@ ---- -description: "Learn more about: Default Service Behavior" -title: "Default Service Behavior" -ms.date: "03/30/2017" -helpviewer_keywords: - - "service behaviors, defaults" - - "Default Service Behavior Sample [Windows Communication Foundation]" -ms.assetid: 442d4f71-c64e-4c62-816a-a66c38e7d3ec ---- -# Default Service Behavior - -This sample demonstrates how service behavior settings can be configured. The sample is based on the [Getting Started](getting-started-sample.md), which implements the `ICalculator` service contract. This sample explicitly defines service behaviors and operation behaviors using the and attributes. You can configure behaviors in configuration files or imperatively in code (as this sample demonstrates). - - In this sample, the client is a console application (.exe) and the service is hosted by Internet Information Services (IIS). - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - - The service class specifies behaviors with the and the as shown in the following code sample. All values specified are the defaults. - -```csharp -[ServiceBehavior( - AutomaticSessionShutdown=true, - ConcurrencyMode=ConcurrencyMode.Single, - InstanceContextMode=InstanceContextMode.PerSession, - IncludeExceptionDetailInFaults=false, - UseSynchronizationContext=true, - ValidateMustUnderstand=true)] -public class CalculatorService : ICalculator -{ - [OperationBehavior( - TransactionAutoComplete=true, - TransactionScopeRequired=false, - Impersonation=ImpersonationOption.NotAllowed)] - public double Add(double n1, double n2) - { - System.Threading.Thread.Sleep(1600); - return n1 + n2; - } - ... -} -``` - - Service behaviors are specified with the attribute. The following table describes some of these behaviors. - -|Service behavior|Description| -|----------------------|-----------------| -||Automatically shuts down a session at the client's request.| -||Specifies the concurrency mode for each service instance.| -||Specifies the instance context mode.| -||Determines whether to use the provided synchronization context, if one is set. Use this when you want to control whether to use a `WindowsFormsSynchronizationContext` in Windows Forms applications.| -||Determines whether general unhandled execution exceptions are to be converted into a `Fault` and sent as a fault message.| -||Specifies the isolation level for transactions.| -||Determines whether unexpected message headers cause an error condition.| - - Operation behaviors are specified by using the attribute. The following table describes some of these behaviors. - -|Operation Behavior|Description| -|------------------------|-----------------| -||Determines whether service operation completion commits the current transaction.| -||Determines whether the service operation enlists in a client-flowed transaction.| -||Determines whether the service operation impersonates the caller's identity.| -||Determines whether service instances are recycled at the start or end of the service operation call.| - - When you run the sample, the operation requests and responses are displayed in the client console window. The delay between the calls is the result of the calls to `System.Threading.Thread.Sleep()` made in the service operations. The rest of the behavior samples explain these behaviors in more detail. Press ENTER in the client window to shut down the client. - -```console -Add(100,15.99) = 115.99 -Subtract(145,76.54) = 68.46 -Multiply(9,81.25) = 731.25 -Divide(22,7) = 3.14285714285714 - -Press to terminate client. -``` - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Services\Behaviors\Default` diff --git a/docs/framework/wcf/samples/design-patterns-list-based-publish-subscribe.md b/docs/framework/wcf/samples/design-patterns-list-based-publish-subscribe.md deleted file mode 100644 index b62f31a434c95..0000000000000 --- a/docs/framework/wcf/samples/design-patterns-list-based-publish-subscribe.md +++ /dev/null @@ -1,158 +0,0 @@ ---- -description: "Learn more about: Design Patterns: List-Based Publish-Subscribe" -title: "Design Patterns: List-Based Publish-Subscribe" -ms.date: "03/30/2017" -ms.assetid: f4257abc-12df-4736-a03b-0731becf0fd4 ---- -# Design Patterns: List-Based Publish-Subscribe - -This sample illustrates the List-based Publish-Subscribe pattern implemented as a Windows Communication Foundation (WCF) program. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - - The List-based Publish-Subscribe design pattern is described in the Microsoft Patterns & Practices publication, [Integration Patterns](/previous-versions/msp-n-p/ff647309(v=pandp.10)). The Publish-Subscribe pattern passes information to a collection of recipients who have subscribed to an information topic. List-based publish-subscribe maintains a list of subscribers. When there is information to share, a copy is sent to each subscriber on the list. This sample demonstrates a dynamic list-based publish-subscribe pattern, where clients can subscribe or unsubscribe as often as required. - - The List-based Publish-Subscribe sample consists of a client, a service, and a data source program. There can be more than one client and more than one data source program running. Clients subscribe to the service, receive notifications, and unsubscribe. Data source programs send information to the service to be shared with all current subscribers. - - In this sample, the client and data source are console programs (.exe files) and the service is a library (.dll) hosted in Internet Information Services (IIS). Client and data source activity are visible on the desktop. - - The service uses duplex communication. The `ISampleContract` service contract is paired up with an `ISampleClientCallback` callback contract. The service implements Subscribe and Unsubscribe service operations, which clients use to join or leave the list of subscribers. The service also implements the `PublishPriceChange` service operation, which the data source program calls to provide the service with new information. The client program implements the `PriceChange` service operation, which the service calls to notify all subscribers of a price change. - -```csharp -// Create a service contract and define the service operations. -// NOTE: The service operations must be declared explicitly. -[ServiceContract(SessionMode=SessionMode.Required, - CallbackContract=typeof(ISampleClientContract))] -public interface ISampleContract -{ - [OperationContract(IsOneWay = false, IsInitiating=true)] - void Subscribe(); - [OperationContract(IsOneWay = false, IsTerminating=true)] - void Unsubscribe(); - [OperationContract(IsOneWay = true)] - void PublishPriceChange(string item, double price, - double change); -} - -public interface ISampleClientContract -{ - [OperationContract(IsOneWay = true)] - void PriceChange(string item, double price, double change); -} -``` - - The service uses a .NET Framework event as the mechanism to inform all subscribers about new information. When a client joins the service by calling Subscribe, it provides an event handler. When a client leaves, it unsubscribes its event handler from the event. When a data source calls the service to report a price change, the service raises the event. This calls each instance of the service, one for each client that has subscribed, and causes their event handlers to execute. Each event handler passes the information to its client through its callback function. - -```csharp -public class PriceChangeEventArgs : EventArgs - { - public string Item; - public double Price; - public double Change; - } - - // The Service implementation implements your service contract. - [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)] - public class SampleService : ISampleContract - { - public static event PriceChangeEventHandler PriceChangeEvent; - public delegate void PriceChangeEventHandler(object sender, PriceChangeEventArgs e); - - ISampleClientContract callback = null; - - PriceChangeEventHandler priceChangeHandler = null; - - //Clients call this service operation to subscribe. - //A price change event handler is registered for this client instance. - - public void Subscribe() - { - callback = OperationContext.Current.GetCallbackChannel(); - priceChangeHandler = new PriceChangeEventHandler(PriceChangeHandler); - PriceChangeEvent += priceChangeHandler; - } - - //Clients call this service operation to unsubscribe. - //The previous price change event handler is unregistered. - - public void Unsubscribe() - { - PriceChangeEvent -= priceChangeHandler; - } - - //Information source clients call this service operation to report a price change. - //A price change event is raised. The price change event handlers for each subscriber will execute. - - public void PublishPriceChange(string item, double price, double change) - { - PriceChangeEventArgs e = new PriceChangeEventArgs(); - e.Item = item; - e.Price = price; - e.Change = change; - PriceChangeEvent(this, e); - } - - //This event handler runs when a PriceChange event is raised. - //The client's PriceChange service operation is invoked to provide notification about the price change. - - public void PriceChangeHandler(object sender, PriceChangeEventArgs e) - { - callback.PriceChange(e.Item, e.Price, e.Change); - } - - } -``` - - When you run the sample, launch several clients. The clients subscribe to the service. Then run the data source program, which sends information to the service. The service passes on the information to all subscribers. You can see activity on each client console confirming that the information has been received. Press ENTER in the client window to shut down the client. - -### To set up and build the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -### To run the sample on the same machine - -1. Test that you can access the service using a browser by entering the following address: `http://localhost/servicemodelsamples/service.svc`. A confirmation page should be displayed in response. - -2. Run Client.exe from \client\bin\\, from under the language-specific folder. Client activity is displayed on the client console window. Launch several clients. - -3. Run Datasource.exe from \datasource\bin\\, from under the language-specific folder. Data source activity is displayed on the console window. Once the data source sends information to the service, it should be passed on to each client. - -4. If the client, data source, and service programs are not able to communicate, see [Troubleshooting Tips for WCF Samples](/previous-versions/dotnet/netframework-3.5/ms751511(v=vs.90)). - -### To run the sample across machines - -1. Set up the service machine: - - 1. On the service machine, create a virtual directory named ServiceModelSamples. The batch file Setupvroot.bat from the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md) can be used to create the disk directory and virtual directory. - - 2. Copy the service program files from %SystemDrive%\Inetpub\wwwroot\servicemodelsamples to the ServiceModelSamples virtual directory on the service machine. Be sure to include the files in the \bin directory. - - 3. Test that you can access the service from the client machine using a browser. - -2. Set up the client machines: - - 1. Copy the client program files from the \client\bin\ folder, under the language-specific folder, to the client machines. - - 2. In each client configuration file, change the address value of the endpoint definition to match the new address of your service. Replace any references to "localhost" with a fully-qualified domain name in the address. - -3. Set up the data source machine: - - 1. Copy the data source program files from the \datasource\bin\ folder, under the language-specific folder, to the data source machine. - - 2. In the data source configuration file, change the address value of the endpoint definition to match the new address of your service. Replace any references to "localhost" with a fully-qualified domain name in the address. - -4. On the client machines, launch Client.exe from a command prompt. - -5. On the data source machine, launch Datasource.exe from a command prompt. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Scenario\DesignPatterns/ListBasedPublishSubscribe` diff --git a/docs/framework/wcf/samples/discovery-router-service.md b/docs/framework/wcf/samples/discovery-router-service.md deleted file mode 100644 index 557a7204be60a..0000000000000 --- a/docs/framework/wcf/samples/discovery-router-service.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -description: "Learn more about: Discovery Router Service" -title: "Discovery Router Service" -ms.date: "03/30/2017" -ms.assetid: 3d30af47-b24f-40e5-833a-24d77125c9e6 ---- -# Discovery Router Service - -This sample demonstrates how to forward discovery messages to another endpoint. - -## Demonstrates - - Discovery Routing - -## Discussion - - Discovery routing is useful in a scenario in which a client is looking for a service using a proxy and the proxy is unaware of such a service, but knows of another proxy. This proxy can forward the discovery packet from this client to the second proxy. The second proxy can look for the service and return the responses to the original client. - - In this sample, a client sends a message to a discovery routing component. This message is sent to a specific endpoint on the discovery router. The router then forwards the message to a UDP multicast endpoint. The probe message goes out to the multicast endpoint and a service listening on a UDP multicast address responds to that discovery router. The discovery router collects the responses and sends them back to the client. - -#### To set up, build, and run the sample - -1. Build the sample. - -2. Run the DiscoveryRouter executable. - -3. Run the service executable from the build directory. - -4. Run the client executable. Note that the client locates the service. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Discovery\DiscoveryRouter` diff --git a/docs/framework/wcf/samples/discovery-samples.md b/docs/framework/wcf/samples/discovery-samples.md deleted file mode 100644 index 53e53199494a6..0000000000000 --- a/docs/framework/wcf/samples/discovery-samples.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -description: "Learn more about: Discovery (Samples)" -title: "Discovery (Samples)" -ms.date: "03/30/2017" -ms.assetid: 522a00b4-a789-4e8c-b8d7-a4c3d863a182 ---- -# Discovery (Samples) - -This section contains samples related to the Discovery feature. - -## In This Section - - [Announcements](announcements-sample.md) - Demonstrates how to use announcements with the discovery feature. - - [Basic](basic-sample.md) - Demonstrates how to make a service discoverable programmatically as well as search for that service using the . - - [Configuration](configuration-sample.md) - Demonstrates how to use a configuration file to make a service discoverable as well as how to use a through configuration to look for that service. - - [Discovery with Scopes](discovery-with-scopes-sample.md) - Demonstrates how to use scopes to categorize discoverable endpoints as well how to use to perform an asynchronous search for endpoints. - - [Custom Find Criteria](custom-find-criteria.md) - Demonstrates how to create a custom scope match using logic and how to implement a custom discovery service. - - [Workflow Discovery Sample](workflow-discovery-sample.md) - Demonstrates how to make a workflow service discoverable and how to author a custom code activity that searches for a particular service. - - [Discovery Router Service](discovery-router-service.md) - Demonstrates how to forward discovery messages to another endpoint. diff --git a/docs/framework/wcf/samples/discovery-security-sample.md b/docs/framework/wcf/samples/discovery-security-sample.md deleted file mode 100644 index e646c2d9376ea..0000000000000 --- a/docs/framework/wcf/samples/discovery-security-sample.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -description: "Learn more about: Discovery Security Sample" -title: "Discovery Security Sample" -ms.date: "03/30/2017" -ms.assetid: b8db01f4-b4a1-43fe-8e31-26d4e9304a65 ---- -# Discovery Security Sample - -The Discovery specification does not require that endpoints that participate in the discovery process to be secure. Enhancing the discovery messages with security mitigates various types of attacks (message alteration, denial of service, replay, spoofing). This sample implements custom channels that compute and verify message signatures using the compact signature format (described in Section 8.2 of the WS-Discovery specification). The sample supports both the [2005 Discovery specification](http://specs.xmlsoap.org/ws/2005/04/discovery/ws-discovery.pdf) and the [1.1 version](http://docs.oasis-open.org/ws-dd/discovery/1.1/cs-01/wsdd-discovery-1.1-spec-cs-01.pdf). - - The custom channel is applied on top of the existing channel stack for Discovery and Announcement endpoints. This way, a signature header is applied for every message sent. The signature is verified on received messages and when it does not match or when the messages do not have a signature, the messages are dropped. To sign and verify messages, the sample uses certificates. - -## Discussion - - WCF is extensible and allows users the possibility to customize channels as desired. The sample implements a discovery secure binding element that builds secure channels. The secure channels apply and verify message signatures and are applied on top of the current stack. - - The secure binding element builds secure channel factories and channel listeners. - -## Secure Channel Factory - - The secure channel factory creates output or duplex channels that add a compact signature to message headers. To keep messages as small as possible the compact signature format is used. The structure of a compact signature is shown in the following example. - -```xml - - []? - ... - -``` - -> [!NOTE] -> The `PrefixList` was added in the 2008 Discovery version protocol. - - To compute the signature, the sample determines the expanded signature items. An XML signature (`SignedInfo`) is created, using the `ds` namespace prefix, as required by the WS-Discovery specification. The body and all the headers in discovery and addressing namespaces are referenced in the signature, so they cannot be tampered with. Each referenced element is transformed using the Exclusive Canonicalization (), and then an SHA-1 digest value is computed (). Based on all referenced elements and their digest values, the signature value is computed using the RSA algorithm (). - - The messages are signed with a client-specified certificate. The store location, name, and certificate subject name must be specified when the binding element is created. The `KeyId` in the compact signature represents the key identifier of the signing token and is the Subject Key Identifier (SKI) of the signing token or (if the SKI does not exist) a SHA-1 hash of the public key of the signing token. - -## Secure Channel Listener - - The secure channel listener creates input or duplex channels that verify the compact signature in received messages. To verify the signature, the `KeyId` specified in the compact signature attached to the message is used to select a certificate from the specified store. If the message does not have a signature or the signature check fails, the messages are dropped. To use the secure binding, the sample defines a factory that creates custom and with the added discovery secure binding element. These secure endpoints can be used in discovery announcement listeners and discoverable services. - -## Sample Details - - The sample includes a library and 4 console applications: - -- **DiscoverySecurityChannels**: A library that exposes the secure binding. The library computes and verifies the compact signature for outgoing/incoming messages. - -- **Service**: A service exposing ICalculatorService contract, self hosted. The service is marked as Discoverable. The user specifies the details of the certificate used to sign messages by specifying the store location and name and the subject name or other unique identifier for the certificate, and the store where the client certificates are located (the certificates used to check signature for incoming messages). Based on these details, a UdpDiscoveryEndpoint with added security is built and used. - -- **Client**: This class tries to discover an ICalculatorService and to call methods on the service. Again, a with added security is built and used to sign and verify the messages. - -- **AnnouncementListener**: A self-hosted service that listens for online and offline announcements and uses the secure announcement endpoint. - -> [!NOTE] -> If Setup.bat is run multiple times, the certificate manager prompts you for choosing a certificate to add, as there are duplicate certificates. In that case, Setup.bat should be aborted and Cleanup.bat should be called, because the duplicates have already been created. Cleanup.bat also prompts you to choose a certificate to delete. Select a certificate from the list and continue executing Cleanup.bat until no certificates are remaining. - -#### To use this sample - -1. Execute the Setup.bat script from a Developer Command Prompt for Visual Studio. The sample uses certificates to sign and verify messages. The script creates the certificates using Makecert.exe and then installs them using Certmgr.exe. The script must be run with administrator privileges. - -2. To build and run the sample, open the Security.sln file in Visual Studio and choose **Rebuild All**. Update the solution properties to start multiple projects: select **Start** for all projects except DiscoverySecureChannels. Run the solution normally. - -3. After you are done with the sample, execute the Cleanup.bat script that removes the certificates created for this sample. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Scenario\DiscoveryScenario` diff --git a/docs/framework/wcf/samples/discovery-with-scopes-sample.md b/docs/framework/wcf/samples/discovery-with-scopes-sample.md deleted file mode 100644 index 3da0c957340cd..0000000000000 --- a/docs/framework/wcf/samples/discovery-with-scopes-sample.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -description: "Learn more about: Discovery with Scopes Sample" -title: "Discovery with Scopes Sample" -ms.date: "03/30/2017" -ms.assetid: 6a37a754-6b8c-4ebe-bdf2-d4f0520271d5 ---- -# Discovery with Scopes Sample - -This sample shows how to use scopes to categorize discoverable endpoints as well how to use to perform an asynchronous search for endpoints. On the service, this sample shows how to customize discovery for each endpoint by adding an endpoint discovery behavior and using it to add a scope to the endpoint as well as controlling the endpoint’s discoverability. On the client, the sample goes over how clients can create a and fine tune search parameters to include scopes by adding scopes to the . This sample also shows how clients can restrict responses by adding a termination criterion. - -## Service Features - -This project shows two service endpoints being added to a . Each endpoint has a associated with it. This behavior is used to add URI scopes for both endpoints. Scopes are used to distinguish each of these endpoints so that the clients can fine tune the search. For the second endpoint, the discoverability can be disabled by setting the property to `false`. This ensures that the discovery metadata associated with this endpoint is not sent as part of any discovery messages. - -## Client Features - -The `FindCalculatorServiceAddress()` method shows how to use a and pass in a with two restrictions. A scope is added to the criteria and the property is set to 1. The scope limits the results to only the services that publish the same scope. Setting to 1 limits the responses the waits for to, at most, 1 endpoint. The call is a synchronous operation that blocks the thread until a timeout is reached or one endpoint is found. - -### To use this sample - -1. This sample uses HTTP endpoints and to run this sample, proper URL ACLs must be added. For more information, see [Configuring HTTP and HTTPS](../feature-details/configuring-http-and-https.md). Executing the following command at an elevated privilege should add the appropriate ACLs. You may want to substitute your Domain and Username for the following arguments if the command does not work as is: `netsh http add urlacl url=http://+:8000/ user=%DOMAIN%\%UserName%` - -2. Build the solution. - -3. Run the service executable from the build directory. - -4. Run the client executable. Note that the client is able to locate the service. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Discovery\DiscoveryWithScopes` diff --git a/docs/framework/wcf/samples/dispatch-by-body-element.md b/docs/framework/wcf/samples/dispatch-by-body-element.md deleted file mode 100644 index 5270f9eeff1e1..0000000000000 --- a/docs/framework/wcf/samples/dispatch-by-body-element.md +++ /dev/null @@ -1,179 +0,0 @@ ---- -description: "Learn more about: Dispatch by Body Element" -title: "Dispatch by Body Element" -ms.date: "03/30/2017" -ms.assetid: f64a3c04-62b4-47b2-91d9-747a3af1659f ---- -# Dispatch by Body Element - -This sample demonstrates how to implement an alternate algorithm for assigning incoming messages to operations. - - By default, the service model dispatcher selects the appropriate handling method for an incoming message based on the message's WS-Addressing "Action" header or the equivalent information in the HTTP SOAP request. - - Some SOAP 1.1 Web services stacks that do not follow the WS-I Basic Profile 1.1 guidelines do not dispatch messages based on the Action URI, but rather based on the XML qualified name of the first element inside the SOAP body. Likewise, the client side of these stacks might send messages with an empty or arbitrary HTTP SoapAction header, which was permitted by the SOAP 1.1 specification. - - To change the way messages are dispatched to methods, the sample implements the extensibility interface on the `DispatchByBodyElementOperationSelector`. This class selects operations based on the first element of the message body. - - The class constructor expects a dictionary populated with pairs of `XmlQualifiedName` and strings, whereby the qualified names indicate the name of the first child of the SOAP body and the strings indicate the matching operation name. The `defaultOperationName` is the name of the operation that receives all messages that cannot be matched against this dictionary: - -```csharp -class DispatchByBodyElementOperationSelector : IDispatchOperationSelector -{ - Dictionary dispatchDictionary; - string defaultOperationName; - - public DispatchByBodyElementOperationSelector(Dictionary dispatchDictionary, string defaultOperationName) - { - this.dispatchDictionary = dispatchDictionary; - this.defaultOperationName = defaultOperationName; - } -} -``` - - implementations are very straightforward to build as there is only one method on the interface: . The job of this method is to inspect an incoming message and to return a string that equals the name of a method on the service contract for the current endpoint. - - In this sample, the operation selector acquires an for the incoming message's body using . This method already positions the reader on the first child of the message's body so that it is sufficient to get the current element's name and namespace URI and combine them into an `XmlQualifiedName` that is then used for looking up the corresponding operation from the dictionary held by the operation selector. - -```csharp -public string SelectOperation(ref System.ServiceModel.Channels.Message message) -{ - XmlDictionaryReader bodyReader = message.GetReaderAtBodyContents(); - XmlQualifiedName lookupQName = new - XmlQualifiedName(bodyReader.LocalName, bodyReader.NamespaceURI); - message = CreateMessageCopy(message,bodyReader); - if (dispatchDictionary.ContainsKey(lookupQName)) - { - return dispatchDictionary[lookupQName]; - } - else - { - return defaultOperationName; - } -} -``` - - Accessing the message body with or any of the other methods that provide access to the message's body content causes the message to be marked as "read", which means that the message is invalid for any further processing. Therefore, the operation selector creates a copy of the incoming message with the method shown in the following code. Because the reader's position has not been changed during the inspection, it can be referenced by the newly created message to which the message properties and the message headers are also copied, which results in an exact clone of the original message: - -```csharp -private Message CreateMessageCopy(Message message, - XmlDictionaryReader body) -{ - Message copy = Message.CreateMessage(message.Version,message.Headers.Action,body); - copy.Headers.CopyHeaderFrom(message,0); - copy.Properties.CopyProperties(message.Properties); - return copy; -} -``` - -## Adding an Operation Selector to a Service - - Service dispatch operation selectors are extensions to the Windows Communication Foundation (WCF) dispatcher. For selecting methods on the callback channel of duplex contracts, there are also client operation selectors, which work very much like the dispatch operation selectors described here, but which are not explicitly covered in this sample. - - Like most service model extensions, dispatch operation selectors are added to the dispatcher using behaviors. A *behavior* is a configuration object, which either adds one or more extensions to the dispatch runtime (or to the client runtime) or otherwise changes its settings. - - Because operation selectors have contract scope, the appropriate behavior to implement here is the . Because the interface is implemented on a derived class as shown in the following code, the behavior can be declaratively added to any service contract. Whenever a is opened and the dispatch runtime is built, all behaviors found either as attributes on contracts, operations, and service implementations or as element in the service configuration are automatically added and subsequently asked to contribute extensions or modify the default configuration. - - For brevity, the following code excerpt only shows the implementation of the method , which effects the configuration changes for the dispatcher in this sample. The other methods are not shown because they return to the caller without doing any work. - -```csharp -[AttributeUsage(AttributeTargets.Class|AttributeTargets.Interface)] -class DispatchByBodyElementBehaviorAttribute : Attribute, IContractBehavior -{ - // public void AddBindingParameters(...) - // public void ApplyClientBehavior(...) - // public void Validate(...) -``` - - First, the implementation sets up the lookup dictionary for the operation selector by iterating over the elements in the service endpoint's . Then, each operation description is inspected for the presence of the `DispatchBodyElementAttribute` behavior, an implementation of that is also defined in this sample. While this class is also a behavior, it is passive and does not actively contribute any configuration changes to the dispatch runtime. All of its methods return to the caller without taking any actions. The operation behavior only exists so that the metadata required for the new dispatch mechanism, namely the qualified name of the body element on whose occurrence an operation is selected, can be associated with the respective operations. - - If such a behavior is found, a value pair created from the XML qualified name (`QName` property) and the operation name (`Name` property) is added to the dictionary. - - Once the dictionary is populated, a new `DispatchByBodyElementOperationSelector` is constructed with this information and set as the operation selector of the dispatch runtime: - -```csharp -public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.DispatchRuntime dispatchRuntime) -{ - Dictionary dispatchDictionary = - new Dictionary(); - foreach( OperationDescription operationDescription in - contractDescription.Operations ) - { - DispatchBodyElementAttribute dispatchBodyElement = - operationDescription.Behaviors.Find(); - if ( dispatchBodyElement != null ) - { - dispatchDictionary.Add(dispatchBodyElement.QName, - operationDescription.Name); - } - } - dispatchRuntime.OperationSelector = - new DispatchByBodyElementOperationSelector( - dispatchDictionary, - dispatchRuntime.UnhandledDispatchOperation.Name); - } -} -``` - -## Implementing the Service - - The behavior implemented in this sample directly affects how messages from the wire are interpreted and dispatched, which is a function of the service contract. Consequently, the behavior should be declared on the service contract level in any service implementation that chooses to use it. - - The sample project service applies the `DispatchByBodyElementBehaviorAttribute` contract behavior to the `IDispatchedByBody` service contract and labels each of the two operations `OperationForBodyA()` and `OperationForBodyB()` with a `DispatchBodyElementAttribute` operation behavior. When a service host for a service that implements this contract is opened, this metadata is picked up by the dispatcher builder as previously described. - - Because the operation selector dispatches solely based on the message body element and ignores the "Action", it is required to tell the runtime not to check the "Action" header on the returned replies by assigning the wildcard "*" to the `ReplyAction` property of . Furthermore, it is required to have a default operation that has the "Action" property set to the wildcard "\*". The default operation receives all messages which cannot be dispatched and does not have a `DispatchBodyElementAttribute`: - -```csharp -[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples"), - DispatchByBodyElementBehavior] -public interface IDispatchedByBody -{ - [OperationContract(ReplyAction="*"), - DispatchBodyElement("bodyA","http://tempuri.org")] - Message OperationForBodyA(Message msg); - [OperationContract(ReplyAction = "*"), - DispatchBodyElement("bodyB", "http://tempuri.org")] - Message OperationForBodyB(Message msg); - [OperationContract(Action="*", ReplyAction="*")] - Message DefaultOperation(Message msg); -} -``` - - The sample service implementation is straightforward. Every method wraps the received message into a reply message and echoes it back to the client. - -## Running and Building the Sample - - When you run the sample, the body content of the operation responses are displayed in the client console window similar to the following (formatted) output. - - The client sends three messages to the service whose body content element is named `bodyA`, `bodyB`, and `bodyX`, respectively. As can be deferred from the previous description and the service contract shown, the incoming message with the `bodyA` element is dispatched to the `OperationForBodyA()` method. Because there is no explicit dispatch target for the message with the `bodyX` body element, the message is dispatched to the `DefaultOperation()`. Each of the service operations wraps the received message body into an element specific to the method and returns it, which is done to correlate input and output messages clearly for this sample: - -```xml - - - test - - - - test - - - - test - -``` - -#### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Extensibility\Interop\AdvancedDispatchByBody` diff --git a/docs/framework/wcf/samples/duplex.md b/docs/framework/wcf/samples/duplex.md deleted file mode 100644 index 41f92fbe0ce22..0000000000000 --- a/docs/framework/wcf/samples/duplex.md +++ /dev/null @@ -1,191 +0,0 @@ ---- -description: "Learn more about: Duplex" -title: "Duplex" -ms.date: "03/30/2017" -helpviewer_keywords: - - "Duplex Service Contract" -ms.assetid: bc5de6b6-1a63-42a3-919a-67d21bae24e0 ---- -# Duplex - -The Duplex sample demonstrates how to define and implement a duplex contract. Duplex communication occurs when a client establishes a session with a service and gives the service a channel on which the service can send messages back to the client. This sample is based on the [Getting Started](getting-started-sample.md). A duplex contract is defined as a pair of interfaces—a primary interface from the client to the service and a callback interface from the service to the client. In this sample, the `ICalculatorDuplex` interface allows the client to perform math operations, calculating the result over a session. The service returns results on the `ICalculatorDuplexCallback` interface. A duplex contract requires a session, because a context must be established to correlate the set of messages being sent between the client and the service. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - -In this sample, the client is a console application (.exe) and the service is hosted by Internet Information Services (IIS). The duplex contract is defined as follows: - -```csharp -[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required, - CallbackContract=typeof(ICalculatorDuplexCallback))] -public interface ICalculatorDuplex -{ - [OperationContract(IsOneWay = true)] - void Clear(); - [OperationContract(IsOneWay = true)] - void AddTo(double n); - [OperationContract(IsOneWay = true)] - void SubtractFrom(double n); - [OperationContract(IsOneWay = true)] - void MultiplyBy(double n); - [OperationContract(IsOneWay = true)] - void DivideBy(double n); -} - -public interface ICalculatorDuplexCallback -{ - [OperationContract(IsOneWay = true)] - void Result(double result); - [OperationContract(IsOneWay = true)] - void Equation(string eqn); -} -``` - -The `CalculatorService` class implements the primary `ICalculatorDuplex` interface. The service uses the instance mode to maintain the result for each session. A private property named `Callback` is used to access the callback channel to the client. The service uses the callback for sending messages back to the client through the callback interface. - -```csharp -[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] -public class CalculatorService : ICalculatorDuplex -{ - double result = 0.0D; - string equation; - - public CalculatorService() - { - equation = result.ToString(); - } - - public void Clear() - { - Callback.Equation($"{equation} = {result}"); - equation = result.ToString(); - } - - public void AddTo(double n) - { - result += n; - equation += $" + {n}"; - Callback.Result(result); - } - - //... - - ICalculatorDuplexCallback Callback - { - get - { - return OperationContext.Current.GetCallbackChannel(); - } - } -} -``` - -The client must provide a class that implements the callback interface of the duplex contract, for receiving messages from the service. In the sample, a `CallbackHandler` class is defined to implement the `ICalculatorDuplexCallback` interface. - -```csharp -public class CallbackHandler : ICalculatorDuplexCallback -{ - public void Result(double result) - { - Console.WriteLine("Result({0})", result); - } - - public void Equation(string equation) - { - Console.WriteLine("Equation({0}", equation); - } -} -``` - -The proxy that is generated for a duplex contract requires a to be provided upon construction. This is used as the site for an object that implements the callback interface and handles messages that are sent back from the service. An is constructed with an instance of the `CallbackHandler` class. This object handles messages sent from the service to the client on the callback interface. - -```csharp -// Construct InstanceContext to handle messages on callback interface. -InstanceContext instanceContext = new InstanceContext(new CallbackHandler()); - -// Create a client. -CalculatorDuplexClient client = new CalculatorDuplexClient(instanceContext); - -Console.WriteLine("Press to terminate client once the output is displayed."); -Console.WriteLine(); - -// Call the AddTo service operation. -double value = 100.00D; -client.AddTo(value); - -// Call the SubtractFrom service operation. -value = 50.00D; -client.SubtractFrom(value); - -// Call the MultiplyBy service operation. -value = 17.65D; -client.MultiplyBy(value); - -// Call the DivideBy service operation. -value = 2.00D; -client.DivideBy(value); - -// Complete equation. -client.Clear(); - -Console.ReadLine(); - -//Closing the client gracefully closes the connection and cleans up resources. -client.Close(); -``` - -The configuration has been modified to provide a binding that supports both session communication and duplex communication. The `wsDualHttpBinding` supports session communication and allows duplex communication by providing dual HTTP connections, one for each direction. On the service, the only difference in configuration is the binding that is used. On the client, you must configure an address that the server can use to connect to the client as shown in the following sample configuration. - -```xml - - - - - - - - - - - -``` - -When you run the sample, you see the messages that are returned to the client on the callback interface that is sent from the service. Each intermediate result is displayed, followed by the entire equation upon the completion of all operations. Press ENTER to shut down the client. - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C#, C++, or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - - > [!IMPORTANT] - > When running the client in a cross-machine configuration, be sure to replace "localhost" in both the `address` attribute of the [\ of \](../../configure-apps/file-schema/wcf/endpoint-of-client.md) element and the `clientBaseAddress` attribute of the [\](../../configure-apps/file-schema/wcf/bindings.md) element of the [\](../../configure-apps/file-schema/wcf/wsdualhttpbinding.md) element with the name of the appropriate machine, as shown in the following: - - ```xml - - - - ... - - - - - ``` - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Contract\Service\Duplex` diff --git a/docs/framework/wcf/samples/durable-instance-context.md b/docs/framework/wcf/samples/durable-instance-context.md deleted file mode 100644 index 6f5285429d32b..0000000000000 --- a/docs/framework/wcf/samples/durable-instance-context.md +++ /dev/null @@ -1,458 +0,0 @@ ---- -description: "Learn more about: Durable Instance Context" -title: "Durable Instance Context" -ms.date: "03/30/2017" -ms.assetid: 97bc2994-5a2c-47c7-927a-c4cd273153df ---- -# Durable Instance Context - -This sample demonstrates how to customize the Windows Communication Foundation (WCF) runtime to enable durable instance contexts. It uses SQL Server 2005 as its backing store (SQL Server 2005 Express in this case). However, it also provides a way to access custom storage mechanisms. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - -This sample involves extending both the channel layer and the service model layer of the WCF. Therefore it is necessary to understand the underlying concepts before going into the implementation details. - -Durable instance contexts can be found in the real world scenarios quite often. A shopping cart application, for example, has the ability to pause shopping halfway through and continue it on another day. So that when we visit the shopping cart the next day, our original context is restored. It is important to note that the shopping cart application (on the server) does not maintain the shopping cart instance while we are disconnected. Instead, it persists its state into a durable storage media and uses it when constructing a new instance for the restored context. Therefore the service instance that may service for the same context is not the same as the previous instance (that is, it does not have the same memory address). - -Durable instance context is made possible by a small protocol that exchanges a context ID between the client and service. This context ID is created on the client and transmitted to the service. When the service instance is created, the service runtime tries to load the persisted state that corresponds to this context ID from a persistent storage (by default it is a SQL Server 2005 database). If no state is available, the new instance has its default state. The service implementation uses a custom attribute to mark operations that change the state of the service implementation so that the runtime can save the service instance after invoking them. - -By the previous description, two steps can easily be distinguished to achieve the goal: - -1. Change the message that goes on the wire to carry the context ID. - -2. Change the service local behavior to implement custom instancing logic. - -Because the first one in the list affects the messages on the wire, it should be implemented as a custom channel and be hooked up to the channel layer. The latter only affects the service local behavior and therefore can be implemented by extending several service extensibility points. In the next few sections, each of these extensions are discussed. - -## Durable InstanceContext Channel - -The first thing to look at is a channel layer extension. The first step in writing a custom channel is to decide the communication structure of the channel. As a new wire protocol is being introduced, the channel should work with almost any other channel in the channel stack. Therefore it should support all the message exchange patterns. However, the core functionality of the channel is the same regardless of its communication structure. More specifically, from the client it should write the context ID to the messages and from the service it should read this context ID from the messages and pass it to the upper levels. Because of that, a `DurableInstanceContextChannelBase` class is created that acts as the abstract base class for all durable instance context channel implementations. This class contains the common state machine management functions and two protected members to apply and read the context information to and from messages. - -```csharp -class DurableInstanceContextChannelBase -{ - //… - protected void ApplyContext(Message message) - { - //… - } - protected string ReadContextId(Message message) - { - //… - } -} -``` - -These two methods make use of `IContextManager` implementations to write and read the context ID to or from the message. (`IContextManager` is a custom interface used to define the contract for all context managers.) The channel can either include the context ID in a custom SOAP header or in an HTTP cookie header. Each context manager implementation inherits from the `ContextManagerBase` class that contains the common functionality for all context managers. The `GetContextId` method in this class is used to originate the context ID from the client. When a context ID is originated for the first time, this method saves it into a text file whose name is constructed by the remote endpoint address (the invalid file name characters in the typical URIs are replaced with @ characters). - -Later when the context ID is required for the same remote endpoint, it checks whether an appropriate file exists. If it does, it reads the context ID and returns. Otherwise it returns a newly generated context ID and saves it to a file. With the default configuration, these files are placed in a directory called ContextStore, which resides in the current user's temp directory. However this location is configurable using the binding element. - -The mechanism used to transport the context ID is configurable. It could be either written to the HTTP cookie header or to a custom SOAP header. The custom SOAP header approach makes it possible to use this protocol with non-HTTP protocols (for example, TCP or Named Pipes). There are two classes, namely `MessageHeaderContextManager` and `HttpCookieContextManager`, which implement these two options. - -Both of them write the context ID to the message appropriately. For example, the `MessageHeaderContextManager` class writes it to a SOAP header in the `WriteContext` method. - -```csharp -public override void WriteContext(Message message) -{ - string contextId = this.GetContextId(); - - MessageHeader contextHeader = - MessageHeader.CreateHeader(DurableInstanceContextUtility.HeaderName, - DurableInstanceContextUtility.HeaderNamespace, - contextId, - true); - - message.Headers.Add(contextHeader); -} -``` - -Both the `ApplyContext` and `ReadContextId` methods in the `DurableInstanceContextChannelBase` class invoke the `IContextManager.ReadContext` and `IContextManager.WriteContext`, respectively. However, these context managers are not directly created by the `DurableInstanceContextChannelBase` class. Instead it uses the `ContextManagerFactory` class to do that job. - -```csharp -IContextManager contextManager = - ContextManagerFactory.CreateContextManager(contextType, - this.contextStoreLocation, - this.endpointAddress); -``` - -The `ApplyContext` method is invoked by the sending channels. It injects the context ID to the outgoing messages. The `ReadContextId` method is invoked by the receiving channels. This method ensures that the context ID is available in the incoming messages and adds it to the `Properties` collection of the `Message` class. It also throws a `CommunicationException` in case of a failure to read the context ID and thus causes the channel to be aborted. - -```csharp -message.Properties.Add(DurableInstanceContextUtility.ContextIdProperty, contextId); -``` - -Before proceeding, it is important to understand the usage of the `Properties` collection in the `Message` class. Typically, this `Properties` collection is used when passing data from lower to the upper levels from the channel layer. This way the desired data can be provided to the upper levels in a consistent manner regardless of the protocol details. In other words, the channel layer can send and receive the context ID either as a SOAP header or an HTTP cookie header. But it is not necessary for the upper levels to know about these details because the channel layer makes this information available in the `Properties` collection. - -Now with the `DurableInstanceContextChannelBase` class in place all ten of the necessary interfaces (IOutputChannel, IInputChannel, IOutputSessionChannel, IInputSessionChannel, IRequestChannel, IReplyChannel, IRequestSessionChannel, IReplySessionChannel, IDuplexChannel, IDuplexSessionChannel) must be implemented. They resemble every available message exchange pattern (datagram, simplex, duplex, and their sessionful variants). Each of these implementations inherits the base class previously described and calls `ApplyContext` and `ReadContextId` appropriately. For example, `DurableInstanceContextOutputChannel` - which implements the IOutputChannel interface - calls the `ApplyContext` method from each method that sends the messages. - -```csharp -public void Send(Message message, TimeSpan timeout) -{ - // Apply the context information before sending the message. - this.ApplyContext(message); - //… -} -``` - -On the other hand, `DurableInstanceContextInputChannel` - which implements the `IInputChannel` interface - calls the `ReadContextId` method in each method, which receives the messages. - -```csharp -public Message Receive(TimeSpan timeout) -{ - //… - ReadContextId(message); - return message; -} -``` - -Apart from this, these channel implementations delegate the method invocations to the channel below them in the channel stack. However, sessionful variants have a basic logic to make sure that the context ID is sent and is read only for the first message that causes the session to be created. - -```csharp -if (isFirstMessage) -{ -//… - this.ApplyContext(message); - isFirstMessage = false; -} -``` - -These channel implementations are then added to the WCF channel runtime by the `DurableInstanceContextBindingElement` class and `DurableInstanceContextBindingElementSection` class appropriately. See the [HttpCookieSession](httpcookiesession.md) channel sample documentation for more details about binding elements and binding element sections. - -## Service Model Layer Extensions - -Now that the context ID has traveled through the channel layer, the service behavior can be implemented to customize the instantiation. In this sample, a storage manager is used to load and save state from or to the persistent store. As explained previously, this sample provides a storage manager that uses SQL Server 2005 as its backing store. However, it is also possible to add custom storage mechanisms to this extension. To do that a public interface is declared, which must be implemented by all storage managers. - -```csharp -public interface IStorageManager -{ - object GetInstance(string contextId, Type type); - void SaveInstance(string contextId, object state); -} -``` - -The `SqlServerStorageManager` class contains the default `IStorageManager` implementation. In its `SaveInstance` method, the given object is serialized using the XmlSerializer and is saved to the SQL Server database. - -```csharp -XmlSerializer serializer = new XmlSerializer(state.GetType()); -string data; - -using (StringWriter writer = new StringWriter(CultureInfo.InvariantCulture)) -{ - serializer.Serialize(writer, state); - data = writer.ToString(); -} - -using (SqlConnection connection = new SqlConnection(GetConnectionString())) -{ - connection.Open(); - - string update = @"UPDATE Instances SET Instance = @instance WHERE ContextId = @contextId"; - - using (SqlCommand command = new SqlCommand(update, connection)) - { - command.Parameters.Add("@instance", SqlDbType.VarChar, 2147483647).Value = data; - command.Parameters.Add("@contextId", SqlDbType.VarChar, 256).Value = contextId; - - int rows = command.ExecuteNonQuery(); - - if (rows == 0) - { - string insert = @"INSERT INTO Instances(ContextId, Instance) VALUES(@contextId, @instance)"; - command.CommandText = insert; - command.ExecuteNonQuery(); - } - } -} -``` - -In the `GetInstance` method, the serialized data is read for a given context ID and the object constructed from it is returned to the caller. - -```csharp -object data; -using (SqlConnection connection = new SqlConnection(GetConnectionString())) -{ - connection.Open(); - - string select = "SELECT Instance FROM Instances WHERE ContextId = @contextId"; - using (SqlCommand command = new SqlCommand(select, connection)) - { - command.Parameters.Add("@contextId", SqlDbType.VarChar, 256).Value = contextId; - data = command.ExecuteScalar(); - } -} - -if (data != null) -{ - XmlSerializer serializer = new XmlSerializer(type); - using (StringReader reader = new StringReader((string)data)) - { - object instance = serializer.Deserialize(reader); - return instance; - } -} -``` - -Users of these storage managers are not supposed to instantiate them directly. They use the `StorageManagerFactory` class, which abstracts from the storage manager creation details. This class has one static member, `GetStorageManager`, which creates an instance of a given storage manager type. If the type parameter is `null`, this method creates an instance of the default `SqlServerStorageManager` class and returns it. It also validates the given type to make sure that it implements the `IStorageManager` interface. - -```csharp -public static IStorageManager GetStorageManager(Type storageManagerType) -{ -IStorageManager storageManager = null; - -if (storageManagerType == null) -{ - return new SqlServerStorageManager(); -} -else -{ - object obj = Activator.CreateInstance(storageManagerType); - - // Throw if the specified storage manager type does not - // implement IStorageManager. - if (obj is IStorageManager) - { - storageManager = (IStorageManager)obj; - } - else - { - throw new InvalidOperationException( - ResourceHelper.GetString("ExInvalidStorageManager")); - } - - return storageManager; -} -} -``` - -The necessary infrastructure to read and write instances from the persistent storage is implemented. Now the necessary steps to change the service behavior have to be taken. - -As the first step of this process we have to save the context ID, which came through the channel layer to the current InstanceContext. InstanceContext is a runtime component that acts as the link between the WCF dispatcher and the service instance. It can be used to provide additional state and behavior to the service instance. This is essential because in sessionful communication the context ID is sent only with the first message. - -WCF allows extending its InstanceContext runtime component by adding a new state and behavior using its extensible object pattern. The extensible object pattern is used in WCF to either extend existing runtime classes with new functionality or to add new state features to an object. There are three interfaces in the extensible object pattern - IExtensibleObject\, IExtension\, and IExtensionCollection\: - -- The IExtensibleObject\ interface is implemented by objects that allow extensions that customize their functionality. - -- The IExtension\ interface is implemented by objects that are extensions of classes of type T. - -- The IExtensionCollection\ interface is a collection of IExtensions that allows for retrieving IExtensions by their type. - -Therefore an InstanceContextExtension class should be created that implements the IExtension interface and defines the required state to save the context ID. This class also provides the state to hold the storage manager being used. Once the new state is saved, it should not be possible to modify it. Therefore the state is provided and saved to the instance at the time it is being constructed and then only accessible using read-only properties. - -```csharp -// Constructor -public DurableInstanceContextExtension(string contextId, - IStorageManager storageManager) -{ - this.contextId = contextId; - this.storageManager = storageManager; -} - -// Read only properties -public string ContextId -{ - get { return this.contextId; } -} - -public IStorageManager StorageManager -{ - get { return this.storageManager; } -} -``` - -The InstanceContextInitializer class implements the IInstanceContextInitializer interface and adds the instance context extension to the Extensions collection of the InstanceContext being constructed. - -```csharp -public void Initialize(InstanceContext instanceContext, Message message) -{ - string contextId = - (string)message.Properties[DurableInstanceContextUtility.ContextIdProperty]; - - DurableInstanceContextExtension extension = - new DurableInstanceContextExtension(contextId, - storageManager); - instanceContext.Extensions.Add(extension); -} -``` - -As described earlier the context ID is read from the `Properties` collection of the `Message` class and passed to the constructor of the extension class. This demonstrates how information can be exchanged between the layers in a consistent manner. - -The next important step is overriding the service instance creation process. WCF allows implementing custom instantiation behaviors and hooking them up to the runtime using the IInstanceProvider interface. The new `InstanceProvider` class is implemented to do that job. The service type expected from the instance provider is accepted in the constructor. Later this is used to create new instances. In the `GetInstance` implementation, an instance of a storage manager is created looking for a persisted instance. If it returns `null`, then a new instance of the service type is instantiated and returned to the caller. - -```csharp -public object GetInstance(InstanceContext instanceContext, Message message) -{ - object instance = null; - - DurableInstanceContextExtension extension = - instanceContext.Extensions.Find(); - - string contextId = extension.ContextId; - IStorageManager storageManager = extension.StorageManager; - - instance = storageManager.GetInstance(contextId, serviceType); - - instance ??= Activator.CreateInstance(serviceType); - return instance; -} -``` - -The next important step is to install the `InstanceContextExtension`, `InstanceContextInitializer`, and `InstanceProvider` classes into the service model runtime. A custom attribute could be used to mark the service implementation classes to install the behavior. The `DurableInstanceContextAttribute` contains the implementation for this attribute and it implements the `IServiceBehavior` interface to extend the entire service runtime. - -This class has a property that accepts the type of the storage manager to be used. In this way, the implementation enables the users to specify their own `IStorageManager` implementation as parameter of this attribute. - -In the `ApplyDispatchBehavior` implementation, the `InstanceContextMode` of the current `ServiceBehavior` attribute is being verified. If this property is set to Singleton, enabling durable instancing is not possible and an `InvalidOperationException` is thrown to notify the host. - -```csharp -ServiceBehaviorAttribute serviceBehavior = - serviceDescription.Behaviors.Find(); - -if (serviceBehavior != null && - serviceBehavior.InstanceContextMode == InstanceContextMode.Single) -{ - throw new InvalidOperationException( - ResourceHelper.GetString("ExSingletonInstancingNotSupported")); -} -``` - -After this the instances of the storage manager, instance context initializer, and the instance provider are created and installed in the `DispatchRuntime` created for every endpoint. - -```csharp -IStorageManager storageManager = - StorageManagerFactory.GetStorageManager(storageManagerType); - -InstanceContextInitializer contextInitializer = - new InstanceContextInitializer(storageManager); - -InstanceProvider instanceProvider = - new InstanceProvider(description.ServiceType); - -foreach (ChannelDispatcherBase cdb in serviceHostBase.ChannelDispatchers) -{ - ChannelDispatcher cd = cdb as ChannelDispatcher; - - if (cd != null) - { - foreach (EndpointDispatcher ed in cd.Endpoints) - { - ed.DispatchRuntime.InstanceContextInitializers.Add(contextInitializer); - ed.DispatchRuntime.InstanceProvider = instanceProvider; - } - } -} -``` - -In summary so far, this sample has produced a channel that enabled the custom wire protocol for custom context ID exchange and it also overwrites the default instancing behavior to load the instances from the persistent storage. - -What is left is a way to save the service instance to the persistent storage. As discussed previously, there is already the required functionality to save the state in an `IStorageManager` implementation. We now must integrate this with the WCF runtime. Another attribute is required that is applicable to the methods in the service implementation class. This attribute is supposed to be applied to the methods that change the state of the service instance. - -The `SaveStateAttribute` class implements this functionality. It also implements `IOperationBehavior` class to modify the WCF runtime for each operation. When a method is marked with this attribute, the WCF runtime invokes the `ApplyBehavior` method while the appropriate `DispatchOperation` is being constructed. There is a single line of code in this method implementation: - -```csharp -dispatch.Invoker = new OperationInvoker(dispatch.Invoker); -``` - -This instruction creates an instance of `OperationInvoker` type and assigns it to the `Invoker` property of the `DispatchOperation` being constructed. The `OperationInvoker` class is a wrapper for the default operation invoker created for the `DispatchOperation`. This class implements the `IOperationInvoker` interface. In the `Invoke` method implementation, the actual method invocation is delegated to the inner operation invoker. However, before returning the results the storage manager in the `InstanceContext` is used to save the service instance. - -```csharp -object result = innerOperationInvoker.Invoke(instance, - inputs, out outputs); - -// Save the instance using the storage manager saved in the -// current InstanceContext. -InstanceContextExtension extension = - OperationContext.Current.InstanceContext.Extensions.Find(); - -extension.StorageManager.SaveInstance(extension.ContextId, instance); -return result; -``` - -## Using the Extension - -Both the channel layer and service model layer extensions are done and they can now be used in WCF applications. Services must add the channel into the channel stack using a custom binding and then mark the service implementation classes with the appropriate attributes. - -```csharp -[DurableInstanceContext] -[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)] -public class ShoppingCart : IShoppingCart -{ -//… - [SaveState] - public int AddItem(string item) - { - //… - } -//… - } -``` - -Client applications must add the DurableInstanceContextChannel into the channel stack using a custom binding. To configure the channel declaratively in the configuration file, the binding element section has to be added to the binding element extensions collection. - -```xml - - - - - - - -``` - -Now the binding element can be used with a custom binding just like other standard binding elements: - -```xml - - - - - - - - - - -``` - -## Conclusion - -This sample showed how to create a custom protocol channel and how to customize the service behavior to enable it. - -The extension can be further improved by letting users specify the `IStorageManager` implementation using a configuration section. This makes it possible to modify the backing store without recompiling the service code. - -Furthermore you could try to implement a class (for example, `StateBag`), which encapsulates the state of the instance. That class is responsible for persisting the state whenever it changes. This way you can avoid using the `SaveState` attribute and perform the persisting work more accurately (for example, you could persist the state when the state is actually changed rather than saving it each time when a method with the `SaveState` attribute is called). - -When you run the sample, the following output is displayed. The client adds two items to its shopping cart and then gets the list of items in its shopping cart from the service. Press ENTER in each console window to shut down the service and client. - -```console -Enter the name of the product: apples -Enter the name of the product: bananas - -Shopping cart currently contains the following items. -apples -bananas -Press ENTER to shut down client -``` - -> [!NOTE] -> Rebuilding the service overwrites the database file. To observe state preserved across multiple runs of the sample, be sure not to rebuild the sample between runs. - -#### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -> [!NOTE] -> You must be running SQL Server 2005 or SQL Express 2005 to run this sample. If you are running SQL Server 2005, you must modify the configuration of the service's connection string. When running cross-machine, SQL Server is only required on the server machine. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Extensibility\Instancing\Durable` diff --git a/docs/framework/wcf/samples/durable-issued-token-provider.md b/docs/framework/wcf/samples/durable-issued-token-provider.md deleted file mode 100644 index e7aa3498c0e65..0000000000000 --- a/docs/framework/wcf/samples/durable-issued-token-provider.md +++ /dev/null @@ -1,255 +0,0 @@ ---- -description: "Learn more about: Durable Issued Token Provider" -title: "Durable Issued Token Provider" -ms.date: "03/30/2017" -ms.assetid: 76fb27f5-8787-4b6a-bf4c-99b4be1d2e8b ---- -# Durable Issued Token Provider - -This sample demonstrates how to implement a custom client issued token provider. - -## Discussion - - A token provider in Windows Communication Foundation (WCF) is used to supply credentials to the security infrastructure. The token provider in general examines the target and issues appropriate credentials so that the security infrastructure can secure the message. WCF ships with a CardSpace token provider. Custom token providers are useful in the following cases: - -- If you have a credential store that the built-in token provider cannot operate with. - -- If you want to provide your own custom mechanism for transforming the credentials from the point when the user provides the details to when the WCF client uses the credentials. - -- If you are building a custom token. - - This sample shows how to build a custom token provider that caches tokens issued by a Security Token Service (STS). - - To summarize, this sample demonstrates the following: - -- How a client can be configured with a custom token provider. - -- How issued tokens can be cached and provided to the WCF client. - -- How the server is authenticated by the client using the server's X.509 certificate. - - This sample consists of a client console program (Client.exe), a security token service console program (Securitytokenservice.exe) and a service console program (Service.exe). The service implements a contract that defines a request-reply communication pattern. The contract is defined by the `ICalculator` interface, which exposes math operations (add, subtract, multiply, and divide). The client gets a security token from the Security Token Service (STS) and makes synchronous requests to the service for a given math operation and the service replies with the result. Client activity is visible in the console window. - -> [!NOTE] -> The set-up procedure and build instructions for this sample are located at the end of this topic. - - This sample exposes the ICalculator contract using the [\](../../configure-apps/file-schema/wcf/wshttpbinding.md). The configuration of this binding on the client is shown in the following code. - -```xml - - - - - - - - - - - -``` - - On the `security` element of `wsFederationHttpBinding`, the `mode` value configures which security mode should be used. In this sample, messages security is being used, which is why the `message` element of `wsFederationHttpBinding` is specified inside the `security` element of `wsFederationHttpBinding`. The `issuer` element of `wsFederationHttpBinding` inside the `message` element of `wsFederationHttpBinding` specifies the address and binding for the Security Token Service that issues a security token to the client so that the client can authenticate to the Calculator service. - - The configuration of this binding on the service is shown in the following code. - -```xml - - - - - - - - - - - - - - - -``` - - On the `security` element of `wsFederationHttpBinding`, the `mode` value configures which security mode should be used. In this sample, messages security is being used, which is why the `message` element of `wsFederationHttpBinding` is specified inside the `security` element of `wsFederationHttpBinding`. The `issuerMetadata` element of `wsFederationHttpBinding` inside the `message` element of `wsFederationHttpBinding` specifies the address and identity for an endpoint that can be used to retrieve metadata for the Security Token Service. - - The behavior for the service is shown in the following code. - -```xml - - - - - - - - - - - - -``` - - The `issuedTokenAuthentication` element inside the `serviceCredentials` element allows the service to specify constraints on the tokens it allows clients to present during authentication. This configuration specifies that tokens signed by a certificate whose Subject Name is CN=STS are accepted by the service. - - The Security Token Service exposes a single endpoint using the standard wsHttpBinding. The Security Token Service responds to request from clients for tokens and, provided the client authenticates using a Windows account, issues a token that contains the client's user name as a claim in the issued token. As part of creating the token, the Security Token Service signs the token using the private key associated with the CN=STS certificate. In addition, it creates a symmetric key and encrypts it using the public key associated with the CN=localhost certificate. In returning the token to the client, the Security Token Service also returns the symmetric key. The client presents the issued token to the Calculator service, and proves that it knows the symmetric key by signing the message with that key. - -## Custom Client Credentials and Token Provider - - The following steps show how to develop a custom token provider that caches issued tokens and integrate it with WCF: security. - -### To develop a custom token provider - -1. Write a custom token provider. - - The sample implements a custom token provider that returns a security token retrieved from a cache. - - To perform this task, the custom token provider derives the class and overrides the method. This method tries to get a token from the cache, or if a token cannot be found in the cache, retrieves a token from the underlying provider and then caches that token. In both cases the method returns a `SecurityToken`. - - ```csharp - protected override SecurityToken GetTokenCore(TimeSpan timeout) - { - GenericXmlSecurityToken token; - if (!this.cache.TryGetToken(target, issuer, out token)) - { - token = (GenericXmlSecurityToken) this.innerTokenProvider.GetToken(timeout); - this.cache.AddToken(token, target, issuer); - } - return token; - } - ``` - -2. Write custom security token manager. - - The is used to create a for a specific that is passed to it in the `CreateSecurityTokenProvider` method. Security token manager is also used to create token authenticators and token serializers, but those are not covered by this sample. In this sample, the custom security token manager inherits from the class and overrides the `CreateSecurityTokenProvider` method to return the custom token provider when the passed token requirements indicate that an issued token is requested. - - ```csharp - class DurableIssuedTokenClientCredentialsTokenManager : - ClientCredentialsSecurityTokenManager - { - IssuedTokenCache cache; - - public DurableIssuedTokenClientCredentialsTokenManager ( DurableIssuedTokenClientCredentials creds ): base(creds) - { - this.cache = creds.IssuedTokenCache; - } - - public override SecurityTokenProvider CreateSecurityTokenProvider ( SecurityTokenRequirement tokenRequirement ) - { - if (IsIssuedSecurityTokenRequirement(tokenRequirement)) - { - return new DurableIssuedSecurityTokenProvider ((IssuedSecurityTokenProvider)base.CreateSecurityTokenProvider( tokenRequirement), this.cache); - } - else - { - return base.CreateSecurityTokenProvider(tokenRequirement); - } - } - } - ``` - -3. Write a custom client credential. - - A client credentials class is used to represent the credentials that are configured for the client proxy and creates the security token manager that is used to obtain token authenticators, token providers and token serializers. - - ```csharp - public class DurableIssuedTokenClientCredentials : ClientCredentials - { - IssuedTokenCache cache; - - public DurableIssuedTokenClientCredentials() : base() - { - } - - DurableIssuedTokenClientCredentials ( DurableIssuedTokenClientCredentials other) : base(other) - { - this.cache = other.cache; - } - - public IssuedTokenCache IssuedTokenCache - { - get - { - return this.cache; - } - set - { - this.cache = value; - } - } - - protected override ClientCredentials CloneCore() - { - return new DurableIssuedTokenClientCredentials(this); - } - - public override SecurityTokenManager CreateSecurityTokenManager() - { - return new DurableIssuedTokenClientCredentialsTokenManager ((DurableIssuedTokenClientCredentials)this.Clone()); - } - } - ``` - -4. Implement the token cache. The sample implementation uses an abstract base class through which consumers of a given token cache interact with the cache. - - ```csharp - public abstract class IssuedTokenCache - { - public abstract void AddToken ( GenericXmlSecurityToken token, EndpointAddress target, EndpointAddress issuer); - public abstract bool TryGetToken(EndpointAddress target, EndpointAddress issuer, out GenericXmlSecurityToken cachedToken); - } - // Configure the client to use the custom client credential. - ``` - - For the client to use the custom client credential, the sample deletes the default client credential class and supplies the new client credential class. - - ```csharp - clientFactory.Endpoint.Behaviors.Remove(); - DurableIssuedTokenClientCredentials durableCreds = new DurableIssuedTokenClientCredentials(); - durableCreds.IssuedTokenCache = cache; - durableCreds.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust; - clientFactory.Endpoint.Behaviors.Add(durableCreds); - ``` - -## Running the sample - - See the following instructions to run the sample. When you run the sample, the request for the security token is shown in the Security Token Service console window. The operation requests and responses are displayed in the client and service console windows. Press ENTER in any of the console windows to shut down the application. - -## The Setup.cmd Batch File - - The Setup.cmd batch file included with this sample allows you to configure the server and security token service with relevant certificates to run a self-hosted application. The batch file creates two certificates both in the CurrentUser/TrustedPeople certificate store. The first certificate has a subject name of CN=STS and is used by the Security Token Service to sign the security tokens that it issues to the client. The second certificate has a subject name of CN=localhost and is used by the Security Token Service to encrypt a secret so that the service can decrypt it. - -### To set up, build, and run the sample - -1. Run the Setup.cmd file to create the required certificates. - -2. To build the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). Ensure that all the projects in the solution are built (Shared, RSTRSTR, Service, SecurityTokenService, and Client). - -3. Ensure that Service.exe and SecurityTokenService.exe are both running with administrator privileges. - -4. Run Client.exe. - -### To clean up after the sample - -1. Run Cleanup.cmd in the samples folder once you have finished running the sample. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Extensibility\Security\DurableIssuedTokenProvider` diff --git a/docs/framework/wcf/samples/etw-tracing.md b/docs/framework/wcf/samples/etw-tracing.md deleted file mode 100644 index 63d3e5262b9eb..0000000000000 --- a/docs/framework/wcf/samples/etw-tracing.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -title: "ETW Tracing" -description: This sample demonstrates how to implement End-to-End (E2E) tracing using Event Tracing for Windows (ETW) and the ETWTraceListener. -ms.date: "03/30/2017" -ms.assetid: ac99a063-e2d2-40cc-b659-d23c2f783f92 ---- -# ETW Tracing - -This sample demonstrates how to implement End-to-End (E2E) tracing using Event Tracing for Windows (ETW) and the `ETWTraceListener` that is provided with this sample. The sample is based on the [Getting Started](getting-started-sample.md) and includes ETW tracing. - -> [!NOTE] -> The set-up procedure and build instructions for this sample are located at the end of this topic. - - This sample assumes that you are familiar with [Tracing and Message Logging](tracing-and-message-logging.md). - - Each trace source in the tracing model can have multiple trace listeners that determine where and how the data is traced. The type of listener defines the format in which trace data is logged. The following code sample shows how to add the listener to configuration. - -```xml - - - - - - - - - - - - - - - - - - - -``` - - Before using this listener, an ETW Trace Session must be started. This session can be started by using Logman.exe or Tracelog.exe. A SetupETW.bat file is included with this sample so that you can set up the ETW Trace Session along with a CleanupETW.bat file for closing the session and completing the log file. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. For more information about these tools, see - - When using the ETWTraceListener, traces are logged in binary .etl files. With ServiceModel tracing turned on, all generated traces appear in the same file. Use [Service Trace Viewer Tool (SvcTraceViewer.exe)](../service-trace-viewer-tool-svctraceviewer-exe.md) for viewing .etl and .svclog log files. The viewer creates an end-to-end view of the system that makes it possible to trace a message from its source to its destination and point of consumption. - - The ETW Trace Listener supports circular logging. To enable this feature, go to **Start**, **Run** and type `cmd` to start a command console. In the following command, replace the `` parameter with the name of your log file. - -```console -logman create trace Wcf -o -p "{411a0819-c24b-428c-83e2-26b41091702e}" -f bincirc -max 1000 -``` - - The `-f` and `-max` switches are optional. They specify the binary circular format and max log size of 1000MB respectively. The `-p` switch is used to specify the trace provider. In our example, `"{411a0819-c24b-428c-83e2-26b41091702e}"` is the GUID for "XML ETW Sample Provider". - - To start the session, type in the following command. - -```console -logman start Wcf -``` - - After you have finished logging, you can stop the session with the following command. - -```console -logman stop Wcf -``` - - This process generates binary circular logs that you can process with your tool of choice, including [Service Trace Viewer Tool (SvcTraceViewer.exe)](../service-trace-viewer-tool-svctraceviewer-exe.md) or Tracerpt. - - You can also review the [Circular Tracing](circular-tracing.md) sample for more information on an alternative listener to perform circular logging. - -### To set up, build, and run the sample - -1. Be sure you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - - > [!NOTE] - > To use the RegisterProvider.bat, SetupETW.bat and CleanupETW.bat commands, you must run under a local administrator account. If you are using Windows Vista or later, you must also run the command prompt with elevated privileges. To do so, right-click the command prompt icon, then click **Run as administrator**. - -3. Before running the sample, run RegisterProvider.bat on the client and server. This sets up the resulting ETWTracingSampleLog.etl file to generate traces that can be read by the Service Trace Viewer. This file can be found in the C:\logs folder. If this folder does not exist, it must be created or no traces are generated. Then, run SetupETW.bat on the client and server computers to begin the ETW Trace Session. The SetupETW.bat file can be found under the CS\Client folder. - -4. To run the sample in a single- or cross-computer configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -5. When the sample is completed, run CleanupETW.bat to complete the creation of the ETWTracingSampleLog.etl file. - -6. Open the ETWTracingSampleLog.etl file from within the Service Trace Viewer. You will be prompted to save the binary formatted file as a .svclog file. - -7. Open the newly created .svclog file from within the Service Trace Viewer to view the ETW and ServiceModel traces. - -> [!IMPORTANT] -> The samples may already be installed on your computer. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Management\AnalyticTrace` - -## See also - -- [AppFabric Monitoring Samples](/previous-versions/appfabric/ff383407(v=azure.10)) diff --git a/docs/framework/wcf/samples/expected-exceptions.md b/docs/framework/wcf/samples/expected-exceptions.md deleted file mode 100644 index fa70a24e04171..0000000000000 --- a/docs/framework/wcf/samples/expected-exceptions.md +++ /dev/null @@ -1,77 +0,0 @@ ---- -description: "Learn more about: Expected Exceptions" -title: "Expected Exceptions" -ms.date: "03/30/2017" -ms.assetid: 299a6987-ae6b-43c6-987f-12b034b583ae ---- -# Expected Exceptions - -This sample demonstrates how to catch expected exceptions when using a typed client. This sample is based on the [Getting Started](getting-started-sample.md) that implements a calculator service. In this sample, the client is a console application (.exe) and the service is hosted by Internet Information Services (IIS). - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - - This sample demonstrates catching and handling the two expected exception types that correct programs must handle: `TimeoutException` and `CommunicationException`. - - Exceptions that are thrown from communication methods on a Windows Communication Foundation (WCF) client are either expected or unexpected. Unexpected exceptions include catastrophic failures like `OutOfMemoryException` and programming errors like `ArgumentNullException` or `InvalidOperationException`. Typically there is no useful way to handle unexpected errors, so typically you should not catch them when calling a WCF client communication method. - - Expected exceptions from communication methods on a WCF client include `TimeoutException`, `CommunicationException`, and any derived class of `CommunicationException`. These indicate a problem during communication that can be safely handled by aborting the WCF client and reporting a communication failure. Because external factors can cause these errors in any application, correct applications must catch these exceptions and recover when they occur. - - There are several derived classes of `CommunicationException` that a client can throw. In some cases, applications also catch some of these to do special handling, but let the others be handled as a `CommunicationException`. This can be accomplished by catching the more specific exception type first and then catching `CommunicationException` in a later catch-clause. - - Code that calls a client communication method must catch the `TimeoutException` and `CommunicationException`. One way to handle such errors is to abort the client and report the communication failure. - -```csharp -try -{ - ... - double result = client.Add(value1, value2); - ... - client.Close(); -} -catch (TimeoutException exception) -{ - Console.WriteLine("Got {0}", exception.GetType()); - client.Abort(); -} -catch (CommunicationException exception) -{ - Console.WriteLine("Got {0}", exception.GetType()); - client.Abort(); -} -``` - - If an expected exception occurs, the client may or may not be usable afterwards. To determine if the client is still usable, check that the `State` property is `CommunicationState`.Opened. If it is still opened, then it is still usable. Otherwise you should abort the client and release all references to it. - -> [!CAUTION] -> You may observe that clients that have a session are often no longer usable after an exception, and clients that do not have a session are often still usable after an exception. However, neither of these is guaranteed, so if you want to try to continue using the client after an exception your application should check the `State` property to verify the client is still opened. - - When you run the sample, the operation responses and exceptions are displayed in the client console window. - - The client process runs two scenarios, each of which attempts to call `Add` followed by `Divide`. The first scenario simulates a network issue by aborting the client before making the call to `Divide`. The second scenario causes a timeout condition by setting the timeout too short for the method to complete. The expected output from the client process is: - -```output -Add(100,15.99) = 115.99 -Simulated network problem occurs... -Got System.ServiceModel.CommunicationObjectAbortedException -Add(100,15.99) = 115.99 -Set timeout too short for method to complete... -Got System.TimeoutException -``` - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Client\ExpectedExceptions` diff --git a/docs/framework/wcf/samples/extended-protection-policy.md b/docs/framework/wcf/samples/extended-protection-policy.md deleted file mode 100644 index 63565d56ee795..0000000000000 --- a/docs/framework/wcf/samples/extended-protection-policy.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -description: "Learn more about: Extended Protection Policy" -title: "Extended Protection Policy" -ms.date: "03/30/2017" -ms.assetid: e2616a10-317e-4c34-8023-0c015a80a82f ---- -# Extended Protection Policy - -Extended Protection is a security initiative for protecting against man-in-the-middle (MITM) attacks. A MITM attack is a security threat in which a MITM takes a client’s credentials and forwards it to a server. - -## Demonstrates - - Extended protection - -## Discussion - - When applications authenticate using Kerberos, Digest or NTLM using HTTPS, a Transport Level Security (TLS) channel is first established and then authentication takes place using the secure channel. However, there is no binding between the session key generated by SSL and the session key generated during authentication. Any MITM can establish itself between the client and the server and start forwarding the requests from the client, even when the transport channel itself is secure, because the server has no way of knowing whether the secure channel has been established from the client or a MITM. The solution in this scenario is to bind the outer TLS channel with the inner authentication channel such that the server can detect if there is a MITM. - -> [!NOTE] -> This sample only works when hosted on IIS and cannot work on Cassini – Visual Studio Development Server because Cassini does not support HTTPS. - -> [!NOTE] -> This feature is currently only available on Windows 7. The following steps are specific to Windows 7. - -#### To set up, build, and run the sample - -1. Install Internet Information Services from **Control Panel**, **Add/Remove Programs**, **Windows Features**. - -2. Install **Windows Authentication** in **Windows Features**, **Internet Information Services**, **World Wide Web Services**, **Security**, and **Windows Authentication**. - -3. Install **Windows Communication Foundation HTTP Activation** in **Windows Features**, **Microsoft .NET Framework 3.5.1**, and **Windows Communication Foundation HTTP Activation**. - -4. This sample requires the client to establish a secure channel with the server, so it requires the presence of a server certificate which can be installed from Internet Information Services (IIS) Manager. - - 1. Open IIS Manager. Open **Server certificates**, which appears in the **Feature View** tab when the root node (machine name) is selected. - - 2. For the purpose of testing this sample, create a self-signed certificate. If you do not want Internet Explorer to prompt you about the certificate not being secure, install the certificate in the Trusted Certificate Root authority store. - -5. Open the **Actions** pane for the default Web site. Click **Edit Site**, **Bindings**. Add HTTPS as a type if not already present, with port number 443. Assign the SSL certificate created in the preceding step. - -6. Build the service. This creates a virtual directory in IIS, and copies the .dll, .svc and .config files as required for the service to be Web hosted. - -7. Open IIS Manager. Right-click the virtual directory (**ExtendedProtection**), which was created in the preceding step. Select **Convert to Application**. - -8. Open the **Authentication** module in IIS Manager for this virtual directory and enable **Windows Authentication**. - -9. Open **Advanced Settings** under **Windows Authentication** for this virtual directory and set it to **Required**. - -10. You can test the service by accessing the HTTPS URL from a browser window (Provide a fully-qualified domain name). If you want to access this URL from a remote machine, make sure that the firewall is opened for all incoming HTTP and HTTPS connections. - -11. Open the client configuration file and provide a fully-qualified domain name for the client or endpoint address attribute that replaces `<>`. - -12. Run the client. The client communicates with the service, which establishes a secure channel and uses extended protection. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Services\Security\ExtendedProtection` diff --git a/docs/framework/wcf/samples/extending-control-over-error-handling-and-reporting.md b/docs/framework/wcf/samples/extending-control-over-error-handling-and-reporting.md deleted file mode 100644 index 1b5a5f3fb6e18..0000000000000 --- a/docs/framework/wcf/samples/extending-control-over-error-handling-and-reporting.md +++ /dev/null @@ -1,155 +0,0 @@ ---- -description: "Learn more about: Extending Control Over Error Handling and Reporting" -title: "Extending Control Over Error Handling and Reporting" -ms.date: "03/30/2017" -ms.assetid: 45f996a7-fa00-45cb-9d6f-b368f5778aaa ---- -# Extending Control Over Error Handling and Reporting - -This sample demonstrates how to extend control over error handling and error reporting in a Windows Communication Foundation (WCF) service using the interface. The sample is based on the [Getting Started](getting-started-sample.md) with some additional code added to the service to handle errors. The client forces several error conditions. The service intercepts the errors and logs them in a file. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - - Services can intercept errors, perform processing, and affect how errors are reported using the interface. The interface has two methods that can be implemented: and . The method allows you to add, modify, or suppress a fault message that is generated in response to an exception. The method allows error processing to take place in the event of an error and controls whether additional error handling can run. - - In this sample, the `CalculatorErrorHandler` type implements the interface. In the - - method, the `CalculatorErrorHandler` writes a log of the error to an Error.txt text file in c:\logs. Note that the sample logs the fault and does not suppress it, allowing it to be reported back to the client. - -```csharp -public class CalculatorErrorHandler : IErrorHandler -{ - // Provide a fault. The Message fault parameter can be replaced, or set to - // null to suppress reporting a fault. - - public void ProvideFault(Exception error, MessageVersion version, ref Message fault) - { - } - - // HandleError. Log an error, then allow the error to be handled as usual. - // Return true if the error is considered as already handled - - public bool HandleError(Exception error) - { - using (TextWriter tw = File.AppendText(@"c:\logs\error.txt")) - { - if (error != null) - { - tw.WriteLine("Exception: " + error.GetType().Name + " - " + error.Message); - } - tw.Close(); - } - return true; - } -} -``` - - The `ErrorBehaviorAttribute` exists as a mechanism to register an error handler with a service. This attribute takes a single type parameter. That type should implement the interface and should have a public, empty constructor. The attribute then instantiates an instance of that error handler type and installs it into the service. It does this by implementing the interface and then using the method to add instances of the error handler to the service. - -```csharp -// This attribute can be used to install a custom error handler for a service. -public class ErrorBehaviorAttribute : Attribute, IServiceBehavior -{ - Type errorHandlerType; - - public ErrorBehaviorAttribute(Type errorHandlerType) - { - this.errorHandlerType = errorHandlerType; - } - - void IServiceBehavior.Validate(ServiceDescription description, ServiceHostBase serviceHostBase) - { - } - - void IServiceBehavior.AddBindingParameters(ServiceDescription description, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection endpoints, BindingParameterCollection parameters) - { - } - - void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase) - { - IErrorHandler errorHandler; - - try - { - errorHandler = (IErrorHandler)Activator.CreateInstance(errorHandlerType); - } - catch (MissingMethodException e) - { - throw new ArgumentException("The errorHandlerType specified in the ErrorBehaviorAttribute constructor must have a public empty constructor.", e); - } - catch (InvalidCastException e) - { - throw new ArgumentException("The errorHandlerType specified in the ErrorBehaviorAttribute constructor must implement System.ServiceModel.Dispatcher.IErrorHandler.", e); - } - - foreach (ChannelDispatcherBase channelDispatcherBase in serviceHostBase.ChannelDispatchers) - { - ChannelDispatcher channelDispatcher = channelDispatcherBase as ChannelDispatcher; - channelDispatcher.ErrorHandlers.Add(errorHandler); - } - } -} -``` - - The sample implements a calculator service. The client deliberately causes two errors to occur on the service by providing parameters with illegal values. The `CalculatorErrorHandler` uses the interface to log the errors to a local file and then allows them to be reported back to the client. The client forces a divide by zero and an argument-out-of-range condition. - -```csharp -try -{ - Console.WriteLine("Forcing an error in Divide"); - // Call the Divide service operation - trigger a divide by 0 error. - value1 = 22; - value2 = 0; - result = proxy.Divide(value1, value2); - Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result); -} -catch (FaultException e) -{ - Console.WriteLine("FaultException: " + e.GetType().Name + " - " + e.Message); -} -catch (Exception e) -{ - Console.WriteLine("Exception: " + e.GetType().Name + " - " + e.Message); -} -``` - - When you run the sample, the operation requests and responses are displayed in the client console window. You see the division by zero and the argument-out-of-range conditions being reported as faults. Press ENTER in the client window to shut down the client. - -```console -Add(15,3) = 18 -Subtract(145,76) = 69 -Multiply(9,81) = 729 -Forcing an error in Divide -FaultException: FaultException - Invalid Argument: The second argument must not be zero. -Forcing an error in Factorial -FaultException: FaultException - Invalid Argument: The argument must be greater than zero. - -Press to terminate client. -``` - - The file c:\logs\errors.txt contains the information logged about the errors by the service. Note that for the service to write to the directory you must make sure that the process under which the service is running (typically ASP.NET or Network Service) has permission to write to the directory. - -```txt -Fault: Reason = Invalid Argument: The second argument must not be zero. -Fault: Reason = Invalid Argument: The argument must be greater than zero. -``` - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. Ensure you have created the c:\logs directory for the error.txt file. Or modify the file name used in `CalculatorErrorHandler.HandleError`. - -4. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Extensibility\ErrorHandling` diff --git a/docs/framework/wcf/samples/extending-tracing.md b/docs/framework/wcf/samples/extending-tracing.md deleted file mode 100644 index 6a4f7d1dbb66a..0000000000000 --- a/docs/framework/wcf/samples/extending-tracing.md +++ /dev/null @@ -1,101 +0,0 @@ ---- -description: "Learn more about: Extend tracing" -title: "Extending Tracing" -ms.date: "03/30/2017" -ms.assetid: 2b971a99-16ec-4949-ad2e-b0c8731a873f ---- -# Extend tracing - -This sample demonstrates how to extend the Windows Communication Foundation (WCF) tracing feature by writing user-defined activity traces in client and service code. Writing user-defined activity traces allows the user to create trace activities and group traces into logical units of work. It is also possible to correlate activities through transfers (within the same endpoint) and propagation (across endpoints). In this sample, tracing is enabled for both the client and the service. For more information about how to enable tracing in client and service configuration files, see [Tracing and Message Logging](tracing-and-message-logging.md). - - This sample is based on the [Getting Started](getting-started-sample.md). - -> [!NOTE] -> The set-up procedure and build instructions for this sample are located at the end of this topic. - -> [!IMPORTANT] -> The samples may already be installed on your computer. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Management\ExtendingTracing` - -## Tracing and Activity Propagation - - User-defined activity tracing allows the user to create their own trace activities to group traces into logical units of work, correlate activities through transfers and propagation, and lessen the performance cost of WCF tracing (for example, the disk space cost of a log file). - -### Add custom sources - - User-defined traces can be added to both client and service code. Adding trace sources to the client or service configuration files allows for these custom traces to be recorded and displayed in the [Service Trace Viewer Tool (SvcTraceViewer.exe)](../service-trace-viewer-tool-svctraceviewer-exe.md). The following code shows how to add a user-defined trace source named `ServerCalculatorTraceSource` to the configuration file. - -```xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -.... -``` - -### Correlate activities - - To correlate activities directly across endpoints, the `propagateActivity` attribute must be set to `true` in the `System.ServiceModel` trace source. Also, to propagate traces without going through WCF activities, ServiceModel Activity Tracing must be turned off. This can be seen in the following code example. - -> [!NOTE] -> Turning off ServiceModel Activity Tracing is not the same as having the trace level, denoted by the `switchValue` property, set to off. - -```xml - - - - - ... - - - - -``` - -### Lessen performance cost - - Setting `ActivityTracing` to off in the `System.ServiceModel` trace source generates a trace file that contains only user-defined activity traces, without any of the ServiceModel activity traces included. Excluding ServiceModel activity traces results in a much smaller log file. However, the opportunity to correlate WCF processing traces is lost. - -## Set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-computer configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -## See also - -- [AppFabric Monitoring Samples](/previous-versions/appfabric/ff383407(v=azure.10)) diff --git a/docs/framework/wcf/samples/extensibility.md b/docs/framework/wcf/samples/extensibility.md deleted file mode 100644 index 9f6ae38edaf67..0000000000000 --- a/docs/framework/wcf/samples/extensibility.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -description: "Learn more about: Extensibility" -title: "Extensibility" -ms.date: "03/30/2017" -ms.assetid: cd7ddffc-a261-44aa-bd50-33c1c74f0df0 ---- -# Extensibility - -This section contains samples that deal with custom extensibility and other features of Windows Communication Foundation (WCF). - -## In This Section - - [Channels Extensibility](channels-extensibility.md) - Demonstrates custom channels. - - [Discovery Extensibility](/previous-versions/dotnet/netframework-4.0/dd807503(v%3dvs.100)) - Demonstrates custom discovery. - - [Instancing Extensibility](instancing-extensibility.md) - Demonstrates custom extensibility. - - [Interop Extensibility](interop-extensibility.md) - Demonstrates custom interoperability. - - [Message Encoder Extensibility](message-encoder-extensibility.md) - Demonstrates custom message encoding. - - [Metadata Extensibility](metadata-extensibility.md) - Demonstrates custom metadata. - - [Security Extensibility](security-extensibility.md) - Demonstrates custom security. - - [Syndication Extensibility Samples](syndication-extensibility-samples.md) - Demonstrates custom syndication. - - [Transport Extensibility](transport-extensibility.md) - Demonstrates custom transports. - - [Operation Formatter and Operation Selector](operation-formatter-and-operation-selector.md) - Demonstrates how extensibility points can consume custom message data formats. - - [Custom Message Filter](custom-message-filter.md) - demonstrates how to replace the message filters that Windows Communication Foundation (WCF) uses to dispatch messages to endpoints. - - [Custom Service Host](custom-service-host.md) - Demonstrates how to use a custom derivative of the class to alter the run-time behavior of a service. - - [DataContract Surrogate](datacontract-surrogate.md) - Demonstrates how processes like serialization, deserialization, schema export, and schema import can be customized using a data contract surrogate class. - - [Extending Control Over Error Handling and Reporting](extending-control-over-error-handling-and-reporting.md) - Demonstrates how to extend control over error handling and error reporting in a WCF service using the interface. - - [Message Inspectors](message-inspectors.md) - Demonstrates how to implement and configure client and service message inspectors. - - [WebContentTypeMapper](webcontenttypemapper-sample.md) - Demonstrates how to map new content types to WCF message body formats. diff --git a/docs/framework/wcf/samples/fault-contract.md b/docs/framework/wcf/samples/fault-contract.md deleted file mode 100644 index e3161f09ff232..0000000000000 --- a/docs/framework/wcf/samples/fault-contract.md +++ /dev/null @@ -1,133 +0,0 @@ ---- -description: "Learn more about: Fault Contract" -title: "Fault Contract" -ms.date: "03/30/2017" -ms.assetid: b31b140e-dc3b-408b-b3c7-10b6fe769725 ---- -# Fault Contract - -The Fault Contract sample demonstrates how to communicate error information from a service to a client. The sample is based on the [Getting Started](getting-started-sample.md), with some additional code added to the service to convert an internal exception to a fault. The client attempts to perform division by zero to force an error condition on the service. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - - The calculator contract has been modified to include a as shown in the following sample code. - -```csharp -[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")] -public interface ICalculator -{ - [OperationContract] - int Add(int n1, int n2); - [OperationContract] - int Subtract(int n1, int n2); - [OperationContract] - int Multiply(int n1, int n2); - [OperationContract] - [FaultContract(typeof(MathFault))] - int Divide(int n1, int n2); -} -``` - - The attribute indicates that the `Divide` operation may return a fault of type `MathFault`. A fault can be of any type that can be serialized. In this case, the `MathFault` is a data contract, as follows: - -```csharp -[DataContract(Namespace="http://Microsoft.ServiceModel.Samples")] -public class MathFault -{ - private string operation; - private string problemType; - - [DataMember] - public string Operation - { - get { return operation; } - set { operation = value; } - } - - [DataMember] - public string ProblemType - { - get { return problemType; } - set { problemType = value; } - } -} -``` - - The `Divide` method throws a exception when a divide by zero exception occurs as shown in the following sample code. This exception results in a fault being sent to the client. - -```csharp -public int Divide(int n1, int n2) -{ - try - { - return n1 / n2; - } - catch (DivideByZeroException) - { - MathFault mf = new MathFault(); - mf.operation = "division"; - mf.problemType = "divide by zero"; - throw new FaultException(mf); - } -} -``` - - The client code forces an error by requesting a division by zero. When you run the sample, the operation requests and responses are displayed in the client console window. You see the division by zero being reported as a fault. Press ENTER in the client window to shut down the client. - -```console -Add(15,3) = 18 -Subtract(145,76) = 69 -Multiply(9,81) = 729 -FaultException: Math fault while doing division. Problem: divide by zero - -Press to terminate client. -``` - - The client does this by catching the appropriate `FaultException` exception: - -```csharp -catch (FaultException e) -{ - Console.WriteLine("FaultException: Math fault while doing " + e.Detail.operation + ". Problem: " + e.Detail.problemType); - client.Abort(); -} -``` - - By default, the details of unexpected exceptions are not sent to the client to prevent details of the service implementation from escaping the secure boundary of the service. `FaultContract` provides a way to describe faults in a contract and mark certain types of exceptions as appropriate for transmission to the client. `FaultException` provides the run-time mechanism for sending faults to consumers. - - However, it is useful to see the internal details of a service failure when debugging. To turn off the secure behavior previously described, you can indicate that the details of every unhandled exception on the server should be included in the fault that is sent to the client. This is accomplished by setting to `true`. You can either set it in code, or in configuration as shown in the following sample. - -```xml - - - - - - - - -``` - - Further, the behavior must be associated with the service by setting the `behaviorConfiguration` attribute of the service in the configuration file to "CalculatorServiceBehavior". - - To catch such faults on the client, the non-generic must be caught. - - This behavior should only be used for debugging purposes and should never be enabled in production. - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Contract\Service\Faults` diff --git a/docs/framework/wcf/samples/federation-sample.md b/docs/framework/wcf/samples/federation-sample.md deleted file mode 100644 index 7dda1438562c4..0000000000000 --- a/docs/framework/wcf/samples/federation-sample.md +++ /dev/null @@ -1,115 +0,0 @@ ---- -description: "Learn more about: Federation Sample" -title: "Federation Sample" -ms.date: "03/30/2017" -ms.assetid: 7e9da0ca-e925-4644-aa96-8bfaf649d4bb ---- -# Federation Sample - -This sample demonstrates federated security. - -## Sample Details - - Windows Communication Foundation (WCF) provides support for deploying federated security architectures through the `wsFederationHttpBinding`. The `wsFederationHttpBinding` provides a secure, reliable, and interoperable binding that involves the use of HTTP as the underlying transport mechanism for request/reply communication, and Text/XML as the wire format for encoding. For more information about Federation in WCF, see [Federation](../feature-details/federation.md). - - The scenario is made up of 4 pieces: - -- BookStore service - -- BookStore STS - -- HomeRealm STS - -- BookStore Client - - The BookStore service supports two operations, `BrowseBooks` and `BuyBook`. It allows anonymous access to the `BrowseBooks` operation, but requires authenticated access to access the `BuyBooks` operation. The authentication takes the form of a token issued by the BookStore STS. The configuration file for the BookStore Service points clients to the BookStore STS using the `wsFederationHttpBinding`. - -```xml - - - - - - - - - - - - - - -``` - - The BookStore STS then requires that clients authenticate using a token issued by the HomeRealm STS. Again, the configuration file for the BookStore STS points clients to the HomeRealm STS using the `wsFederationHttpBinding`. - -```xml - - - - - - - - - - - - - - -``` - - The sequence of events when accessing the `BuyBook` operation is as follows: - -1. The client authenticates to the HomeRealm STS using Windows credentials. - -2. The HomeRealm STS issues a token that can be used to authenticate to the BookStore STS. - -3. The client authenticates to the BookStore STS using the token issued by the HomeRealm STS. - -4. The BookStore STS issues a token that can be used to authenticate to the BookStore Service. - -5. The client authenticates to the BookStore service using the token issued by the BookStore STS. - -6. The client accesses the `BuyBook` operation. - - See the following instructions about how to set up and run this sample. - -> [!NOTE] -> You must have Write permissions to the **wwwroot** directory to run this sample. - -#### To set up, build, and run the sample - -1. Open the SDK command window. In the sample path, run Setup.bat. This creates the virtual directories required for the sample and installs the required certificates with appropriate permissions. - - > [!NOTE] - > The Setup.bat batch file is designed to be run from a Windows SDK Command Prompt. It requires that the MSSDK environment variable point to the directory where the SDK is installed. This environment variable is automatically set within a Windows SDK Command Prompt. On Windows Vista, you must ensure that IIS 6.0 Management Compatibility is installed because the set up uses IIS administrator scripts. Running the set-up script on Windows Vista requires administrator privileges. - -2. Open FederationSample.sln in Visual Studio and select **Build Solution** from the **Build** menu. This builds the common project files, Bookstore service, Bookstore STS, HomeRealm STS, and deploys them in IIS. This also builds the Bookstore client application and places the executable BookStoreClient.exe in the FederationSample\BookStoreClient\bin\Debug folder. - -3. Double-click BookStoreClient.exe. The BookStoreClient window is displayed. - -4. You can browse the books available in the bookstore by clicking **Browse Books**. - -5. To purchase a particular book, select the book in the list and click **Buy Book**. The application starts up and authenticates using Windows authentication with the HomeRealm Security Token Service. - - The sample is configured to allow users to purchase books that cost $15 or less. Attempting to buy books that cost more than $15 results in the client getting an Access Denied message from the Book Store Service. - - > [!NOTE] - > The sample does not update the user’s credit limit after a purchase. You can repeatedly purchase books within the user’s (fixed) credit limit. - -#### To clean up - -1. Run Cleanup.bat. This deletes the virtual directories that were created during set up and also removes the certificates installed during setup. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Scenario\Federation` diff --git a/docs/framework/wcf/samples/feed-formatter-json.md b/docs/framework/wcf/samples/feed-formatter-json.md deleted file mode 100644 index 5782acf8a18d4..0000000000000 --- a/docs/framework/wcf/samples/feed-formatter-json.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -description: "Learn more about: Feed Formatter (JSON)" -title: "Feed Formatter (JSON)" -ms.date: "03/30/2017" -ms.assetid: f9c0b295-55e7-48ea-b308-ba51c7d31143 ---- -# Feed Formatter (JSON) - -This sample shows how to serialize an instance of a class in JavaScript Object Notation (JSON) format by using a custom and the . - -## Architecture of the Sample - - The sample implements a class named `JsonFeedFormatter` that inherits from . The `JsonFeedFormatter` class relies on the to read and write the data in JSON format. Internally, the formatter uses a custom set of data contract types named `JsonSyndicationFeed` and `JsonSyndicationItem` to control the format of the JSON data produced by the serializer. These implementation details are hidden from the end user, allowing calls to be made against the standard and classes. - -## Writing JSON feeds - - Writing a JSON feed can be accomplished by using the `JsonFeedFormatter` (implemented in this sample) with the as shown in the following sample code. - -```csharp -//Basic feed with sample data -SyndicationFeed feed = new SyndicationFeed("Custom JSON feed", "A Syndication extensibility sample", null); -feed.LastUpdatedTime = DateTime.Now; -feed.Items = from s in new string[] { "hello", "world" } -select new SyndicationItem() -{ - Summary = SyndicationContent.CreatePlaintextContent(s) -}; - -//Write the feed out to a MemoryStream in JSON format -DataContractJsonSerializer writeSerializer = new DataContractJsonSerializer(typeof(JsonFeedFormatter)); -writeSerializer.WriteObject(stream, new JsonFeedFormatter(feed)); -``` - -## Reading a JSON feed - - Obtaining a from a stream of JSON-formatted data can be accomplished with the `JsonFeedFormatter` as show in the following code. - - `//Read in the feed using the DataContractJsonSerializer` - - `DataContractJsonSerializer readSerializer = new DataContractJsonSerializer(typeof(JsonFeedFormatter));` - - `JsonFeedFormatter formatter = readSerializer.ReadObject(stream) as JsonFeedFormatter;` - - `SyndicationFeed feedRead = formatter.Feed;` - -#### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -> [!IMPORTANT] -> The samples may already be installed on your computer. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Extensibility\Syndication\JsonFeeds` diff --git a/docs/framework/wcf/samples/findprivatekey.md b/docs/framework/wcf/samples/findprivatekey.md deleted file mode 100644 index 566983dc5ccbd..0000000000000 --- a/docs/framework/wcf/samples/findprivatekey.md +++ /dev/null @@ -1,98 +0,0 @@ ---- -description: "Learn more about: FindPrivateKey sample" -title: "FindPrivateKey sample" -ms.date: "12/04/2017" -helpviewer_keywords: - - "FindPrivateKey" -ms.assetid: 16b54116-0ceb-4413-af0c-753bb2a785a6 ---- -# FindPrivateKey sample - -It can be difficult to find the location and name of the private key file associated with a specific X.509 certificate in the certificate store. The FindPrivateKey.exe tool facilitates this process. - -> [!IMPORTANT] -> FindPrivateKey is a sample that needs to be compiled prior to use. See the [To build the FindPrivateKey project](#to-build-the-findprivatekey-project) section for instructions on how to build the FindPrivateKey tool. - -X.509 certificates are installed by an Administrator or any user in the machine. However, the certificate may be accessed by a service running under a different account. For example, the NETWORK SERVICE account. - -This account may not have access to the private key file because the certificate was not installed by it originally. The FindPrivateKey tool gives you the location of a given X.509 Certificate's private key file. You can add permissions or remove permissions to this file once you know the location of the particular X.509 certificates' private key file. - -The samples that use certificates for security use the FindPrivateKey tool in the *Setup.bat* file. Once the private key file has been found, you can use other tools such as *Cacls.exe* to set the appropriate access rights onto the file. - -When running a Windows Communication Foundation (WCF) service under a user account, such as a self-hosted executable, ensure that the user account has read-only access to the file. When running a WCF service under Internet Information Services (IIS) the default accounts that the service runs under are the NETWORK SERVICE on IIS 7 and earlier versions, or Application Pool Identity on IIS 7.5 and later versions. For more information, see [Application Pool Identities](/iis/manage/configuring-security/application-pool-identities). - -## Examples - -When accessing a certificate for which the process doesn't have read privilege, you see an exception message similar to the following example: - -```output -System.ArgumentException was unhandled -Message="The certificate 'CN=localhost' must have a private key that is capable of key exchange. The process must have access rights for the private key." -Source="System.ServiceModel" -``` - -When this occurs, use the FindPrivateKey tool to find the private key file, and then set the access right for the process that the service is running under. For example, this can be done with the Cacls.exe tool as shown in the following example: - -```console -cacls.exe "C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys\8aeda5eb81555f14f8f9960745b5a40d_38f7de48-5ee9-452d-8a5a-92789d7110b1" /E /G "NETWORK SERVICE":R -``` - -#### To build the FindPrivateKey project - -To download the project, visit [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459). - -1. Open File Explorer and navigate to the *WF_WCF_Samples\WCF\Setup\FindPrivateKey\CS* folder under the directory location where you installed the sample. - -2. Double-click the .sln file icon to open the file in Visual Studio. - -3. In the **Build** menu, select **Rebuild Solution**. - -4. Building the solution generates the file: FindPrivateKey.exe. - -## Conventions—Command-Line entries - - "[*option*]" represents an optional set of parameters. - - "{*option*}" represents a mandatory set of parameters. - - "*option1* | *option2*" represents a choice between sets of options. - - "\<*value*>" represents a parameter value to be entered. - -## Usage - -```console -FindPrivateKey [{ {-n } | {-t } } [-f | -d | -a]] -``` - -Where: - -| Parameter | Description | -|-----------------|-----------------------------------------------------------------------------------| -| `` | The subject name of the certificate | -| `` | The thumbprint of the certificate (You can use the Certmgr.exe tool to find this) | -| `-f` | output file name only | -| `-d` | output directory only | -| `-a` | output absolute file name | - -If no parameters are specified at the command prompt, then help text with this information is displayed. - -## Examples - -This example finds the filename of the certificate with a subject name of "CN=localhost", in the Personal store of the Current User. - -```console -FindPrivateKey My CurrentUser -n "CN=localhost" -``` - -This example finds the filename of the certificate with a subject name of "CN=localhost", in the Personal store of the Current User and output the full directory path. - -```console -FindPrivateKey My CurrentUser -n "CN=localhost" -a -``` - -This example finds the filename of the certificate with a thumbprint of "03 33 98 63 d0 47 e7 48 71 33 62 64 76 5c 4c 9d 42 1d 6b 52", in the Personal store of the Local Computer. - -```console -FindPrivateKey My LocalMachine -t "03 33 98 63 d0 47 e7 48 71 33 62 64 76 5c 4c 9d 42 1d 6b 52" -``` diff --git a/docs/framework/wcf/samples/firewall-instructions.md b/docs/framework/wcf/samples/firewall-instructions.md deleted file mode 100644 index e20604bb2b562..0000000000000 --- a/docs/framework/wcf/samples/firewall-instructions.md +++ /dev/null @@ -1,86 +0,0 @@ ---- -title: "Firewall Instructions" -description: Learn how to enable ports or programs in the firewall for WCF samples. Use one of these procedures, depending on your requirements and security environment. -ms.date: "03/30/2017" -ms.assetid: a7dc429f-65ac-4faf-974a-77d5fb977fe1 ---- -# Firewall instructions - -You must enable several ports or programs in the firewall so that the Windows Communication Foundation (WCF) samples can function. Many of the samples communicate by using ports in the range 8000-8003, and port 9000. The firewall is turned on by default and prevents access to these ports. To enable the firewall for the samples, complete one of the following procedures, depending on your requirements and security environment: - -- Option 1: Interactively enable samples while running. Make no advance changes to your firewall configuration and proceed to start building and running the samples. When a sample is run, a **Windows Security Alert** dialog box appears. The sample program in question can then be added interactively to an unblocked list. With this procedure, you may have to then restart the sample. - -- Option 2: Enable sample programs in advance. Start the **Windows Firewall Control Panel** applet and enable the sample programs you plan to run. You must build the programs first so the executable files exist. You can find more detailed instructions in the following procedure. - -- Option 3: Enable a port range in advance. Start the **Windows Firewall Control Panel** applet and enable ports 80, 443, 8000-8003 and 9000, which are used by the samples. You can find more detailed instructions in the following procedure. This option is less secure than the others because it allows any program to use these ports, not just the samples. - -If you are unsure of which procedure to use, choose the first option. If you are running a firewall from another vendor, you might need to make similar changes. - -> [!IMPORTANT] -> Changing your firewall configuration affects your security. It is recommended that you record the changes you make and remove them when you are finished working with the samples. - -## Enable samples programs in advance - -1. Build the sample. - -2. Choose **Start** > **Run**, and enter `firewall.cpl`. This opens the **Windows Firewall Control Panel** applet. - - > [!NOTE] - > You must have permission to change the Firewall settings to run samples that require the ability to communicate through the Windows Firewall. If some firewall settings are unavailable and your computer is connected to a domain, your system administrator might be controlling these settings through Group Policy. - -3. Complete one of the following operating-specific steps to allow a program through the Windows Firewall: - - - On Windows 7 or Windows Server 2008 R2, click **Allow a program or feature through Windows Firewall**. Click **Change Settings** > **Allow Another Program**. - - - On Windows Vista or Windows Server 2008, click **Allow a program through Windows Firewall**. - -4. On the **Exceptions** tab, click **Add Program**. - -5. Click the **Browse** button and select the executable file of the sample you plan to run. - -6. Repeat steps 4 and 5 until you have added the executable files of all the samples you plan to run. - -7. Click **OK** to close the firewall applet. - -## Enable a port range in advance - -1. Choose **Start** > **Run**, and enter `firewall.cpl`. This opens the **Windows Firewall Control Panel** applet. - -2. On Windows 7 or Windows Server 2008 R2, follow these steps. - - 1. Click **Advanced settings** in the left column of the Windows Firewall window. - - 2. Click **Inbound Rules** in the left column. - - 3. Click **New Rules** in the right column. - - 4. Select **Port** and click **next**. - - 5. Select **TCP** and enter `8000, 8001, 8002, 8003, 9000, 80, 443` in the **Specific local ports** field. - - 6. Click **Next**. - - 7. Select **Allow the connection**, and click **Next** . - - 8. Select **Domain** and **Private**, and click **Next**. - - 9. Name this rule `WCF-WF 4.0 Samples`, and click **Finish**. - - 10. Click **Outbound Rules** and repeat steps c to h. - -3. On Windows Vista or Windows Server 2008, follow these steps. - - 1. Click **Allow a program through Windows Firewall**. - - 2. On the **Exceptions** tab, click **Add Port**. - - 3. Enter a name, enter 8000 as the port number, and select the **TCP** option. - - 4. Click the **Change Scope** button, select the **My Network** (subnet) only option, and click **OK**. - - 5. Repeat steps b to d for ports 8001, 8002, 8003, 9000, 80, and 443. - -4. Click **OK** to close the firewall applet. - -> [!NOTE] -> Remove any firewall exceptions when you are finished working with the samples. To do so, open the **Windows Firewall Control Panel** applet and remove any programs or port entries that were added by the previous procedures. diff --git a/docs/framework/wcf/samples/getting-started-sample.md b/docs/framework/wcf/samples/getting-started-sample.md deleted file mode 100644 index 741aeeed57695..0000000000000 --- a/docs/framework/wcf/samples/getting-started-sample.md +++ /dev/null @@ -1,285 +0,0 @@ ---- -title: "Getting Started Sample" -description: Learn how to implement a typical service and a typical client using WCF. This sample is the basis for all other basic technology samples. -ms.date: "03/30/2017" -dev_langs: - - "csharp" - - "vb" -helpviewer_keywords: - - "basic samples [WCF], getting started" -ms.assetid: 967a3d94-0261-49ff-b85a-20bb07f1af20 ---- - -# Getting Started Sample - -The Getting Started sample demonstrates how to implement a typical service and a typical client using Windows Communication Foundation (WCF). This sample is the basis for all other basic technology samples. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - -> [!IMPORTANT] -> The samples may already be installed on your computer. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\GettingStarted\GettingStarted` - -The service describes the operations it performs in a service contract that it exposes publicly as metadata. The service also contains the code to implement the operations. - -The client contains a definition of the service contract and a proxy class for accessing the service. The proxy code is generated from the service metadata using the [ServiceModel Metadata Utility Tool (Svcutil.exe)](../servicemodel-metadata-utility-tool-svcutil-exe.md). - -On Windows Vista, the service is hosted in the Windows Activation Service (WAS). On Windows XP and Windows Server 2003, it is hosted by Internet Information Services (IIS) and ASP.NET. Hosting a service in IIS or WAS allows the service to be activated automatically when it is accessed for the first time. - -> [!NOTE] -> If you would prefer to get started with a sample that hosts the service in a console application instead of IIS, see the [Self-Host](self-host.md) sample. - -The service and client specify access details in configuration file settings, which provide flexibility at the time of deployment. This includes an endpoint definition that specifies an address, binding, and contract. The binding specifies transport and security details for how the service is to be accessed. - -The service configures a run-time behavior to publish its metadata. - -The service implements a contract that defines a request-reply communication pattern. The contract is defined by the `ICalculator` interface, which exposes math operations (add, subtract, multiply, and divide). The client makes requests to a given math operation and the service replies with the result. The service implements an `ICalculator` contract that is defined in the following code. - -```vb -' Define a service contract. - - Public Interface ICalculator - - Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double - - Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double - - Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double - - Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double - End Interface -``` - -```csharp -// Define a service contract. -[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")] -public interface ICalculator -{ - [OperationContract] - double Add(double n1, double n2); - [OperationContract] - double Subtract(double n1, double n2); - [OperationContract] - double Multiply(double n1, double n2); - [OperationContract] - double Divide(double n1, double n2); -} -``` - -The service implementation calculates and returns the appropriate result, as shown in the following example code. - -```vb -' Service class which implements the service contract. -Public Class CalculatorService -Implements ICalculator -Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Add -Return n1 + n2 -End Function - -Public Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Subtract -Return n1 - n2 -End Function - -Public Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Multiply -Return n1 * n2 -End Function - -Public Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Divide -Return n1 / n2 -End Function -End Class -``` - -```csharp -// Service class that implements the service contract. -public class CalculatorService : ICalculator -{ - public double Add(double n1, double n2) - { - return n1 + n2; - } - public double Subtract(double n1, double n2) - { - return n1 - n2; - } - public double Multiply(double n1, double n2) - { - return n1 * n2; - } - public double Divide(double n1, double n2) - { - return n1 / n2; - } -} -``` - -The service exposes an endpoint for communicating with the service, defined using a configuration file (Web.config), as shown in the following sample configuration. - -```xaml - - - - - ... - - -``` - -The service exposes the endpoint at the base address provided by the IIS or WAS host. The binding is configured with a standard , which provides HTTP communication and standard Web service protocols for addressing and security. The contract is the `ICalculator` implemented by the service. - -As configured, the service can be accessed at `http://localhost/servicemodelsamples/service.svc` by a client on the same computer. For clients on remote computers to access the service, a fully-qualified domain name must be specified instead of localhost. - -The framework does not expose metadata by default. As such, the service turns on the and exposes a metadata exchange (MEX) endpoint at `http://localhost/servicemodelsamples/service.svc/mex`. The following configuration demonstrates this. - -```xaml - - - - ... - - - - - - - - - - - - - - - -``` - -The client communicates using a given contract type by using a client class that is generated by the [ServiceModel Metadata Utility Tool (Svcutil.exe)](../servicemodel-metadata-utility-tool-svcutil-exe.md). This generated client is contained in the file generatedClient.cs or generatedClient.vb. This utility retrieves metadata for a given service and generates a client for use by the client application to communicate using a given contract type. The hosted service must be available to generate the client code, because the service is used to retrieve the updated metadata. - - Run the following command from the SDK command prompt in the client directory to generate the typed proxy: - -```console -svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" http://localhost/servicemodelsamples/service.svc/mex /out:generatedClient.cs -``` - -To generate client in Visual Basic type the following from the SDK command prompt: - -`Svcutil.exe /n:"http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples" http://localhost/servicemodelsamples/service.svc/mex /l:vb /out:generatedClient.vb` - -By using the generated client, the client can access a given service endpoint by configuring the appropriate address and binding. Like the service, the client uses a configuration file (App.config) to specify the endpoint with which it wants to communicate. The client endpoint configuration consists of an absolute address for the service endpoint, the binding, and the contract, as shown in the following example. - -```xaml - - - -``` - -The client implementation instantiates the client and uses the typed interface to begin communicating with the service, as shown in the following example code. - -```vb -' Create a client -Dim client As New CalculatorClient() - -' Call the Add service operation. - Dim value1 = 100.0R - Dim value2 = 15.99R - Dim result = client.Add(value1, value2) -Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result) - -' Call the Subtract service operation. -value1 = 145.00R -value2 = 76.54R -result = client.Subtract(value1, value2) -Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result) - -' Call the Multiply service operation. -value1 = 9.00R -value2 = 81.25R -result = client.Multiply(value1, value2) -Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result) - -' Call the Divide service operation. -value1 = 22.00R -value2 = 7.00R -result = client.Divide(value1, value2) -Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result) - -'Closing the client gracefully closes the connection and cleans up resources -``` - -```csharp -// Create a client. -CalculatorClient client = new CalculatorClient(); - -// Call the Add service operation. -double value1 = 100.00D; -double value2 = 15.99D; -double result = client.Add(value1, value2); -Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result); - -// Call the Subtract service operation. -value1 = 145.00D; -value2 = 76.54D; -result = client.Subtract(value1, value2); -Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result); - -// Call the Multiply service operation. -value1 = 9.00D; -value2 = 81.25D; -result = client.Multiply(value1, value2); -Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result); - -// Call the Divide service operation. -value1 = 22.00D; -value2 = 7.00D; -result = client.Divide(value1, value2); -Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result); - -//Closing the client releases all communication resources. -client.Close(); -``` - -When you run the sample, the operation requests and responses are displayed in the client console window. Press ENTER in the client window to shut down the client. - -```output -Add(100,15.99) = 115.99 -Subtract(145,76.54) = 68.46 -Multiply(9,81.25) = 731.25 -Divide(22,7) = 3.14285714285714 - -Press to terminate client. -``` - -The Getting Started sample shows the standard way to create a service and client. The other [Basic](basic-sample.md) build on this sample to demonstrate specific product features. - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-computer configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -## See also - -- [How to: Host a WCF Service in a Managed Application](../how-to-host-a-wcf-service-in-a-managed-application.md) -- [How to: Host a WCF Service in IIS](../feature-details/how-to-host-a-wcf-service-in-iis.md) diff --git a/docs/framework/wcf/samples/hello-world-with-the-routing-service.md b/docs/framework/wcf/samples/hello-world-with-the-routing-service.md deleted file mode 100644 index 18063ffd87d3f..0000000000000 --- a/docs/framework/wcf/samples/hello-world-with-the-routing-service.md +++ /dev/null @@ -1,61 +0,0 @@ ---- -description: "Learn more about: Hello World with the Routing Service" -title: "Hello World with the Routing Service" -ms.date: "03/30/2017" -ms.assetid: 0f4b0d5b-6522-4ad5-9f3a-baa78316d7d1 ---- -# Hello World with the Routing Service - -This sample demonstrates the Windows Communication Foundation (WCF) Routing Service. The Routing Service is a WCF component that makes it easy to include a content-based router in your application. This sample adapts the standard WCF Calculator Sample to communicate using the Routing Service. In this sample, the Calculator client is configured to send messages to an endpoint exposed by the router. The Routing Service is configured to accept all messages sent to it and to forward them to an endpoint that corresponds to the Calculator service. Thus messages sent from the client are received by the router and re-routed to the actual Calculator service. Messages from the Calculator service are sent back to the router, which in turn passes them back to the Calculator client. - -### To use this sample - -1. Using Visual Studio 2012, open HelloRoutingService.sln. - -2. Press F5 or CTRL+SHIFT+B. - - > [!NOTE] - > If you press F5, the Calculator Client automatically starts. If you press CTRL+SHIFT+B (build), you must start following applications yourself. - > - > 1. Calculator client (./CalculatorClient/bin/client.exe - > 2. Calculator service (./CalculatorService/bin/service.exe) - > 3. Routing service (./RoutingService/bin/RoutingService.exe) - -3. Press ENTER to start the client. - - You should see the following output: - - ```console - Add(100,15.99) = 115.99 - - Subtract(145,76.54) = 68.46 - - Multiply(9,81.25) = 731.25 - - Divide(22,7) = 3.14285714285714 - ``` - -## Configurable via Code or App.Config - - The sample ships configured to use an App.config file to define the router’s behavior. You can also change the name of the App.config file to something else so that it is not recognized and uncomment the method call to ConfigureRouterViaCode(). Either method results in the same behavior from the router. - -### Scenario - - This sample demonstrates the router acting as a basic message pump. The routing service acts as a transparent proxy node configured to pass messages directly to a preconfigured set of destination endpoints. - -### Real World Scenario - - Contoso wants to increase the flexibility it has in the naming, addressing, configuration, and security of its services. To do this, they place a basic message pump in front of their services to act as a public facing endpoint. This allows them to place additional security in front of their actual services and make it easier to implement scaled out solutions or service versioning at a later date. - -> [!IMPORTANT] -> The samples may already be installed on your computer. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\RoutingServices\HelloRoutingService` - -## See also - -- [AppFabric Hosting and Persistence Samples](/previous-versions/appfabric/ff383418(v=azure.10)) diff --git a/docs/framework/wcf/samples/hosting.md b/docs/framework/wcf/samples/hosting.md deleted file mode 100644 index f1e0cfbe5cf4d..0000000000000 --- a/docs/framework/wcf/samples/hosting.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -description: "Learn more about: Hosting" -title: "WCF hosting samples" -ms.date: "03/30/2017" -ms.assetid: 8a6ec5d4-d191-49cc-bb0f-a07639dc60d4 ---- -# Hosting - -This section contains samples that demonstrate hosting Windows Communication Foundation (WCF) services. - -## In This Section - - [Windows Process Activation](windows-process-activation.md) - Demonstrates service activation through network protocols. - - [SystemWebRouting Integration Sample](systemwebrouting-integration-sample.md) - Demonstrates the hosting layer’s integration with the classes in the namespace. - - [ASP.NET Compatibility](aspnet-compatibility.md) - Demonstrates how to enable ASP.NET Compatibility mode in WCF. - - [IIS Hosting Using Inline Code](iis-hosting-using-inline-code.md) - Demonstrates how to implement a service hosted by Internet Information Services (IIS), where the service code is contained in-line in a .svc file and is compiled on demand. - - [Windows Service Host](windows-service-host.md) - Demonstrates a WCF service hosted in a managed Windows Service. - - [Self-Host](self-host.md) - Demonstrates how to implement a self-hosted service in a console application. diff --git a/docs/framework/wcf/samples/httpcookiesession.md b/docs/framework/wcf/samples/httpcookiesession.md deleted file mode 100644 index 5e852b24f44aa..0000000000000 --- a/docs/framework/wcf/samples/httpcookiesession.md +++ /dev/null @@ -1,171 +0,0 @@ ---- -description: "Learn more about: HttpCookieSession" -title: "HttpCookieSession" -ms.date: "03/30/2017" -ms.assetid: 101cb624-8303-448a-a3af-933247c1e109 ---- -# HttpCookieSession - -This sample demonstrates how to build a custom protocol channel to use HTTP cookies for session management. This channel enables communication between Windows Communication Foundation (WCF) services and ASMX clients or between WCF clients and ASMX services. - - When a client calls a Web method in an ASMX Web service that is session-based, the ASP.NET engine does the following: - -- Generates a unique ID (session ID). - -- Generates the session object and associates it with the unique ID. - -- Adds the unique ID to a Set-Cookie HTTP response header and sends it to the client. - -- Identifies the client on subsequent calls based on the session ID it sends to it. - - The client includes this session ID in its subsequent requests to the server. The server uses the session ID from the client to load the appropriate session object for the current HTTP context. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Extensibility\Channels\HttpCookieSession` - -## HttpCookieSession Channel Message Exchange Pattern - - This sample enables sessions for ASMX-like scenarios. At the bottom of our channel stack, we have the HTTP transport that supports and . It is the job of the channel to provide sessions to the higher levels of the channel stack. The sample implements two channels, ( and ) that support sessions. - -## Service Channel - - The sample provides a service channel in the `HttpCookieReplySessionChannelListener` class. This class implements the interface and converts the channel from lower in the channel stack to a . This process can be divided into the following parts: - -- When the channel listener is opened, it accepts an inner channel from its inner listener. Because the inner listener is a datagram listener and the lifetime of an accepted channel is decoupled from the lifetime of the listener, we can close the inner listener and only hold on to the inner channel - - ```csharp - this.innerChannelListener.Open(timeoutHelper.RemainingTime()); - this.innerChannel = this.innerChannelListener.AcceptChannel(timeoutHelper.RemainingTime()); - this.innerChannel.Open(timeoutHelper.RemainingTime()); - this.innerChannelListener.Close(timeoutHelper.RemainingTime()); - ``` - -- When the open process completes, we set up a message loop to receive messages from the inner channel. - - ```csharp - IAsyncResult result = BeginInnerReceiveRequest(); - if (result != null && result.CompletedSynchronously) - { - // do not block the user thread - this.completeReceiveCallback ??= new WaitCallback(CompleteReceiveCallback); - ThreadPool.QueueUserWorkItem(this.completeReceiveCallback, result); - } - ``` - -- When a message arrives, the service channel examines the session identifier and de-multiplexes to the appropriate session channel. The channel listener maintains a dictionary that maps the session identifiers to the session channel instances. - - ```csharp - Dictionary channelMapping; - ``` - - The `HttpCookieReplySessionChannel` class implements . Higher levels of the channel stack call the method to read requests for this session. Each session channel has a private message queue that is populated by the service channel. - -```csharp -InputQueue requestQueue; -``` - - In the case when someone calls the method and there are no messages in the message queue, the channel waits for a specified amount of time before shutting itself down. This cleans up the session channels created for non-WCF clients. - - We use the `channelMapping` to track the `ReplySessionChannels`, and we do not close our underlying `innerChannel` until all the accepted channels have been closed. This way `HttpCookieReplySessionChannel` can exist beyond the lifetime of `HttpCookieReplySessionChannelListener`. We also do not have to worry about the listener getting garbage collected underneath us because the accepted channels keep a reference to their listener through the `OnClosed` callback. - -## Client channel - - The corresponding client channel is in the `HttpCookieSessionChannelFactory` class. During channel creation, the channel factory wraps the inner request channel with an `HttpCookieRequestSessionChannel`. The `HttpCookieRequestSessionChannel` class forwards the calls to the underlying request channel. When the client closes the proxy, `HttpCookieRequestSessionChannel` sends a message to the service that indicates that the channel is being closed. Thus, the service channel stack can gracefully shutdown the session channel that is in use. - -## Binding and Binding Element - - After creating the service and client channels, the next step is to integrate them into the WCF runtime. Channels are exposed to WCF through bindings and binding elements. A binding consists of one or many binding elements. WCF offers several system-defined bindings; for example, BasicHttpBinding or WSHttpBinding. The `HttpCookieSessionBindingElement` class contains the implementation for the binding element. It overrides the channel listener and channel factory creation methods to do the necessary channel listener or channel factory instantiations. - - The sample uses policy assertions for the service description. This allows the sample to publish its channel requirements to other clients that can consume the service. For example, this binding element publishes policy assertions to let potential clients know that it supports sessions. Because the sample enables the `ExchangeTerminateMessage` property in the binding element configuration, it adds the necessary assertions to show that the service supports an extra message exchange action to terminate the session conversation. Clients can then use this action. The following WSDL code shows the policy assertions created from the `HttpCookieSessionBindingElement`. - -```xml - - - - - - - - -``` - - The `HttpCookieSessionBinding` class is a system-provided binding that uses the binding element described previously. - -## Adding the Channel to the Configuration System - - The sample provides two classes that expose the sample channel through configuration. The first is a for the `HttpCookieSessionBindingElement`. The bulk of the implementation is delegated to the `HttpCookieSessionBindingConfigurationElement`, which derives from . The `HttpCookieSessionBindingConfigurationElement` has properties that correspond to the properties on `HttpCookieSessionBindingElement`. - -### Binding Element Extension Section - - The section `HttpCookieSessionBindingElementSection` is a that exposes `HttpCookieSessionBindingElement` to the configuration system. With a few overrides the configuration section name, the type of the binding element and how to create the binding element are defined. We can then register the extension section in a configuration file as follows: - -```xml - - - - - - - - - - - - - - - - - - - -``` - -## Test Code - - Test code for using this sample transport is available in the Client and Service directories. It consists of two tests—one test uses a binding with `allowCookies` set to `true` on the client. The second test enables explicit shutdown (using the terminate message exchange) on the binding. - - When you run the sample, you should see the following output: - -```console -Simple binding: -AddItem(10000,2): ItemCount=2 -AddItem(10550,5): ItemCount=7 -RemoveItem(10550,2): ItemCount=5 -Items -10000, 2 -10550, 3 -Smart binding: -AddItem(10000,2): ItemCount=2 -AddItem(10550,5): ItemCount=7 -RemoveItem(10550,2): ItemCount=5 -Items -10000, 2 -10550, 3 - -Press to terminate client. -``` - -#### To set up, build, and run the sample - -1. Install ASP.NET 4.0 using the following command. - - ```console - %windir%\Microsoft.NET\Framework\v4.0.XXXXX\aspnet_regiis.exe /i /enable - ``` - -2. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -3. To build the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -4. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). diff --git a/docs/framework/wcf/samples/iis-hosting-using-inline-code.md b/docs/framework/wcf/samples/iis-hosting-using-inline-code.md deleted file mode 100644 index 0329fe4e90eaa..0000000000000 --- a/docs/framework/wcf/samples/iis-hosting-using-inline-code.md +++ /dev/null @@ -1,94 +0,0 @@ ---- -description: "Learn more about: IIS Hosting Using Inline Code" -title: "IIS Hosting Using Inline Code" -ms.date: "03/30/2017" -helpviewer_keywords: - - "Web hosted service" - - "IIS Hosting Using Inline Code Sample [Windows Communication Foundation]" -ms.assetid: 56fe3687-a34b-4661-8e30-b33770f413fa ---- -# IIS Hosting Using Inline Code - -This sample demonstrates how to implement a service hosted by Internet Information Services (IIS), where the service code is contained in-line in a .svc file and is compiled on demand. Service code can also be implemented directly in source code files located in the application's \App_Code directory, or compiled into assembly deployed in \bin. This sample does not demonstrate these techniques. - -> [!NOTE] -> The set-up procedure and build instructions for this sample are located at the end of this topic. - -> [!IMPORTANT] -> The samples may already be installed on your computer. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Services\Hosting\WebHost\InlineCode` - -The sample demonstrates a typical service that implements a contract that defines a request-reply communication pattern. The service is hosted in IIS and the service code is entirely contained in the Service.svc file. The service is host-activated and compiled on-demand by the first message sent to the service. There is no pre-compilation necessary. The service implements an `ICalculator` contract as defined in the following code: - -```csharp -// Define a service contract. -[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")] - public interface ICalculator -{ - [OperationContract] - double Add(double n1, double n2); - [OperationContract] - double Subtract(double n1, double n2); - [OperationContract] - double Multiply(double n1, double n2); - [OperationContract] - double Divide(double n1, double n2); -} -``` - -The service implementation calculates and returns the appropriate result. - -`<%@ServiceHost language=c# Debug="true" Service="Microsoft.ServiceModel.Samples.CalculatorService" %>` - -```csharp -// Service class that implements the service contract. -public class CalculatorService : ICalculator -{ - public double Add(double n1, double n2) - { - return n1 + n2; - } - public double Subtract(double n1, double n2) - { - return n1 - n2; - } - public double Multiply(double n1, double n2) - { - return n1 * n2; - } - public double Divide(double n1, double n2) - { - return n1 / n2; - } -} -``` - -When you run the sample, the operation requests and responses are displayed in the client console window. Press ENTER in the client window to shut down the client. - -```console -Add(100,15.99) = 115.99 -Subtract(145,76.54) = 68.46 -Multiply(9,81.25) = 731.25 -Divide(22,7) = 3.14285714285714 - -Press to terminate client. -``` - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. After the solution has been built, run setup.bat to set up the ServiceModelSamples Application in IIS 7.0. The ServiceModelSamples directory should now appear as an IIS 7.0 Application. - -4. To run the sample in a single- or cross-computer configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). For an example on how to create a client application that can call this service, see [How to: Create a Client](../how-to-create-a-wcf-client.md). - -## See also - -- [AppFabric Hosting and Persistence Samples](/previous-versions/appfabric/ff383418(v=azure.10)) diff --git a/docs/framework/wcf/samples/iis-server-certificate-installation-instructions.md b/docs/framework/wcf/samples/iis-server-certificate-installation-instructions.md deleted file mode 100644 index f74c270bf84f2..0000000000000 --- a/docs/framework/wcf/samples/iis-server-certificate-installation-instructions.md +++ /dev/null @@ -1,79 +0,0 @@ ---- -description: "Learn more about: Internet Information Services (IIS) Server Certificate Installation Instructions" -title: "Internet Information Services (IIS) Server Certificate Installation Instructions" -ms.date: "03/30/2017" -ms.assetid: 11281490-d2ac-4324-8f33-e7714611a34b ---- -# Internet Information Services (IIS) Server Certificate Installation Instructions - -To run the samples that securely communicate with Internet Information Services (IIS), you must create and install a server certificate. - -## Step 1. Creating Certificates - - To create a certificate for your computer, open a Developer Command Prompt for Visual Studio with administrator privileges and run the Setup.bat that is included in each of the samples that use secure communication with IIS. Ensure that the path includes the folder that contains Makecert.exe before you run this batch file. The following command is used to create the certificate in Setup.bat. - -```console -makecert -sr LocalMachine -ss My -n CN=ServiceModelSamples-HTTPS-Server -sky exchange -sk ServiceModelSamples-HTTPS-Key -``` - -## Step 2. Installing Certificates - - The steps required to install the certificates you just created depend on which version of IIS you are using. - -#### To install IIS on IIS 5.1 (Windows XP) and IIS 6.0 (Windows Server 2003) - -1. Open the Internet Information Services Manager MMC Snap-In. - -2. Right-click the default Web site and select **Properties**. - -3. Select the **Directory Security** tab. - -4. Click the **Server Certificate** button. The Web Server Certificate Wizard starts. - -5. Complete the wizard. Select the option to assign a certificate. Select the ServiceModelSamples-HTTPS-Server certificate from the list of certificates that are displayed. - - ![IIS Certificate Wizard](media/iiscertificate-wizard.GIF "IISCertificate_Wizard") - -6. Test access to the service in a browser by using the HTTPS address `https://localhost/servicemodelsamples/service.svc`. - -#### If SSL was previously configured by using Httpcfg.exe - -1. Use Makecert.exe (or run Setup.bat) to create the server certificate. - -2. Run the IIS manager and install the certificate according to the previous steps. - -3. Add the following line of code to the client program. - -> [!IMPORTANT] -> This code is only required for test certificates such as those created by Makecert.exe. It is not recommended for production code. - -```csharp -PermissiveCertificatePolicy.Enact("CN=ServiceModelSamples-HTTPS-Server"); -``` - -#### To install IIS on IIS 7.0 (Windows Vista and Windows Server 2008) - -1. From the **Start** menu, click **Run**, then type **inetmgr** to open the Internet Information Services (IIS) MMC snap-in. - -2. Right-click the **Default Web Site** and select **Edit Bindings…** - -3. Click the **Add** button of the **Site Bindings** dialog box. - -4. Select **HTTPS** from the **Type** drop-down list. - -5. Select the **ServiceModelSamples-HTTPS-Server** from the **SSL certificate** drop-down list and click **OK**. - -6. Test access to the service in a browser by using the HTTPS address `https://localhost/servicemodelsamples/service.svc`. - -> [!NOTE] -> Because the test certificate you have just installed is not a trusted certificate, you may encounter additional Internet Explorer security warnings when browsing to local Web addresses secured with this certificate. - -## Removing Certificates - -- Use the Internet Information Services Manager as previously directed, but remove the certificate or binding instead of adding it. - -- Remove the computer certificate by using the following command. - - ```console - httpcfg delete ssl -i 0.0.0.0:443 - ``` diff --git a/docs/framework/wcf/samples/imperative.md b/docs/framework/wcf/samples/imperative.md deleted file mode 100644 index 888aa48ed22ca..0000000000000 --- a/docs/framework/wcf/samples/imperative.md +++ /dev/null @@ -1,91 +0,0 @@ ---- -description: "Learn more about: Imperative" -title: "Imperative" -ms.date: "03/30/2017" -ms.assetid: 4f7ce807-c0e4-407a-92a6-22abafb40b51 ---- -# Imperative - -This sample demonstrates how to define a for a service using code, instead of defining the `wsHttpBinding` binding in configuration. This sample is based on the [Getting Started](getting-started-sample.md) that implements a calculator service. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - -The following code demonstrates how to define a binding imperatively in code. - -```csharp -public static void Main() -{ - WSHttpBinding binding = new WSHttpBinding(); - binding.Name = "binding1"; - binding.HostNameComparisonMode = - HostNameComparisonMode.StrongWildcard; - binding.Security.Mode = SecurityMode.Message; - binding.ReliableSession.Enabled = false; - binding.TransactionFlow = false; - - Uri baseAddress = - new Uri("http://localhost:8000/servicemodelsamples/service"); - - // Create a ServiceHost for the CalculatorService type and provide the base address. - using(ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress)) - { - serviceHost.AddServiceEndpoint(typeof(ICalculator), - binding, baseAddress); - // Open the ServiceHostBase to create listeners and start listening for messages. - serviceHost.Open(); - - // The service can now be accessed. - Console.WriteLine("The service is ready."); - Console.WriteLine("Press to terminate service."); - Console.WriteLine(); - Console.ReadLine(); - // Close the ServiceHostBase to shutdown the service. - serviceHost.Close(); - } -} -``` - - The client creates a channel to communicate with the service as shown in the following sample code. - -```csharp -WSHttpBinding binding = new WSHttpBinding(); -binding.Name = "binding1"; -binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard; -binding.Security.Mode = SecurityMode.Message; -binding.ReliableSession.Enabled = false; -binding.TransactionFlow = false; - -String url = "http://localhost:8000/servicemodelsamples/service"; -EndpointAddress address = new EndpointAddress(url); -ChannelFactory channelFactory = new ChannelFactory(binding,address); -ICalculator channel = channelFactory.CreateChannel(); -``` - - When you run the sample, the operation requests and responses are displayed in the client console window. Press ENTER in the client window to shut down the client. - -```console -Add(100,15.99) = 115.99 -Subtract(145,76.54) = 68.46 -Multiply(9,81.25) = 731.25 -Divide(22,7) = 3.14285714285714 - -Press to terminate client. -``` - -## To set up, build, and run the sample - -1. Be sure you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Services\Imperative` diff --git a/docs/framework/wcf/samples/impersonating-the-client.md b/docs/framework/wcf/samples/impersonating-the-client.md deleted file mode 100644 index 4f0af9cad7acc..0000000000000 --- a/docs/framework/wcf/samples/impersonating-the-client.md +++ /dev/null @@ -1,122 +0,0 @@ ---- -description: "Learn more about: Impersonating the Client" -title: "Impersonating the Client" -ms.date: "03/30/2017" -helpviewer_keywords: - - "service behaviors, impersonation sample" - - "Impersonating the Client Sample [Windows Communication Foundation]" - - "impersonation, Windows Communication Foundation sample" -ms.assetid: 8bd974e1-90db-4152-95a3-1d4b1a7734f8 ---- -# Impersonating the Client - -The Impersonation sample demonstrates how to impersonate the caller application at the service so that the service can access system resources on behalf of the caller. - - This sample is based on the [Self-Host](self-host.md) sample. The service and client configuration files are the same as that of the [Self-Host](self-host.md) sample. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - - The service code has been modified such that the `Add` method on the service impersonates the caller using the as shown in the following sample code. - -```csharp -[OperationBehavior(Impersonation = ImpersonationOption.Required)] -public double Add(double n1, double n2) -{ - double result = n1 + n2; - Console.WriteLine("Received Add({0},{1})", n1, n2); - Console.WriteLine("Return: {0}", result); - DisplayIdentityInformation(); - return result; -} -``` - - As a result, the security context of the executing thread is switched to impersonate the caller before entering the `Add` method and reverted on exiting the method. - - The `DisplayIdentityInformation` method shown in the following sample code is a utility function that displays the caller's identity. - -```csharp -static void DisplayIdentityInformation() -{ - Console.WriteLine("\t\tThread Identity :{0}", - WindowsIdentity.GetCurrent().Name); - Console.WriteLine("\t\tThread Identity level :{0}", - WindowsIdentity.GetCurrent().ImpersonationLevel); - Console.WriteLine("\t\thToken :{0}", - WindowsIdentity.GetCurrent().Token.ToString()); - return; -} -``` - - The `Subtract` method on the service impersonates the caller using imperative calls as shown in the following sample code. - -```csharp -public double Subtract(double n1, double n2) -{ - double result = n1 - n2; - Console.WriteLine("Received Subtract({0},{1})", n1, n2); - Console.WriteLine("Return: {0}", result); - Console.WriteLine("Before impersonating"); - DisplayIdentityInformation(); - - if (ServiceSecurityContext.Current.WindowsIdentity.ImpersonationLevel == TokenImpersonationLevel.Impersonation || - ServiceSecurityContext.Current.WindowsIdentity.ImpersonationLevel == TokenImpersonationLevel.Delegation) - { - // Impersonate. - using (ServiceSecurityContext.Current.WindowsIdentity.Impersonate()) - { - // Make a system call in the caller's context and ACLs - // on the system resource are enforced in the caller's context. - Console.WriteLine("Impersonating the caller imperatively"); - DisplayIdentityInformation(); - } - } - else - { - Console.WriteLine("ImpersonationLevel is not high enough to perform this operation."); - } - - Console.WriteLine("After reverting"); - DisplayIdentityInformation(); - return result; -} -``` - - Note that in this case the caller is not impersonated for the entire call but is only impersonated for a portion of the call. In general, impersonating for the smallest scope is preferable to impersonating for the entire operation. - - The other methods do not impersonate the caller. - - The client code has been modified to set the impersonation level to . The client specifies the impersonation level to be used by the service, by using the enumeration. The enumeration supports the following values: , , , and . To perform an access check when accessing a system resource on the local machine that is protected using Windows ACLs, the impersonation level must be set to , as shown in the following sample code. - -```csharp -// Create a client with given client endpoint configuration -CalculatorClient client = new CalculatorClient(); - -client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation; -``` - - When you run the sample, the operation requests and responses are displayed in both the service and client console windows. Press ENTER in each console window to shut down the service and client. - -> [!NOTE] -> The service must either run under an administrative account or the account it runs under must be granted rights to register the `http://localhost:8000/ServiceModelSamples` URI with the HTTP layer. Such rights can be granted by setting up a [Namespace Reservation](/windows/win32/http/namespace-reservations-registrations-and-routing) using the [Httpcfg.exe tool](/windows/win32/http/httpcfg-exe). - -> [!NOTE] -> On computers running Windows Server 2003, impersonation is supported only if the Host.exe application has the Impersonation privilege. (By default, only administrators have this permission.) To add this privilege to an account the service is running as, go to **Administrative Tools**, open **Local Security Policy**, open **Local Policies**, click **User Rights Assignment**, and select **Impersonate a Client after Authentication** and double-click **Properties** to add a user or group. - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -4. To demonstrate that the service impersonates the caller, run the client under a different account than the one the service is running under. To do so, at the command prompt, type: - - ```console - runas /user:\ client.exe - ``` - - You are then prompted for a password. Enter the password for the account you previously specified. - -5. When you run the client, note the identity before and after running it with different credentials. diff --git a/docs/framework/wcf/samples/index.md b/docs/framework/wcf/samples/index.md deleted file mode 100644 index b50079f900922..0000000000000 --- a/docs/framework/wcf/samples/index.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: "Windows Communication Foundation (WCF) samples" -description: Download Windows Communication Foundation (WCF) samples for .NET Framework 4. The samples provide instruction on various aspects of WCF. -ms.date: 09/24/2018 -ms.assetid: 89d4efce-7832-4dd5-82a8-0e574b3302f9 ---- -# Windows Communication Foundation (WCF) samples - -You can download [Windows Communication Foundation (WCF) samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459). The samples provide instruction on various aspects of Windows Communication Foundation (WCF). - -> [!TIP] -> The articles in this section describe some of the samples in the download package. For a complete documentation set that covers all of the samples, check the [.NET Framework 4 documentation for WCF samples](/previous-versions/dotnet/netframework-4.0/dd483346(v=vs.100)). - -The Windows Workflow Foundation (WF) [application](/previous-versions/dotnet/framework/windows-workflow-foundation/samples/application) samples also demonstrate several WCF features. - -## In this section - -[Basic](basic.md) - Samples that illustrate basic WCF functionality. - -[Extensibility](extensibility.md) - Samples that are related to the discovery feature. - -[Scenario](scenario.md) - Demonstrates a WCF scenario. diff --git a/docs/framework/wcf/samples/installing-message-queuing-msmq.md b/docs/framework/wcf/samples/installing-message-queuing-msmq.md deleted file mode 100644 index 8da64e074222c..0000000000000 --- a/docs/framework/wcf/samples/installing-message-queuing-msmq.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -title: "Installing Message Queuing (MSMQ)" -description: Learn how to install Message Queuing 4.0 and Message Queuing 3.0 to use with WFC samples as part of a one-time setup procedure. -ms.date: "03/30/2017" -ms.assetid: 7ddcd497-3e04-427e-bc04-3610ad98b01e ---- -# Installing Message Queuing (MSMQ) - -The following procedures show how to install Message Queuing 4.0 and Message Queuing 3.0. - -> [!NOTE] -> Message Queuing 4.0 is not available in Windows XP and Windows Server 2003. - -#### To install Message Queuing 4.0 on Windows Server 2008 or Windows Server 2008 R2 - -1. In Server Manager, click **Features**. - -2. In the right-hand pane under **Features Summary**, click **Add Features**. - -3. In the resulting window, expand **Message Queuing**. - -4. Expand **Message Queuing Services**. - -5. Click **Directory Services Integration** (for computers joined to a Domain), then click **HTTP Support**. - -6. Click **Next**,then click **Install**. - -#### To install Message Queuing 4.0 on Windows 7 or Windows Vista - -1. Open **Control Panel**. - -2. Click **Programs** and then, under **Programs and Features**, click **Turn Windows Features on and off**. - -3. Expand Microsoft Message Queue (MSMQ) Server, expand Microsoft Message Queue (MSMQ) Server Core, and then select the check boxes for the following Message Queuing features to install: - - - MSMQ Active Directory Domain Services Integration (for computers joined to a Domain). - - - MSMQ HTTP Support. - -4. Click **OK**. - -5. If you are prompted to restart the computer, click **OK** to complete the installation. - -#### To install Message Queuing 3.0 on Windows XP and Windows Server 2003 - -1. Open **Control Panel**. - -2. Click **Add Remove Programs** and then click **Add Windows Components**. - -3. Select Message Queuing and click **Details**. - - > [!NOTE] - > If you are running Windows Server 2003, select Application Server to access Message Queuing. - -4. Ensure that the option MSMQ HTTP Support is selected on the details page. - -5. Click **OK** to exit the details page, and then click **Next**. Complete the installation. - -6. If you are prompted to restart the computer, click **OK** to complete the installation. - -## See also - -- [Set-Up Instructions](set-up-instructions.md) diff --git a/docs/framework/wcf/samples/instancing-extensibility.md b/docs/framework/wcf/samples/instancing-extensibility.md deleted file mode 100644 index 05797645ee439..0000000000000 --- a/docs/framework/wcf/samples/instancing-extensibility.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -description: "Learn more about: Instancing Extensibility" -title: "Instancing Extensibility" -ms.date: "03/30/2017" -ms.assetid: 7a2f8b51-472b-4b71-8602-d3dbc6e1cb07 ---- -# Instancing Extensibility - -This section contains samples that demonstrate custom instancing. - -## In This Section - - [Durable Instance Context](durable-instance-context.md) - Demonstrates how to customize the WCF runtime to enable durable instance contexts. - - [Custom Lifetime](custom-lifetime.md) - Demonstrates how to write a WCF extension to provide custom lifetime services for shared WCF service instances. - - [Instancing Initialization](instancing-initialization.md) - Demonstrates how to customize the initialization of an object. - - [Pooling](pooling.md) - Demonstrates how to extend Windows Communication Foundation (WCF) to support object pooling. diff --git a/docs/framework/wcf/samples/instancing-initialization.md b/docs/framework/wcf/samples/instancing-initialization.md deleted file mode 100644 index 7f9ff66ff0a62..0000000000000 --- a/docs/framework/wcf/samples/instancing-initialization.md +++ /dev/null @@ -1,266 +0,0 @@ ---- -description: "Learn more about: Instancing Initialization" -title: "Instancing Initialization" -ms.date: "03/30/2017" -ms.assetid: 154d049f-2140-4696-b494-c7e53f6775ef ---- -# Instancing Initialization - -This sample extends the [Pooling](pooling.md) sample by defining an interface, `IObjectControl`, which customizes the initialization of an object by activating and deactivating it. The client invokes methods that return the object to the pool and that do not return the object to the pool. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - -## Extensibility Points - - The first step in creating a Windows Communication Foundation (WCF) extension is to decide the extensibility point to use. In WCF, the term *EndpointDispatcher* refers to a run-time component responsible for converting incoming messages into method invocations on the user’s service and for converting return values from that method to an outgoing message. A WCF service creates an EndpointDispatcher for each endpoint. - - The EndpointDispatcher offers endpoint scope (for all messages received or sent by the service) extensibility using the class. This class allows you to customize various properties that control the behavior of the EndpointDispatcher. This sample focuses on the property that points to the object that provides the instances of the service class. - -## IInstanceProvider - - In WCF, the EndpointDispatcher creates instances of a service class by using an instance provider that implements the interface. This interface has only two methods: - -- : When a message arrives, the Dispatcher calls the method to create an instance of the service class to process the message. The frequency of the calls to this method is determined by the property. For example if the property is set to , a new instance of service class is created to process each message that arrives, so is called whenever a message arrives. - -- : When the service instance finishes processing the message, the EndpointDispatcher calls the method. As in the method, the frequency of the calls to this method is determined by the property. - -## The Object Pool - - The `ObjectPoolInstanceProvider` class contains the implementation for the object pool. This class implements the interface to interact with the service model layer. When the EndpointDispatcher calls the method, instead of creating a new instance, the custom implementation looks for an existing object in an in-memory pool. If one is available, it is returned. Otherwise, `ObjectPoolInstanceProvider` checks whether the `ActiveObjectsCount` property (number of objects returned from the pool) has reached the maximum pool size. If not, a new instance is created and returned to the caller and `ActiveObjectsCount` is subsequently incremented. Otherwise an object creation request is queued for a configured period of time. The implementation for `GetObjectFromThePool` is shown in the following sample code. - -```csharp -private object GetObjectFromThePool() -{ - bool didNotTimeout = - availableCount.WaitOne(creationTimeout, true); - if(didNotTimeout) - { - object obj = null; - lock (poolLock) - { - if (pool.Count != 0) - { - obj = pool.Pop(); - activeObjectsCount++; - } - else if (pool.Count == 0) - { - if (activeObjectsCount < maxPoolSize) - { - obj = CreateNewPoolObject(); - activeObjectsCount++; - - #if (DEBUG) - WritePoolMessage( - ResourceHelper.GetString("MsgNewObject")); - #endif - } - } - idleTimer.Stop(); - } - // Call the Activate method if possible. - if (obj is IObjectControl) - { - ((IObjectControl)obj).Activate(); - } - return obj; -} -throw new TimeoutException( -ResourceHelper.GetString("ExObjectCreationTimeout")); -} -``` - - The custom `ReleaseInstance` implementation adds the released instance back to the pool and decrements the `ActiveObjectsCount` value. The EndpointDispatcher can call these methods from different threads, and therefore synchronized access to the class level members in the `ObjectPoolInstanceProvider` class is required. - -```csharp -public void ReleaseInstance(InstanceContext instanceContext, object instance) -{ - lock (poolLock) - { - // Check whether the object can be pooled. - // Call the Deactivate method if possible. - if (instance is IObjectControl) - { - IObjectControl objectControl = (IObjectControl)instance; - objectControl.Deactivate(); - - if (objectControl.CanBePooled) - { - pool.Push(instance); - - #if(DEBUG) - WritePoolMessage( - ResourceHelper.GetString("MsgObjectPooled")); - #endif - } - else - { - #if(DEBUG) - WritePoolMessage( - ResourceHelper.GetString("MsgObjectWasNotPooled")); - #endif - } - } - else - { - pool.Push(instance); - - #if(DEBUG) - WritePoolMessage( - ResourceHelper.GetString("MsgObjectPooled")); - #endif - } - - activeObjectsCount--; - - if (activeObjectsCount == 0) - { - idleTimer.Start(); - } - } - - availableCount.Release(1); -} -``` - - The `ReleaseInstance` method provides a *clean up initialization* feature. Normally the pool maintains a minimum number of objects for the lifetime of the pool. However, there can be periods of excessive usage that require creating additional objects in the pool to reach the maximum limit specified in the configuration. Eventually when the pool becomes less active those surplus objects can become an extra overhead. Therefore when the `activeObjectsCount` reaches zero an idle timer is started that triggers and performs a clean-up cycle. - -```csharp -if (activeObjectsCount == 0) -{ - idleTimer.Start(); -} -``` - - ServiceModel layer extensions are hooked up using the following behaviors: - -- Service Behaviors: These allow for the customization of the entire service runtime. - -- Endpoint Behaviors: These allow for the customization of a particular service endpoint, including the EndpointDispatcher. - -- Contract Behaviors: These allow for the customization of either or classes on the client or the service respectively. - -- Operation Behaviors: These allow for the customization of either or classes on the client or the service respectively. - - For the purpose of an object pooling extension, either an endpoint behavior or a service behavior can be created. In this example, we use a service behavior, which applies object pooling ability to every endpoint of the service. Service behaviors are created by implementing the interface. There are several ways to make the ServiceModel aware of the custom behaviors: - -- Using a custom attribute. - -- Imperatively adding it to the service description’s behaviors collection. - -- Extending the configuration file. - - This sample uses a custom attribute. When the is constructed, it examines the attributes used in the service’s type definition and adds the available behaviors to the service description’s behaviors collection. - - The interface has three methods: `,` `,` and . These methods are called by WCF when the is being initialized. is called first; it allows the service to be inspected for inconsistencies. is called next; this method is only required in very advanced scenarios. is called last and is responsible for configuring the runtime. The following parameters are passed into : - -- `Description`: This parameter provides the service description for the entire service. This can be used to inspect description data about the service’s endpoints, contracts, bindings, and other data associated with the service. - -- `ServiceHostBase`: This parameter provides the that is currently being initialized. - - In the custom implementation, a new instance of `ObjectPoolInstanceProvider` is instantiated and assigned to the property in each that is attached to the . - -```csharp -public void ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase) -{ - if (enabled) - { - // Create an instance of the ObjectPoolInstanceProvider. - instanceProvider = new ObjectPoolInstanceProvider(description.ServiceType, - maxPoolSize, minPoolSize, creationTimeout); - - // Assign our instance provider to Dispatch behavior in each - // endpoint. - foreach (ChannelDispatcherBase cdb in serviceHostBase.ChannelDispatchers) - { - ChannelDispatcher cd = cdb as ChannelDispatcher; - if (cd != null) - { - foreach (EndpointDispatcher ed in cd.Endpoints) - { - ed.DispatchRuntime.InstanceProvider = instanceProvider; - } - } - } - } -} -``` - - In addition to an implementation the `ObjectPoolingAttribute` class has several members to customize the object pool using the attribute arguments. These members include `MaxSize`, `MinSize`, `Enabled` and `CreationTimeout`, to match the object pooling feature set provided by .NET Enterprise Services. - - The object pooling behavior can now be added to a WCF service by annotating the service implementation with the newly created custom `ObjectPooling` attribute. - -```csharp -[ObjectPooling(MaxSize=1024, MinSize=10, CreationTimeout=30000] -public class PoolService : IPoolService -{ - // … -} -``` - -## Hooking Activation and Deactivation - - The primary objective of object pooling is to optimize short-lived objects with relatively expensive creation and initialization. Therefore it can give a dramatic performance boost to an application if properly used. Because the object is returned from the pool, the constructor is called only once. However, some applications require some level of control so that they can initialize and clean-up the resources used during a single context. For example, an object being used for a set of calculations can reset its private fields before processing the next calculation. Enterprise Services enabled this kind of context-specific initialization by letting the object developer override `Activate` and `Deactivate` methods from the base class. - - The object pool calls the `Activate` method just before returning the object from the pool. `Deactivate` is called when the object returns back to the pool. The base class also has a `boolean` property called `CanBePooled`, which can be used to notify the pool whether the object can be pooled further. - - To mimic this functionality, the sample declares a public interface (`IObjectControl`) that has the aforementioned members. This interface is then implemented by service classes intended to provide context specific initialization. The implementation must be modified to meet these requirements. Now, each time you get an object by calling the `GetInstance` method, you must check whether the object implements `IObjectControl.` If it does, you must call the `Activate` method appropriately. - -```csharp -if (obj is IObjectControl) -{ - ((IObjectControl)obj).Activate(); -} -``` - - When returning an object to the pool, a check is required for the `CanBePooled` property before adding the object back to the pool. - -```csharp -if (instance is IObjectControl) -{ - IObjectControl objectControl = (IObjectControl)instance; - objectControl.Deactivate(); - if (objectControl.CanBePooled) - { - pool.Push(instance); - } -} -``` - - Because the service developer can decide whether an object can be pooled, the object count in the pool at a given time can go below the minimum size. Therefore you must check whether the object count has gone below the minimum level and perform the necessary initialization in the clean-up procedure. - -```csharp -// Remove the surplus objects. -if (pool.Count > minPoolSize) -{ - // Clean the surplus objects. -} -else if (pool.Count < minPoolSize) -{ - // Reinitialize the missing objects. - while(pool.Count != minPoolSize) - { - pool.Push(CreateNewPoolObject()); - } -} -``` - - When you run the sample, the operation requests and responses are displayed in both the service and client console windows. Press Enter in each console window to shut down the service and client. - -#### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Extensibility\Instancing\Initialization` diff --git a/docs/framework/wcf/samples/instancing.md b/docs/framework/wcf/samples/instancing.md deleted file mode 100644 index 7978ab70720ea..0000000000000 --- a/docs/framework/wcf/samples/instancing.md +++ /dev/null @@ -1,136 +0,0 @@ ---- -description: "Learn more about: Instancing" -title: "Instancing" -ms.date: "03/30/2017" -helpviewer_keywords: - - "service behaviors, instancing sample" - - "Instancing Sample [Windows Communication Foundation]" -ms.assetid: c290fa54-f6ae-45a1-9186-d9504ebc6ee6 ---- -# Instancing - -The Instancing sample demonstrates the instancing behavior setting, which controls how instances of a service class are created in response to client requests. The sample is based on the [Getting Started](getting-started-sample.md), which implements the `ICalculator` service contract. This sample defines a new contract, `ICalculatorInstance`, which inherits from `ICalculator`. The contract specified by `ICalculatorInstance` provides three additional operations for inspecting the state of the service instance. By altering the instancing setting, you can observe the change in behavior by running the client. - - In this sample, the client is a console application (.exe) and the service is hosted by Internet Information Services (IIS). - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - - The following instancing modes are available: - -- : A new service instance is created for each client request. - -- : A new instance is created for each new client session, and maintained for the lifetime of that session (requires a binding that supports session). - -- : A single instance of the service class handles all client requests for the lifetime of the application. - - The service class specifies instancing behavior with the `[ServiceBehavior(InstanceContextMode=)]` attribute as shown in the code sample that follows. By changing which lines are commented out, you can observe the behavior of each of the instance modes. Remember to rebuild the service after changing the instancing mode. There are no instancing-related settings to specify on the client. - -```csharp -// Enable one of the following instance modes to compare instancing behaviors. - [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)] - -// PerCall creates a new instance for each operation. -//[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] - -// Singleton creates a single instance for application lifetime. -//[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] -public class CalculatorService : ICalculatorInstance -{ - static Object syncObject = new object(); - static int instanceCount; - int instanceId; - int operationCount; - - public CalculatorService() - { - lock (syncObject) - { - instanceCount++; - instanceId = instanceCount; - } - } - - public double Add(double n1, double n2) - { - operationCount++; - return n1 + n2; - } - - public double Subtract(double n1, double n2) - { - Interlocked.Increment(ref operationCount); - return n1 - n2; - } - - public double Multiply(double n1, double n2) - { - Interlocked.Increment(ref operationCount); - return n1 * n2; - } - - public double Divide(double n1, double n2) - { - Interlocked.Increment(ref operationCount); - return n1 / n2; - } - - public string GetInstanceContextMode() - { // Return the InstanceContextMode of the service - ServiceHost host = (ServiceHost)OperationContext.Current.Host; - ServiceBehaviorAttribute behavior = host.Description.Behaviors.Find(); - return behavior.InstanceContextMode.ToString(); - } - - public int GetInstanceId() - { // Return the id for this instance - return instanceId; - } - - public int GetOperationCount() - { // Return the number of ICalculator operations performed - // on this instance - lock (syncObject) - { - return operationCount; - } - } -} - -static void Main() -{ - // Create a client. - CalculatorInstanceClient client = new CalculatorInstanceClient(); - string instanceMode = client.GetInstanceContextMode(); - Console.WriteLine("InstanceContextMode: {0}", instanceMode); - DoCalculations(client); - - // Create a second client. - CalculatorInstanceClient client2 = new CalculatorInstanceClient(); - - DoCalculations(client2); - - Console.WriteLine(); - Console.WriteLine("Press to terminate client."); - Console.ReadLine(); -} -``` - - When you run the sample, the operation requests and responses are displayed in the client console window. The instance mode the service is running under is displayed. After each operation, the instance ID and operation count are displayed to reflect the behavior of the instancing mode. Press ENTER in the client window to shut down the client. - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Services\Behaviors\Instancing` diff --git a/docs/framework/wcf/samples/internet-information-service-hosting-instructions.md b/docs/framework/wcf/samples/internet-information-service-hosting-instructions.md deleted file mode 100644 index 08bf9ef6aae46..0000000000000 --- a/docs/framework/wcf/samples/internet-information-service-hosting-instructions.md +++ /dev/null @@ -1,175 +0,0 @@ ---- -description: "Learn more about: Internet Information Service Hosting Instructions" -title: "Internet Information Service Hosting Instructions" -ms.date: "03/30/2017" -ms.assetid: 959a21c8-9d9d-4757-b255-4e57793ae9d6 ---- -# Internet Information Service Hosting Instructions - -To run the samples that are hosted by Internet Information Services (IIS), you must make sure that IIS is properly installed and is running. - -### To install IIS version 7.5 on Windows Server 2008 R2 - -1. From **Server Manager**, select **Roles.** Under **Roles Summary**, click **Add Roles**. - -2. Click **Next** to display the **Select Server Roles** dialog. - -3. Select **Application Server** from the **Roles** list, and then click **Next** twice to display the **Select Role Services** dialog for the Application Server role. - -4. Select the **Web Server (IIS)** check box. If you are prompted to install additional role services and features, click **Add Required Features**. Click **Next** twice to display the **Select Role Services** dialog for the Web Server (IIS) role. - -5. Expand **Management Tools**, and then expand **IIS 6 Management Compatibility**. Select **IIS 6 Scripting Tools**. If you are prompted to install additional role services and features, click **Add Required Role Services**. Click **Next**. - -6. If the summary of selections is correct, click **Install**. - -7. When installation completes, click **Close**. - -### To install IIS version 7.5 on Windows 7 - -1. Click **Start**, and then click **Control Panel**. - -2. Open the **Programs** group. - -3. Under **Programs and Features**, click **Turn Windows Features on or off**. - -4. The **User Account Control** dialog is displayed. Click **Continue**. - -5. The **Windows Features** dialog is displayed. Expand the item labeled **Internet Information Services**. - -6. Expand the item labeled **World Wide Web Services**. - -7. Expand the item labeled **Application Development Features**. - -8. Make sure the following items are selected: - - 1. **.NET Extensibility** - - 2. **ASP.NET** - - 3. **ISAPI Extensions** - - 4. **ISAPI Filters** - -9. Under the item labeled **World Wide Web Services**, expand **Common Http Features**. - -10. Make sure **Static Content** is selected. - -11. Under the item labeled **World Wide Web Services**, expand **Security**. - -12. Make sure that **Windows Authentication** is selected. - -13. Under the **Internet Information Services** directory, expand the item labeled **Web Management Tools**, and then select **IIS Management Console**. - -14. Expand the item labeled **IIS 6 Management Compatibility**, and then select **IIS 6 Scripting Tools**. - -15. Under the **Internet Information Services** directory, expand the item labeled **Microsoft .NET Framework 3.5.1**, and then select **Windows Communication Foundation Http Activation**. - -16. Click **OK**. - -### To install IIS version 7.0 on Windows Server 2008 - -1. From **Server Manager**, select **Roles**. Under **Roles Summary**, click **Add Roles**. - -2. Click **Next** to display the **Select Server Roles** dialog. - -3. Select **Application Server** from the **Roles** list, and then click **Next** twice to display the **Select Role Services** dialog for the Application Server role. - -4. Select **Web Server (IIS)** check box. If you are prompted to install additional role services and features, click **Add Required Features**. Click **Next** twice to display the **Select Role Services** dialog for the Web Server (IIS) role. - -5. Expand **Management Tools**, and then expand **IIS 6 Management Compatibility**. Select **IIS 6 Scripting Tools**. If you are prompted to install additional role services and features, click **Add Required Role Services**. Click **Next**. - -6. If the summary of selections is correct, click **Install**. - -7. When installation completes, click **Close**. - -### To install IIS version 7.0 on Windows Vista - -1. Click Start, and then click Control Panel. - -2. Select the **Programs** group. - -3. Under **Programs and Features**, click **Turn Windows Features on or off**. - -4. The **User Account Control** dialog is displayed. Click **Continue**. - -5. The **Windows Features** dialog is displayed. Expand the item labeled **Internet Information Services**. - -6. Expand the item labeled **World Wide Web Services**. - -7. Expand the item labeled **Application Development Features**. - -8. Make sure the following items are selected: - - 1. **.NET Extensibility** - - 2. **ASP.NET** - - 3. **ISAPI Extensions** - - 4. **ISAPI Filters** - -9. Expand the item labeled **Web Management Tools**, and then select **IIS Management Console**. - -10. Under the item labeled **World Wide Web Services**, expand **Common Http Features**. - -11. Make sure **Static Content** is selected. - -12. Under the item labeled **World Wide Web Services**, expand **Security**. - -13. Make sure **Windows Authentication** is selected. - -14. Expand the item labeled **IIS 6 Management Compatibility**, and then select **IIS 6 Scripting Tools**. - -15. Expand the item labeled **Microsoft .NET Framework 3.0**, and then select **Windows Communication Foundation Http Activation**. - -16. Click **OK**. - -### To install IIS version 6.0 on Windows Server 2003 - -1. From **Manage Your Server**, click **Add or remove a role**, and then click **Next**. - -2. Select **Application server (IIS, ASP.NET)** from the **Server Role** list, and then click **Next**. - -3. Select **Enable ASP.NET** check box, and then click **Next**. - -4. If the summary of selections is correct, click Next. - -### To install IIS version 5.1 on Windows XP with Service Pack 2 and Service Pack 3 installed - -1. In Control Panel, click **Add or Remove Programs**. - -2. In the **Add or Remove Programs** dialog box, click **Add/Remove Windows Components**. - -3. In the **Windows Components Wizard**, select the **Internet Information Services (IIS)** check box, and then click **Next**. - -4. If the **Files Needed** dialog box is displayed, insert your operating system installation disc, browse to the i386 folder, and then click **OK**. - -5. When installation completes, click **Finish**. - -6. Close the **Add or Remove Programs** dialog box, and then close **Control Panel**. - -### To verify the installation of IIS and ASP.NET - -1. Save the HTML file found at the end of this topic in the root \InetPub\wwwroot directory and name it Default.aspx. - -2. Open a browser window. - -3. Type `http://localhost/Default.aspx` in the address box, and then press ENTER. - -4. A Web page with the text "Hello World" should appear. - -> [!NOTE] -> Each time you install a new version of the .NET Framework, you must re-register aspnet_isapi as a Web service extension for IIS. To do so, issue the `aspnet_regiis –I –enable` command. - -## Sample Code - -```xml - - -
    -

    Hello World -

    -
    - - -``` diff --git a/docs/framework/wcf/samples/interop-extensibility.md b/docs/framework/wcf/samples/interop-extensibility.md deleted file mode 100644 index 33a5f99b67f14..0000000000000 --- a/docs/framework/wcf/samples/interop-extensibility.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -description: "Learn more about: Interop Extensibility" -title: "Interop Extensibility" -ms.date: "03/30/2017" -ms.assetid: 384a012a-d92d-40d1-b1a5-9c18ca932fcc ---- -# Interop Extensibility - -This section contains samples that demonstrate custom interoperability. - -## In This Section - - [Dispatch by Body Element](dispatch-by-body-element.md) - Demonstrates how to implement an alternate algorithm for assigning incoming messages to operations. - - [Route by Body](route-by-body.md) - Demonstrates how to implement a service that accepts message objects with any SOAP action. diff --git a/docs/framework/wcf/samples/interoperating-with-asmx-web-services.md b/docs/framework/wcf/samples/interoperating-with-asmx-web-services.md deleted file mode 100644 index 72ff160b3468c..0000000000000 --- a/docs/framework/wcf/samples/interoperating-with-asmx-web-services.md +++ /dev/null @@ -1,128 +0,0 @@ ---- -description: "Learn more about: Interoperating with ASMX Web Services" -title: "Interoperating with ASMX Web Services" -ms.date: "03/30/2017" -ms.assetid: a7c11f0a-9e68-4f03-a6b1-39cf478d1a89 ---- -# Interoperating with ASMX Web Services - -This sample demonstrates how to integrate a Windows Communication Foundation (WCF) client application with an existing ASMX Web service. - -> [!NOTE] -> The setup procedure and build instructions for this sample are located at the end of this topic. - - This sample consists of a client console program (.exe) and a service library (.dll) hosted by Internet Information Services (IIS). The service is an ASMX Web Service that implements a contract that defines a request-reply communication pattern. The service exposes math operations (`Add`, `Subtract`, `Multiply`, and `Divide`). The client makes synchronous requests to a math operation and the service replies with the result. Client activity is visible in the console window. - - The ASMX Web service implementation shown in the following sample code calculates and returns the appropriate result. - -```csharp -[WebService(Namespace="http://Microsoft.ServiceModel.Samples")] -public class CalculatorService : System.Web.Services.WebService - { - [WebMethod] - public double Add(double n1, double n2) - { - return n1 + n2; - } - [WebMethod] - public double Subtract(double n1, double n2) - { - return n1 - n2; - } - [WebMethod] - public double Multiply(double n1, double n2) - { - return n1 * n2; - } - [WebMethod] - public double Divide(double n1, double n2) - { - return n1 / n2; - } - } -``` - - As configured, the service can be accessed at `http://localhost/servicemodelsamples/service.asmx` by a client on the same machine. For clients on remote machines to access the service, a qualified domain name must be specified instead of localhost. - - Communication is done through a client generated by the [ServiceModel Metadata Utility Tool (Svcutil.exe)](../servicemodel-metadata-utility-tool-svcutil-exe.md). The client is contained in the file generatedClient.cs. The ASMX service must be available to generate the proxy code, because it is used to retrieve the updated metadata. Run the following command from a command prompt in the client directory to generate the typed proxy. - -```console -svcutil.exe /n:http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples http://localhost/servicemodelsamples/service.svc?wsdl /out:generatedClient.cs -``` - - By using the generated client, you can access a service endpoint by configuring the appropriate address and binding. Like the service, the client uses a configuration file (App.config) to specify the endpoint to communicate with. The client endpoint configuration consists of an absolute address for the service endpoint, the binding, and the contract, as shown in the following sample configuration. - -```xml - - - -``` - - The client implementation constructs an instance of the generated client. The generated client can then be used to communicate with the service. - -```csharp -// Create a client. -CalculatorServiceSoapClient client = new CalculatorServiceSoapClient(); - -// Call the Add service operation. -double value1 = 100.00D; -double value2 = 15.99D; -double result = client.Add(value1, value2); -Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result); - -// Call the Subtract service operation. -value1 = 145.00D; -value2 = 76.54D; -result = client.Subtract(value1, value2); -Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result); - -// Call the Multiply service operation. -value1 = 9.00D; -value2 = 81.25D; -result = client.Multiply(value1, value2); -Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result); - -// Call the Divide service operation. -value1 = 22.00D; -value2 = 7.00D; -result = client.Divide(value1, value2); -Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result); - -//Closing the client gracefully closes the connection and cleans up resources. -client.Close(); - -Console.WriteLine(); -Console.WriteLine("Press to terminate client."); -Console.ReadLine(); -``` - - When you run the sample, the operation requests and responses are displayed in the client console window. Press ENTER in the client window to shut down the client. - -```console -Add(100,15.99) = 115.99 -Subtract(145,76.54) = 68.46 -Multiply(9,81.25) = 731.25 -Divide(22,7) = 3.14285714285714 - -Press to terminate client. -``` - -### To set up, build, and run the sample - -1. Ensure that you have performed the [One-Time Setup Procedure for the Windows Communication Foundation Samples](one-time-setup-procedure-for-the-wcf-samples.md). - -2. To build the C# or Visual Basic .NET edition of the solution, follow the instructions in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -3. To run the sample in a single- or cross-machine configuration, follow the instructions in [Running the Windows Communication Foundation Samples](running-the-samples.md). - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Client\Interop\ASMX` diff --git a/docs/framework/wcf/samples/json-serialization.md b/docs/framework/wcf/samples/json-serialization.md deleted file mode 100644 index ac2e7af45cc01..0000000000000 --- a/docs/framework/wcf/samples/json-serialization.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -description: "Learn more about: DataContractJsonSerializer sample" -title: "DataContractJsonSerializer sample" -ms.date: "03/30/2017" -ms.assetid: 3c2c4747-7510-4bdf-b4fe-64f98428ef4a ---- -# DataContractJsonSerializer sample - -> [!NOTE] -> This sample is for . For most scenarios that involve serializing and deserializing JSON, we recommend the APIs in the [System.Text.Json namespace](../../../standard/serialization/system-text-json-overview.md). - - supports the same types as . The JSON data format is especially useful when writing Asynchronous JavaScript and XML (AJAX)-style Web applications. AJAX support in Windows Communication Foundation (WCF) is optimized for use with ASP.NET AJAX through the ScriptManager control. For examples of how to use Windows Communication Foundation (WCF) with ASP.NET AJAX, see the [AJAX Samples](ajax.md). - -The set-up procedure and build instructions for this sample are located at the end of this topic. - -The sample uses a `Person` data contract to demonstrate serialization and deserialization. - -```csharp -[DataContract] -class Person -{ - [DataMember] - internal string name; - - [DataMember] - internal int age; -} -``` - - To serialize an instance of the `Person` type to JSON, create the first and use the `WriteObject` method to write JSON data to a stream. - -```csharp -Person p = new Person(); -//Set up Person object... -MemoryStream stream1 = new MemoryStream(); -DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(Person)); -ser.WriteObject(stream1, p); -``` - - The memory stream contains valid JSON data. - -```json -{"age":42,"name":"John"} -``` - - The sample demonstrates deserializing from JSON data into an object. You then rewind the stream and call `ReadObject`. - -```csharp -Person p2 = (Person)ser.ReadObject(stream1); -``` - - Examining the `p2` object reveals that the JSON data has been deserialized correctly. - -> [!IMPORTANT] -> The samples may already be installed on your machine. Check for the following (default) directory before continuing. -> -> `:\WF_WCF_Samples` -> -> If this directory does not exist, go to [Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4](https://www.microsoft.com/download/details.aspx?id=21459) to download all Windows Communication Foundation (WCF) and [!INCLUDE[wf1](../../../../includes/wf1-md.md)] samples. This sample is located in the following directory. -> -> `:\WF_WCF_Samples\WCF\Basic\Ajax\JsonSerialization` - -#### To set up, build and run the sample - -1. Build the solution JsonSerialization.sln as described in [Building the Windows Communication Foundation Samples](building-the-samples.md). - -2. Run the resulting console application. diff --git a/docs/framework/wcf/samples/jsonp.md b/docs/framework/wcf/samples/jsonp.md deleted file mode 100644 index f850c1c83576a..0000000000000 --- a/docs/framework/wcf/samples/jsonp.md +++ /dev/null @@ -1,69 +0,0 @@ ---- -description: "Learn more about: JSONP" -title: "JSONP" -ms.date: "03/30/2017" -ms.assetid: c13b4d7b-dac7-4ffd-9f84-765c903511e1 ---- -# JSONP - -This sample demonstrates how to support JSON with Padding (JSONP) in WCF REST services. JSONP is a convention used to invoke cross-domain scripts by generating script tags in the current document. The result is returned in a specified callback function. JSONP is based on the idea that tags such as `