ASP.NET এর লুকানো বৈশিষ্ট্য [বন্ধ]


292

এই প্রশ্নটি বিদ্যমান কারণ এটির historicalতিহাসিক তাত্পর্য রয়েছে, তবে এটি এই সাইটের জন্য একটি ভাল, বিষয়-সংক্রান্ত প্রশ্ন হিসাবে বিবেচনা করা হয় না, সুতরাং দয়া করে এটিকে প্রমাণ হিসাবে আপনি এটি এখানে অনুরূপ প্রশ্ন জিজ্ঞাসা করতে পারবেন না use

আরও তথ্য: https://stackoverflow.com/faq


সবসময় এমন বৈশিষ্ট্য রয়েছে যা হ্রদ দৃশ্যগুলির ক্ষেত্রে কার্যকর হবে তবে সেই কারণেই বেশিরভাগ লোক সেগুলি জানে না। আমি এমন বৈশিষ্ট্যগুলির জন্য জিজ্ঞাসা করছি যা সাধারণত পাঠ্য পুস্তক দ্বারা শেখানো হয় না।

আপনি কি জানেন যে কি?


ভাল প্রশ্ন, আমি ইচ্ছুক একাধিকবার ভোট দিতে পারে!
গ্যাভিন মিলার 23

1
একমত। আমি এই মত থ্রেড পছন্দ। কাঠামোর এত গভীরতা রয়েছে যে আপনি কখনও কখনও এমন জিনিসগুলিতে অবাক হয়ে যান যেগুলি আপনি কখনও জানতেন না were
ডিনে

আমি এই থ্রেডের প্রতিক্রিয়াগুলি থেকে অনেক দুর্দান্ত নতুন কৌশল শিখছি - ধন্যবাদ! :)
ম্যাক্সিম জাস্লাভস্কি

16
"লুকানো বৈশিষ্ট্যগুলির .." এর পরিবর্তে এই জিনিসগুলির নাম "ছোট্ট জ্ঞাত বৈশিষ্ট্যগুলির .." রাখা উচিত নয় কারণ বেশিরভাগ প্রতিটি উত্তর এমএসডিএন বা অন্য কোথাও সুনির্দিষ্টভাবে ডকুমেন্টেড, কেবল সাধারণভাবে পরিচিত বা ব্যবহৃত হয় না।
জন কে

দেখুন meta.stackexchange.com/questions/56669/... , meta.stackexchange.com/questions/57226/... এবং উপযোগিতা এবং বন্ধ করার আলোচনার জন্য এর সাথে সম্পর্কিত মেটা পোস্ট নেই।

উত্তর:


335

পরীক্ষার সময়, আপনার কম্পিউটারে কোনও এসএমটিপি সার্ভারের পরিবর্তে কোনও ইমেল ইমেল থাকতে পারে। এটি আপনার ওয়েব কনফিগে রাখুন:

<system.net>
    <mailSettings>
        <smtp deliveryMethod="SpecifiedPickupDirectory">
            <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\" />
        </smtp>
    </mailSettings>
</system.net>

6
সত্যি? আমি ডাম্বস্টারের মতো একটি নকল এসএমটিপি সার্ভার ইনস্টল করতে চলেছি। আমি রত্ন গোপন।
এডুয়ার্ডো মোল্টেনি

2
আপনি কি ডিরেক্টরী অবস্থানের জন্য ইউএনসি ভাগ নির্দিষ্ট করতে পারেন তা যদি কেউ জানেন?
মার্ক শেরেটা

32
আরও ভাল, এটি আপনার ডেভ বক্স মেশিনকনফিগের উপর রাখুন, যাতে আপনার তৈরি প্রতিটি অ্যাপে আপনাকে ওয়েবকনফিগটি পরিবর্তন করতে হবে না।
ম্যাক্স তোরো 21

আপনি এটি সেট করতে পারেন যাতে এটি কেবল স্থানীয় হোস্টেই করে? এভাবে কি আপনাকে প্রতিবার পরিবর্তন করতে হবে না?
chobo2

এটির জন্য কোনও বিন্যাস নেই। আপনাকে অন্য পদ্ধতিগুলি ব্যবহার করে (ওয়েব ডিপ্লোয়মেন্ট প্রজেক্টস, টাস্কগুলি তৈরি করা ইত্যাদি) কনফিগার করতে হবে
জন শিহান

210

আপনি যদি ওয়েব অ্যাপ্লিকেশন ডিরেক্টরিটির মূলের মধ্যে app_offline.htm নামের একটি ফাইল রাখেন তবে এএসপি.এনইটি 2.0+ অ্যাপ্লিকেশনটি শাট-ডাউন করবে এবং সেই অ্যাপ্লিকেশনটির জন্য কেবলমাত্র নতুন অ্যাপ্লিকেশনগুলির জন্য প্রসেসিং বন্ধ করবে, কেবলমাত্র অ্যাপ্লিকেশন-অফলাইন htm এর সামগ্রীগুলি দেখায় সমস্ত নতুন অনুরোধের জন্য ফাইল ।

কোনও প্রোডাকশন সার্ভারে পরিবর্তনগুলি পুনঃ-মোতায়েনের সময় (বা পিছনে ঘুরানো) আপনার "সাইট অস্থায়ীভাবে অনুপলব্ধ" নোটিশ প্রদর্শন করার এই দ্রুত এবং সহজ উপায়।

এছাড়াও, মার্সিডাড দ্বারা নির্দেশিত হিসাবে , নিশ্চিত করুন যে আপনার ফাইলের মধ্যে কমপক্ষে 512 বাইট সামগ্রী রয়েছে যাতে আই 6 এটি সঠিকভাবে রেন্ডার করবে।


10
আইই এর "বন্ধুত্বপূর্ণ" বার্তাগুলির জন্য কাজটি ভুলে যাবেন না: tinyurl.com
মার্ক সিডেড

1
সেকি! এমওএসএস 2007 এর সাথে এটি ব্যবহার করার সময় সতর্কতা অবলম্বন করুন It এটি কেবলমাত্র শেষ পৃষ্ঠাগুলি পুনরায় চালু হওয়ার পরে অ্যাক্সেস করা পৃষ্ঠাগুলির জন্য কাজ করবে। সুতরাং, আপনি যদি এই পৃষ্ঠাটি আপনার wss ভার্চুয়াল রুটে যুক্ত করেন, তবে এমন পৃষ্ঠাটি খোলার চেষ্টা করুন যা আগে অ্যাক্সেস করা হয়নি, আপনি একটি 404 পাবেন
মারক

1
@ মার্ক - স্কট গুথরির কাছ থেকে এই টিপসটি পেয়েছেন, আপনি যদি উদার বোধ করছেন, আপনি গুয়ের লেখায় মন্তব্য করেছেন: আপনি অনেকগুলি পয়েন্ট পয়েন্টগুলি এই দৃশ্যটি এড়াতে সহায়তা করবেন: ওয়েবলগস.এএসপিএন / স্কটগু / আর্কাইভ / ২০০৫/১০/ 06 / 426755.aspx
ট্রয় ডিমনব্রুন

এছাড়াও, এটি অ্যাপ্লিকেশন ডোমেনের একটি পুনর্ব্যবহারের সূত্রপাত করবে এবং সমস্ত অনুরোধগুলি শেষ হওয়ার পরে কোনও খোলা ডাটাবেস সংযোগ বন্ধ করবে।
বার্ট ভার্কোইজেন

এটির একটি সতর্কতা রয়েছে: আইআইএস 404 এর এইচটিটিপি স্থিতির কোডের সাথে app_offline.htm সামগ্রীটি ফেরত দেয় a যদি কোনও সার্চ ইঞ্জিন এই অফলাইন মোডে থাকা অবস্থায় আপনার সাইটটিকে সূচি দেওয়ার চেষ্টা করে, আপনি ফলাফলগুলি প্রশংসা করতে পারেন না। তবে এটি আমার ব্যক্তিগত কর্পোরেট ওয়েব অ্যাপের জন্য দুর্দান্ত কাজ করে!
ল্যারি সিলভারম্যান

119
throw new HttpException(404, "Article not found");

এটি এএসপি.এনইটি দ্বারা ধরা পড়বে যা কাস্টমআররিজ পৃষ্ঠাটি ফিরিয়ে দেবে। ডে পোস্টের সাম্প্রতিক .NET টিপটিতে এটি সম্পর্কে শিখেছি


কিছু বিকাশকারী যুক্তি দিতে পারেন যে এইচটিটিপি কনটেক্সটগুলিতে ম্যানুয়ালি জিনিসগুলি গুটিয়ে ফেলা ভাল।
lubos hasko

এই খারাপ ফর্ম না? আপনি 404 ত্রুটি প্রদর্শন করছেন, যেখানে আপনি কোনও ত্রুটি / ব্যতিক্রম প্রদর্শন করতে চান।
ডনি টমাস

1
আমি মনে করতে পারি যে একটি কেস যদি কেউ প্যারামিটারগুলির সাথে দূষিতভাবে গণ্ডগোল করে এবং কোনও কিছুকে অবৈধ করে রাখে তবে আপনি সম্ভবত একটি জেনেরিক 404 নির্দিষ্ট ত্রুটিটি চান না।
জন শিহান

3
বিশুদ্ধভাবে উত্সাহিত হয়েছে কারণ আমি এখন ডে সাইটের .NET টিপ সম্পর্কে অবগত আছি।
কন

এটি কেবল তখনই কার্যকর হয় যখন আপনি এটিকে httpModule বা httpHandler এ ফেলে দিন
খালেদ মুসাইদ

75

এখানে সেরা এক। খুব দ্রুত সংকলনের জন্য এটি আপনার ওয়েবকনফাইগে যুক্ত করুন। এটি এই কিউএফই এর মাধ্যমে 3.5SP1 পোস্ট ।

<compilation optimizeCompilations="true">

দ্রুত সংক্ষিপ্তসার: আমরা ASP.NET এ একটি নতুন অনুকূলিতকরণ সংকলন স্যুইচ প্রবর্তন করছি যা কিছু পরিস্থিতিতে সংকলনের গতি ব্যাপকভাবে উন্নত করতে পারে। কিছু ক্যাচ রয়েছে, সুতরাং আরও বিশদ জানতে পড়ুন। এই স্যুইচটি বর্তমানে 3.5SP1 এর কিউএফই হিসাবে উপলব্ধ এবং এটি ভিএস 2010 এর অংশ হবে।

এএসপি.এনইটি সংকলন সিস্টেমটি খুব রক্ষণশীল দৃষ্টিভঙ্গি গ্রহণ করে যার ফলে এটি কোনও 'শীর্ষ স্তরের' ফাইল পরিবর্তন করে যে কোনও সময় আগের কাজগুলি মুছে ফেলতে পারে। 'শীর্ষ স্তরের' ফাইলগুলিতে বিন এবং অ্যাপ_কোডের পাশাপাশি গ্লোবাল.এক্স্যাক্সের যে কোনও কিছুই অন্তর্ভুক্ত রয়েছে। এটি ছোট অ্যাপ্লিকেশনগুলির জন্য দুর্দান্ত কাজ করার সময় এটি খুব বড় অ্যাপ্লিকেশনের জন্য প্রায় অকেজো হয়ে যায়। উদাহরণস্বরূপ, কোনও গ্রাহক এমন একটি মামলায় চলছে যেখানে একটি 'বিন' সমাবেশে কোনও পরিবর্তন করার পরে একটি পৃষ্ঠা রিফ্রেশ করতে 10 মিনিট সময় লাগছিল।

ব্যথা কমাতে, আমরা একটি 'অনুকূলিত' সংকলন মোড যুক্ত করেছি যা পুনঃসংশোধনে অনেক কম রক্ষণশীল দৃষ্টিভঙ্গি গ্রহণ করে।

এখানে মাধ্যমে :


6
এটি কি ভিএস ২০১০ এর সাথে "ডিফল্টরূপে" আছে বা আমার এখনও এটি ব্যবহার করে দেখা উচিত?
এম

73
  • এইচটিটিপি কনটেক্সট.কেন্দ্র আপনাকে সর্বদা প্রাসঙ্গিকের অনুরোধ / প্রতিক্রিয়া / ইত্যাদি ইত্যাদিতে অ্যাক্সেস দেবে, এমনকি আপনার যদি পৃষ্ঠার বৈশিষ্ট্যগুলিতে অ্যাক্সেস না থাকে (যেমন, একটি স্বল্প-যুগল সহায়ক শ্রেণীর কাছ থেকে)।

  • রেসপন্সকে ফোন করে ব্যবহারকারীকে অন্য একজনকে পুনর্নির্দেশের পরে আপনি একই পৃষ্ঠায় কোড চালানো চালিয়ে যেতে পারেন ed উপরীক্ষণ ( url , মিথ্যা )

  • আপনার চাইলে একটি। সংযুক্ত পৃষ্ঠা (বা কোনও আইএইচটিপিহ্যান্ডলার ) যদি আপনার এএসপিএক্স ফাইলের দরকার হয় না । ওয়েবকনফিগ ফাইলটিতে উপাদানটিতে শ্রেণিতে নির্দেশ করার জন্য কেবল পথ এবং এইচটিটিপি পদ্ধতিগুলি সেট করুন।<httpHandlers>

  • একটি পৃষ্ঠা বস্তু একটি থেকে উদ্ধার করা যেতে পারে .ASPX প্রোগ্রামেটিক্যালি কল করে ফাইল PageParser.GetCompiledPageInstance (virtualPath, aspxFileName, কনটেক্সট)


প্রতিক্রিয়া সম্পর্কে। রিডাইরেক্ট (ইউআরএল, ভুয়া) - যা আমি অনেকদিন ধরে প্রত্যাশা করেছিলাম তা .. আমি জানি না যে আমি কীভাবে থানাএক্সএক্সএক্স মিস করেছি
হ্যাশ

1
কেউ কি আপনি এটি দিয়ে কি করতে পারে ব্যাখ্যা করতে পারেন? আমি জানি যে এর কিছু মূল্য আছে তবে আমি বুঝতে পারি না কেন ...
Deane

5
আপনি যদি ব্যবহারকারীকে অন্য কোনও ঠিকানায় পুনর্নির্দেশ করতে চান তবে এখনও কিছু ব্যাক-এন্ড প্রক্রিয়াজাতকরণ রয়েছে (উদাহরণস্বরূপ, একটি প্রতিবেদন প্রজন্মের অনুরোধ যা প্রতিবেদনের ব্যাকগ্রাউন্ডে প্রতিবেদন উত্পন্ন করতে অবিরত প্রতিবেদনের স্থিতি পৃষ্ঠায় পুনঃনির্দেশ করে)
মার্ক সিডেড

পেজ পার্সার.গেটকম্পাইলড পেইজইনস্ট্যান্স (..) এর জন্য কোনও দরকারী পরিস্থিতির ব্যাখ্যা দিতে পারে? দস্তাবেজগুলি এটি অবকাঠামোগত ব্যবহারের জন্য বলে - এটি আইএইচটিপিহ্যান্ডলার টাইপ দেয় যাতে এটি ব্যবহারিকভাবে কীভাবে ব্যবহার করা যায় তা আমি দেখতে পাই না।
জন কে

@jdk: আমি অতীতে এটি ব্যবহার করেছি যখন * .aspx অনুরোধের জন্য ডিফল্ট হ্যান্ডলারটি ওভাররাইড করার সময় আমি গতিশীল ইন-মেমরি আইএইচটিপিএইচেন্ডার অবজেক্টগুলি ব্যবহার করতে পারি তবে শারীরিক * .এএসপিএক্স ফাইলগুলির জন্য গেটকম্পাইলডপেজআইনস্ট্যান্স () ব্যবহার করতে পারি।
মার্ক সিডেড

70

মেশিন কনফিগ স্তরে খুচরা মোড:

<configuration>
  <system.web>
    <deployment retail="true"/>
  </system.web>
</configuration>

মিথ্যাতে ডিবাগ প্রয়োগের জন্য ওয়েবকনফিগ সেটিংসকে ওভাররাইড করে, কাস্টম ত্রুটিগুলি চালু করে এবং ট্রেসিং অক্ষম করে। আর প্রকাশের আগে বৈশিষ্ট্যগুলি পরিবর্তন করতে আর ভুলে যাবেন না - কেবল তাদের সকলকে বিকাশ বা পরীক্ষার পরিবেশের জন্য কনফিগার করা এবং উত্পাদন খুচরা সেটিং আপডেট করুন।


1
আমি কখনও কখনও প্রকাশের আগে সংকলন ডিবাগটিকে মিথ্যাতে পরিবর্তন করতে ভুলে যাই, যা কার্য সম্পাদনকে নেতিবাচকভাবে প্রভাবিত করে। আর সমস্যা নেই!
রায় টিঙ্কার

59

সামগ্রী পৃষ্ঠাগুলিতে মাস্টারপেজগুলির জন্য ইন্টেলিজেন্স সক্ষম করা
আমি নিশ্চিত এটি খুব কম পরিচিত হ্যাক

আপনি যখন সন্ধানকারী নিয়ন্ত্রণের পদ্ধতিটি ব্যবহার করতে এবং সামগ্রী পৃষ্ঠাগুলি থেকে মাস্টার পৃষ্ঠায় নিয়ন্ত্রণগুলি কাস্ট করতে হয় তখন বেশিরভাগ সময় মাস্টারটাইপ নির্দেশিকা একবার ভিজ্যুয়াল স্টুডিওতে ইন্টেলিজেন্স সক্ষম করে দেয় আপনি এটির জন্য

কেবল পৃষ্ঠাটিতে আরও একটি নির্দেশ যুক্ত করুন

<%@ MasterType VirtualPath="~/Masters/MyMainMasterPage.master" %>

আপনি যদি ভার্চুয়াল পাথটি ব্যবহার করতে না চান এবং পরিবর্তে ক্লাসের নামটি ব্যবহার করতে চান

<%@ MasterType TypeName="MyMainMasterPage" %>

সম্পূর্ণ নিবন্ধ পান এখানে


ফাইন্ডকন্ট্রোল ব্যবহার কখনও কখনও ব্যাতিক্রম হতে পারে, এই দুর্দান্ত টিপটির জন্য ধন্যবাদ!
আলেকজান্দ্রে ব্রাইসোবাইস

4
এটি ব্যবহারের ফলে অপ্রত্যাশিত আচরণ হতে পারে। দেখুন stackoverflow.com/questions/1998931/...
citronas

ব্যক্তিগতভাবে আমি মনে করি বৈশিষ্ট্যটি মানুষের কাছে অজানা রেখে দেওয়া উচিত, এটি পৃষ্ঠাটিকে মাস্টারপেইজে সংযুক্ত করে। যদি আপনি মাস্টারপেজের বৈশিষ্ট্য / পদ্ধতিগুলি ব্যবহার করে শেষ করেন এবং তারপরে মাস্টারপেজটি পরিবর্তন করেন তবে আপনি একটি রক্ষণাবেক্ষণ দুঃস্বপ্নের সাথে শেষ করেন।
ফিল করুন

@ ফিল: কখনও কখনও এটি প্রয়োজন হয় এবং ফাইন্ডকন্ট্রোল পদ্ধতির চেয়ে মাস্টারপৃষ্ঠায় একটি স্ট্যাটিকভাবে টাইপ অ্যাক্সেস থাকা ভাল। কমপক্ষে আপনি সংকলক বার্তা পান এবং দ্রুত এটি ঠিক করতে পারেন।
ডারডেন 8১

58

একটি অনুরোধ-স্তরীয় ক্যাচিং সরঞ্জাম হিসাবে এইচটিটিপি কনটেক্সট. আইটেম


2
এটি আমার পয়েন্টটিও হতে চলেছিল, আমি অনুরোধ স্তরের তথ্য পাস / পাওয়ার জন্য নেস্টেড নিয়ন্ত্রণগুলিতে এটি ব্যবহার করি। আইআই আংশিক দৃশ্যের ভিত্তিতে সংযুক্ত করার জন্য জেএস ফাইলগুলির একটি তালিকা সঞ্চয় করতে এমভিসিতে এটি ব্যবহার করুন।
ট্র্যাকার 1

1
আমি url থেকে আমার পৃষ্ঠাগুলিতে প্রাপ্ত পরামিতিগুলি পাস করার জন্য যখন asp.net রাউটিং ব্যবহার করি তখন আমি এটি ব্যবহার করি। (এমভিসি দিয়ে নয়) ইউআরএল পুনর্লিখনের জন্য দুর্দান্ত এবং বেশ নমনীয়।
আলেকজান্দ্রে ব্রিসিবোইস

হুমমম, কোথাও ভেবেছি সেশন-টা এর পরিবর্তে আমি এটি কোথায় ব্যবহার করতে পারতাম!
মাইক কিংসকোট

52

আমার মাথায় দুটি জিনিস দাঁড়িয়ে আছে:

1) আপনি কোড থেকে ট্রেস চালু এবং বন্ধ করতে পারেন:

#ifdef DEBUG 
   if (Context.Request.QueryString["DoTrace"] == "true")
                {
                    Trace.IsEnabled = true;
                    Trace.Write("Application:TraceStarted");
                }
#endif

2) আপনি কেবলমাত্র একটি ভাগ করা "কোড-পিছনে" ফাইল ব্যবহার করে একাধিক .aspx পৃষ্ঠা তৈরি করতে পারেন।

একটি শ্রেণি .cs ফাইল তৈরি করুন:

public class Class1:System.Web.UI.Page
    {
        public TextBox tbLogin;

        protected void Page_Load(object sender, EventArgs e)
        {

          if (tbLogin!=null)
            tbLogin.Text = "Hello World";
        }
    }

এবং তারপরে আপনার কাছে কয়েকটি .aspx পৃষ্ঠাগুলি থাকতে পারে (আপনি ভি।

  <%@ Page Language="C#"  AutoEventWireup="true"  Inherits="Namespace.Class1" %>
     <form id="form1" runat="server">
     <div>
     <asp:TextBox  ID="tbLogin" runat="server"></asp: TextBox  >
     </div>
     </form>

আপনার এএসপিএক্সে এমন নিয়ন্ত্রণ থাকতে পারে যা ক্লাস 1 এ উপস্থিত হয় না এবং তদ্বিপরীত হয়, তবে নালগুলির জন্য আপনার নিয়ন্ত্রণগুলি পরীক্ষা করতে আপনাকে রিমবার করতে হবে।


আমি এটিকে ভোট দিতাম, তবে ভোটের বাইরে চলে গেলাম। আমি চেষ্টা করতে যাচ্ছি এবং এটিকে ভোট দিতে ফিরে আসার কথা মনে আছে। আমি জানতাম না যে একাধিক পৃষ্ঠাগুলির জন্য আমাদের কাছে একই কোড বিহাইন্ড ফাইল থাকতে পারে। নিশ্চিত না, এটি কীভাবে কাজ করবে।
বৈভব

5
অন্য কেউ কি আপনাকে ইউআরএল থেকে কোনও ট্রেস সক্রিয় করার অনুমতি দেওয়ার জন্য এটির সুরক্ষা ঝুঁকি মনে করে? (# 1) আমি এই প্রশ্নটিকে হ্রাস করব না, তবে সেখানে ঝুঁকিটি বোঝা গুরুত্বপূর্ণ important
কেভিন গফ 21

5
অবশ্যই, আপনার এই কোডটি সত্যই একটি # আইডিডিবি ডিবিউজি # এন্ডিফ ব্লকের মধ্যে রাখা উচিত
Radu094

সুরক্ষার দিকটি উল্লেখ করে দুর্দান্ত মন্তব্য।
বৈভব

2
ইউআরএল থেকে কোনও ট্রেস সক্রিয় করা কেন সুরক্ষা ঝুঁকি? এটি আমার ক্ষতি করতে কীভাবে ব্যবহার করা যেতে পারে?
কামারে

48

তুমি ব্যবহার করতে পার:

 Request.Params[Control.UniqueId] 

একটি নিয়ন্ত্রণের মান পাওয়ার আগে ভিউস্টেটটি শুরু করার আগে (কন্ট্রোল.টেক্সট ইত্যাদি এ সময়ে খালি হবে)।

এটি ইনসে কোডের জন্য কার্যকর।


ভিউস্টেট ইনিশিয়ালেশন অনুরোধ.প্যারামগুলির সাথে কাজ করে না। এটি প্রয়োগ করা আইপোস্টব্যাকডাটাহ্যান্ডলার নিয়ন্ত্রণের লোডপোস্টডেটা পদ্ধতি উত্থাপনের আগে এটি ব্যবহার করুন।
চ্যাপলাক

46

WebMethods।

আপনি এএসপিএক্স পৃষ্ঠাগুলিতে স্থাপন করা ওয়েব পদ্ধতিতে এসএসপি নেট নেট এজ্যাক্স কলব্যাকগুলি ব্যবহার করতে পারেন। আপনি [ওয়েবমেথড ()] এবং [স্ক্রিপ্টমেথড ()] বৈশিষ্ট্যগুলি দিয়ে একটি স্থিতিশীল পদ্ধতি সাজাইতে পারেন। উদাহরণ স্বরূপ:

[System.Web.Services.WebMethod()] 
[System.Web.Script.Services.ScriptMethod()] 
public static List<string> GetFruitBeginingWith(string letter)
{
    List<string> products = new List<string>() 
    { 
        "Apple", "Banana", "Blackberry", "Blueberries", "Orange", "Mango", "Melon", "Peach"
    };

    return products.Where(p => p.StartsWith(letter)).ToList();
}

এখন, আপনার এএসপিএক্স পৃষ্ঠায় আপনি এটি করতে পারেন:

<form id="form1" runat="server">
    <div>
        <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
        <input type="button" value="Get Fruit" onclick="GetFruit('B')" />
    </div>
</form>

এবং জাভাস্ক্রিপ্টের মাধ্যমে আপনার সার্ভারের পাশের পদ্ধতিটি কল করুন:

    <script type="text/javascript">
    function GetFruit(l)
    {
        PageMethods.GetFruitBeginingWith(l, OnGetFruitComplete);
    }

    function OnGetFruitComplete(result)
    {
        alert("You got fruit: " + result);
    }
</script>

45

দীর্ঘমেয়াদি কাজ শুরু করার আগে ক্লায়েন্টটি এখনও সংযুক্ত আছে কিনা তা পরীক্ষা করে দেখুন:

if (this.Response.IsClientConnected)
{
  // long-running task
}

44

ASP.NET এর একটি সামান্য পরিচিত এবং খুব কম ব্যবহৃত বৈশিষ্ট্যটি হ'ল:

ট্যাগ ম্যাপিং

এটি খুব কমই ব্যবহৃত হয় কারণ কেবলমাত্র একটি নির্দিষ্ট পরিস্থিতি যেখানে আপনার এটি প্রয়োজন ছিল, তবে যখন আপনার এটি প্রয়োজন তখন এটি খুব সহজ।

এই সামান্য জ্ঞান বৈশিষ্ট্য সম্পর্কে কিছু নিবন্ধ:

ASP.NET এ
ট্যাগ ম্যাপিং এএসপি.নেট 2.0 তে ট্যাগ ম্যাপিং ব্যবহার করে

এবং যে শেষ নিবন্ধ থেকে:

ট্যাগ ম্যাপিং আপনাকে আপনার ওয়েব অ্যাপ্লিকেশনের প্রতিটি পৃষ্ঠায় সংকলন করার সময় সামঞ্জস্যপূর্ণ নিয়ন্ত্রণগুলি অদলবদল করতে দেয়। একটি দরকারী উদাহরণ হ'ল যদি আপনার কাছে কোনও স্টপ এএসপি.এনইটি নিয়ন্ত্রণ থাকে যেমন ড্রপডাউনলিস্ট এবং আপনি এটি ড্রপডাউনলিস্ট থেকে প্রাপ্ত কাস্টমাইজড নিয়ন্ত্রণের সাথে প্রতিস্থাপন করতে চান। এটি এমন একটি নিয়ন্ত্রণ হতে পারে যা দেখার জন্য ডেটা আরও অনুকূলিতকরণের জন্য কাস্টমাইজ করা হয়েছে। প্রতিটি ওয়েব ফর্ম সম্পাদনা করার পরিবর্তে এবং বিল্টড ড্রপডাউনলিস্টগুলিকে আপনার কাস্টম সংস্করণ দিয়ে প্রতিস্থাপনের পরিবর্তে, আপনি এএসপি.নেটকে কার্যকরভাবে কার্যকর করতে পারেন ওয়েবকনফিগ পরিবর্তন করে:

<pages>
 <tagMapping>
   <clear />
   <add tagType="System.Web.UI.WebControls.DropDownList"
        mappedTagType="SmartDropDown"/>
  </tagMapping>
</pages>

এটি আপনার দলের অন্যান্য বিকাশকারীদের জন্য খুব বিভ্রান্তিকর হবে
আইয়াকুট আকানসি

1
@ আইকুট - প্রকৃতপক্ষে এটি হতে পারে, এ কারণেই আমি বলেছি যে এর প্রয়োজনীয়তা বরং সংকীর্ণ, তবে যখন প্রয়োজন হয় এটি খুব সহজ y এছাড়াও, আমি নিশ্চিত করব যে কোনওরকম বিভ্রান্তি এবং অস্পষ্টতা এড়াতে ট্যাগ ম্যাপিংয়ের যে কোনও ব্যবহার খুব স্পষ্টভাবে নথিভুক্ত হয়েছিল।
ক্রেগটিপি

43

এইচটিপিএমডিউলস । আর্কিটেকচারটি পাগল মার্জিত। হতে পারে কোনও লুকানো বৈশিষ্ট্য না, তবে কম কোনওটিকেই শীতল করুন।


3
এইচটিপিএমডিউলস এমন এক জিনিস যা উন্নত, তবে আমি এটিকে বিরল বা কম ব্যবহৃত বলব না (বা আমাকে নিষ্পাপ বলি)। তবে হ্যাঁ, আমি স্থাপত্যটি পছন্দ করি।
বৈভব

+1 কারণ প্রচুর পাকা বিকাশকারীরা এইচটিপিডোমডিউলস সম্পর্কে জানতে পারে তবে অনুরোধগুলির সাথে তাদের সম্পর্কটি পুরোপুরি বুঝতে পারে না। (এইচটিপিহ্যান্ডলারদের সাথে একই জিনিস)
জন

34

আপনি সার্ভার নিয়ন্ত্রণগুলি সহ কোনও পৃষ্ঠার পুরো অংশগুলি মন্তব্য করতে একটি .aspx পৃষ্ঠার মধ্যে ASP.NET মন্তব্য ব্যবহার করতে পারেন। এবং যে সামগ্রীগুলি মন্তব্য করা হয়েছে তা কখনই ক্লায়েন্টকে প্রেরণ করা হবে না।

<%--
    <div>
        <asp:Button runat="server" id="btnOne"/>
    </div>
--%>

5
এমন কিছু লোক আছেন যারা জানেন না যে মন্তব্য আছে?
জো ফিলিপস

7
যখন আপনি <! - মন্তব্যসমূহ - এর অর্ধেক একটি এসপেক্স পৃষ্ঠা পেয়েছেন তখন আমি এটি পছন্দ করি
ব্রায়ান রেহবেইন

এটি ASP.NET এর বরং খালি বৈশিষ্ট্য
রাফেক

34

কোড এক্সপ্রেশন বিল্ডার

নমুনা মার্কআপ:

Text = '<%$ Code: GetText() %>'
Text = '<%$ Code: MyStaticClass.MyStaticProperty %>'
Text = '<%$ Code: DateTime.Now.ToShortDateString() %>'
MaxLenth = '<%$ Code: 30 + 40 %>'

কোড এক্সপ্রেশন বিল্ডারের আসল সৌন্দর্য হ'ল আপনি নন-ডেটাবাইন্ডিং পরিস্থিতিতে ডেটাবাইন্ডিংয়ের মত প্রকাশের মতো ব্যবহার করতে পারেন। আপনি অন্যান্য ফাংশন সম্পাদনকারী অন্যান্য এক্সপ্রেশন বিল্ডারও তৈরি করতে পারেন।

web.config:

<system.web>    
    <compilation debug="true">
        <expressionBuilders>
            <add expressionPrefix="Code" type="CodeExpressionBuilder" />

সিএস শ্রেণি যা এগুলি ঘটায়:

[ExpressionPrefix("Code")]
public class CodeExpressionBuilder : ExpressionBuilder
{
    public override CodeExpression GetCodeExpression(
        BoundPropertyEntry entry,
        object parsedData,
        ExpressionBuilderContext context)
    {            
        return new CodeSnippetExpression(entry.Expression);
    }
} 

1
শিরোনামে "এবং অন্যদের" সাথে আপনার কী অর্থ?
খালেদ মুসাইদ

ভাল আমি অনুমান করি যে আমি অন্যের কাছে পাইনি।
andleer

2
+1, সত্যিই দুর্দান্ত বৈশিষ্ট্য ... এটি ডাব্লুপিএফ এর মার্কআপ এক্সটেনশনের সাথে আসলে একই রকম
থমাস লেভস্ক

এটি কি ব্যবহারের মতো নয় <%= /*code*/ %>?
bevacqua

33

ASHX ফাইল প্রকারের ব্যবহার:
আপনি যদি পৃষ্ঠার ইভেন্ট হ্যান্ডলারগুলির মধ্যে না গিয়ে কেবল কিছু বেসিক এইচটিএমএল বা এক্সএমএল আউটপুট করতে চান তবে আপনি একটি সহজ ফ্যাশনে এইচটিটিপিডমডুল প্রয়োগ করতে পারবেন

পৃষ্ঠার নাম সোমারহ্যান্ডলারপেজ.এক্সএক্স রাখুন এবং এর মধ্যে নীচের কোডটি (কেবল একটি লাইন) রাখুন

<%@ webhandler language="C#" class="MyNamespace.MyHandler" %>

তারপরে কোড ফাইল

using System;
using System.IO;
using System.Web;

namespace MyNamespace
{
    public class MyHandler: IHttpHandler
    {
        public void ProcessRequest (HttpContext context)
        {   
            context.Response.ContentType = "text/xml";
            string myString = SomeLibrary.SomeClass.SomeMethod();
            context.Response.Write(myString);
        }

        public bool IsReusable
        {
            get { return true; }
        }
    }
}

5
এটি লক্ষণীয় যে আপনার যদি প্রয়োজন হয় তবে আপনার আইআরকায়ারসেশনস্টেট বা আইআরইডঅনলিএসশনস্টেট যুক্ত করা উচিত, অন্যথায় এটি উপস্থিত হবে না।
ট্র্যাকার 1

3
এটিও লক্ষণীয় যে আপনি ওয়েবকনফিগে হ্যান্ডলারের সেটআপটি নির্দিষ্ট করতে পারেন যাতে আপনার চারপাশে কোনও শারীরিক অ্যাশএক্স ফাইল রাখার দরকার না হয়। অথবা আপনি হ্যান্ডলারটিকে আপনার অ্যাপ্লিকেশনটি গ্লোবাল অ্যাক্সেক্সে প্রগ্রেমেটিকভাবে নিবন্ধিত করতে পারেন।
ফিল করুন

27

টার্গেট ব্রাউজার এবং আরও অনেক কিছুর উপর ভিত্তি করে সার্ভার নিয়ন্ত্রণ নিয়ন্ত্রণ বৈশিষ্ট্য নির্ধারণ করা

<asp:Label runat="server" ID="labelText" 
    ie:Text="This is IE text" 
    mozilla:Text="This is Firefox text" 
    Text="This is general text" 
/>

আমাকে এক অবাক করে দিয়েছিল।


1
+1 টি। আপনি কি একটি শর্ট কোড নমুনা ইনলাইন পোস্ট করতে পারেন। আমি মনে করি এটি আরও মনোযোগ এবং উন্নতি করবে। আমি চাই যে এটি উপরে উঠুক।
জন কে


26

আমি একটি এসপ নেট অ্যাপ্লিকেশনটিতে কাজ করেছি যা একটি শীর্ষস্থানীয় সুরক্ষা সংস্থার সুরক্ষা নিরীক্ষণের মধ্য দিয়ে গিয়েছিল এবং আমি কম পরিচিত তবে গুরুত্বপূর্ণ সুরক্ষার দুর্বলতা রোধ করতে এই সহজ কৌশলটি শিখেছি।

নীচের ব্যাখ্যাটি হ'ল: http://www.guidancehare.com/wiki/ASP.NET_2.0_Security_Guidlines_-_Parameter_Manipulation#Conider_Using_Page.ViewStateUserKey_to_Couter_One-Cl_Attacks

এক-ক্লিক আক্রমণ মোকাবেলার জন্য পৃষ্ঠা.ভিউস্টেট ইউজারকি ব্যবহার করার বিষয়টি বিবেচনা করুন। আপনি যদি নিজের কলারদের প্রমাণীকরণ করেন এবং ভিউস্টেট ব্যবহার করেন তবে এক-ক্লিকের আক্রমণগুলি প্রতিরোধ করতে পৃষ্ঠা_ইনিট ইভেন্ট হ্যান্ডলারে পৃষ্ঠা.ভিউস্টেট ইউজারকি কী সম্পত্তি সেট করুন।

void Page_Init (object sender, EventArgs e) {
  ViewStateUserKey = Session.SessionID;
}

সম্পত্তিটি এমন কোনও মান হিসাবে সেট করুন যা আপনি জানেন প্রতিটি ব্যবহারকারীর কাছে অনন্য, যেমন একটি সেশন আইডি, ব্যবহারকারীর নাম, বা ব্যবহারকারী শনাক্তকারী।

একজন আক্রমণকারী আক্রমণ ঘটে যখন আক্রমণকারী একটি ওয়েব পৃষ্ঠা তৈরি করে (.htm বা .aspx) যার মধ্যে __VIEWSTATE নামে একটি লুকানো ফর্ম ফিল্ড থাকে যা ইতিমধ্যে ভিউস্টেটের ডেটাতে পূর্ণ। আক্রমণকারীর আগে তৈরি করা পৃষ্ঠা থেকে ভিউস্টেট তৈরি করা যেতে পারে যেমন 100 আইটেম সহ শপিং কার্ট পৃষ্ঠা। আক্রমণকারী কোনও পৃষ্ঠাটিতে ব্রাউজিংয়ের ক্ষেত্রে একটি সন্দেহহীন ব্যবহারকারীর প্রলুব্ধ করে এবং তারপরে আক্রমণকারী পৃষ্ঠাটি সার্ভারে প্রেরণের জন্য তোলে যেখানে ভিউস্টেটটি বৈধ। সার্ভারের জানার কোনও উপায় নেই যে ভিউস্টেটটি আক্রমণকারীর কাছ থেকে এসেছে। ভিউস্টেট বৈধতা এবং এইচএমএসিগুলি এই আক্রমণটির বিরোধিতা করে না কারণ ভিউস্টেটটি বৈধ এবং পৃষ্ঠাটি ব্যবহারকারীর সুরক্ষা প্রসঙ্গে কার্যকর করা হয়েছে।

ভিউস্টেট ইউজারকি কী সম্পত্তি সেট করে, যখন আক্রমণকারী ভিউস্টেট তৈরি করতে কোনও পৃষ্ঠাতে ব্রাউজ করে, সম্পত্তিটি তার বা তার নামে শুরু করা হয়। বৈধ ব্যবহারকারী যখন পৃষ্ঠাটি সার্ভারে জমা দেয় তখন আক্রমণকারীর নাম দিয়ে এটি আরম্ভ করা হয়। ফলস্বরূপ, ভিউস্টেট এইচএমএসি চেক ব্যর্থ হয় এবং একটি ব্যতিক্রম উত্পন্ন হয়।


2
বেস ছেড়ে যাওয়ার কথাও মনে রাখবেন nঅননিট (ঙ); Page_Init () ফাংশনটির কাজ করার জন্য।
দ্রুড

আমি মনে করি যে এই আসলটি ব্যর্থ হতে পারে যদি কোনও সত্যিকারের ব্যবহারকারী কুকিজ গ্রহণ না করে, বা সেশনিডির সময়সীমা শেষ হয়ে যায়।
এরিস্টস

1
আপনি পৃষ্ঠাটির জন্য base.OnInit(e);ব্যবহার AutoEventWireup="true"করছেন কিনা আপনার প্রয়োজন হবে না ।
অ্যাডাম নফসিংগার

1
দ্রুড: তিনি অনআইনিতকে ওভাররাইড করছেন না (যার ক্ষেত্রে, বেস.অননিট (ই) প্রয়োজন হবে)।
crdx

ভিউস্টেট ইউজারকির জন্য সেশন আইডিটি ব্যবহার করা কেবলমাত্র একটি সেশন শুরু হওয়ার পরে কাজ করে। এর অর্থ হ'ল এই পৃষ্ঠাগুলি সেশনটির মেয়াদ শেষ হওয়ার পরেও শেষ হতে পারে। এই সমস্যাগুলি উদ্বেগজনক ক্ষেত্রে, আপনি ব্যবহারকারীর আইপি অ্যাড্রেস এর মতো আরও টেকসই কিছু ব্যবহার করতে পারেন।
রিকএনজেড

25

HttpContext.Current.IsDebuggingEnabled

কোন স্ক্রিপ্টগুলি আউটপুট (মিনিট বা পূর্ণ সংস্করণ) বা আপনি ডিভের মধ্যে যা কিছু চাইবেন তা নির্ধারণ করার জন্য এটি দুর্দান্ত কিন্তু লাইভ নয়।


আমি জানার সাথে একমত, তবে কখনও কখনও এটির প্রয়োগের অবস্থাটি ডিবাগ / প্রকাশ সম্পর্কে সচেতন এমন একটি অ্যাপ্লিকেশন থাকা আকর্ষণীয় হতে পারে।
আলেকজান্দ্রে ব্রাইসোবাইস

20

ASP.NET 3.5 এসপি 1 এ অন্তর্ভুক্ত:

  • কাস্টম এরিআরসগুলি এখন "রেসপন্সারডাইরাইট" এর মান সহ "রিডাইরেক্টমোড" বৈশিষ্ট্যটিকে সমর্থন করে। URL পরিবর্তন না করে ত্রুটি পৃষ্ঠা দেখায়।
  • ফর্ম ট্যাগ এখন ক্রিয়া বৈশিষ্ট্য স্বীকৃতি দেয়। আপনি যখন ইউআরএল পুনর্লিখন ব্যবহার করছেন তখন দুর্দান্ত



19

কনফিগারেশন ফাইলগুলি বিভক্ত করার জন্য কনফিগার সোর্স ব্যবহার করা।

আপনি অন্য .config ফাইলগুলিতে কনফিগারেশন উপাদানগুলিকে ঠেলে দিতে একটি ওয়েব.কমফিগ ফাইলে কনফিগার উত্স বৈশিষ্ট্যটি ব্যবহার করতে পারেন, উদাহরণস্বরূপ:

    <appSettings>
        <add key="webServiceURL" value="https://some/ws.url" />
        <!-- some more keys -->
    </appSettings>

... আপনার কাছে অন্য অ্যাপ্লিকেশন কনফিগারেশনে পুরো অ্যাপসেটেশন বিভাগটি সঞ্চিত থাকতে পারে। এখানে নতুন web.config:

    <appSettings configSource="myAppSettings.config" />

myAppSettings.configফাইল:

    <appSettings>        
        <add key="webServiceURL" value="https://some/ws.url" />
        <!-- some more keys -->
    </appSettings>

এটি দৃশ্যাবলীগুলির জন্য বেশ কার্যকর যেখানে আপনি কোনও গ্রাহকের কাছে একটি অ্যাপ্লিকেশন স্থাপন এবং আপনি চান না যে সেগুলি নিজেই ওয়েবকনফাইগ ফাইলটিতে হস্তক্ষেপ করছে এবং কেবলমাত্র কয়েকটি সেটিংস পরিবর্তন করতে সক্ষম হতে চায় be

রেফ: http://weblogs.asp.net/fmarguerie/archive/2007/04/26/using-configsource- to-split-configration- files.aspx


1
এটি কোনও প্রকারের নেট প্রকল্প, প্রাক্তন ডেস্কটপ অ্যাপ্লিকেশনটিতেও কাজ করছে। কনফিগারেশন
জোল্টান ভেরেস

17

পৃষ্ঠা নির্দেশিকায় মেইনটেনস্ক্রোলপজিশনঅনপোস্টব্যাক বৈশিষ্ট্য। এটি পোস্টব্যাকগুলি জুড়ে এসপেক্স পৃষ্ঠার স্ক্রোল অবস্থান বজায় রাখতে ব্যবহৃত হয়।


1
একটি মন্তব্য উত্তর উন্নত করতে সহায়ক হবে।
এমআরজি

16

এইচটিটিপি কনটেক্সট.আইএসসাস্টমএরআরএলবল একটি দুর্দান্ত বৈশিষ্ট্য Iএটি আমি একাধিকবার কার্যকর খুঁজে পেয়েছি। এটি সম্পর্কে একটি সংক্ষিপ্ত পোস্ট এখানে ।


16

ডিফল্টরূপে, কাস্টম নিয়ন্ত্রণের জন্য ট্যাগগুলির মধ্যে যে কোনও সামগ্রী চাইল্ড কন্ট্রোল হিসাবে যুক্ত করা হয়। ফিল্টারিং বা অতিরিক্ত পার্সিংয়ের জন্য এটি একটি অ্যাডপার্সডসুবজেক্ট () ওভাররাইডে (যেমন, ল্যাটারালকন্ট্রোলগুলিতে পাঠ্য সামগ্রীটির ) বাধা দেওয়া যেতে পারে :

    protected override void AddParsedSubObject(object obj)
     { var literal = obj as LiteralControl;
       if (literal != null) Controls.Add(parseControl(literal.Text));
       else base.AddParsedSubObject(obj);
     }

...

   <uc:MyControl runat='server'>
     ...this text is parsed as a LiteralControl...
  </uc:MyControl>

13

আপনার কাছে যদি এএসপি.নেট একটি আরএসএস ফিড তৈরি করে থাকে তবে এটি কখনও কখনও পৃষ্ঠার শীর্ষে একটি অতিরিক্ত লাইন রাখে। এটি আরএসএসের সাধারণ বৈধদের সাথে বৈধ হবে না। পৃষ্ঠার <@Page>নীচে পৃষ্ঠার নির্দেশকে রেখে আপনি এটিকে ঘিরে কাজ করতে পারেন ।


7
আরএসএস ফিড তৈরির জন্য আপনি কি .AXX হ্যান্ডলারটি ব্যবহার করে আরও ভাল কাজ করবেন না?
ড্যান ডিপো

আমি অনুমান করি যে প্রকল্পের জটিলতার উপর নির্ভর করে। প্রত্যেকেরই হ্যান্ডলারগুলি তৈরি এবং সংকলন করার ক্ষমতা বা দক্ষতা নেই। পৃষ্ঠায় এসপ নেট এইটির জন্য যুক্তিসঙ্গতভাবে ভাল কাজ করে
কেভিন গফ

1
এবং আপনি আরএসএস আইটেম তৈরি করতে <এসপি: পুনরাবৃত্তিকারী> এর মতো কিছু ব্যবহার করতে পারেন এবং অন্যান্য কৌশলগুলি করতে পারেন (যেমন কিছু আইটেম সরিয়ে আনার জন্য লগইনভিউ ব্যবহার করা) যা ASHX আইএমও থেকে স্ট্রিং লেখার চেয়ে অনেক ভাল
ছাচার

লিনকটোক্সএমএল + এএসএইচএক্স যাওয়ার উপায়!
কার্লোস Muñoz

আরএসএস ফিড উত্পাদনের চেয়ে এটি অনেক বেশি কাজের জন্য কার্যকর। আইআইআরসি, এইচটিএমএল 5 অবশ্যই সঠিকভাবে যাচাই করতে উপরে প্রথম লাইনে <! ডক্টিপ এইচটিএমএল> ট্যাগ থাকতে হবে।
রায় টিঙ্কার

12

ASP.NET v3.5 যুক্ত রুটের আগে আপনি কেবলমাত্র HTTPModule লিখে HTTP- র পৃষ্ঠার পাইপলাইনে অনুরোধটি পুনর্লিখন করে (বিগিনিউক ইভেন্টের মতো) নিজের পছন্দসই ইউআরএল তৈরি করতে পারবেন।

মত URL গুলি HTTP: // servername / পৃষ্ঠা / PARAM1 / SomeParams1 / PARAM2 / SomeParams2 অন্য পৃষ্ঠাতে নিচে (প্রায়ই রেগুলার এক্সপ্রেশনের ব্যবহার করে) মত ম্যাপ পেতে হবে।

HttpContext.RewritePath("PageHandler.aspx?Param1=SomeParms1&Param2=SomeParams2");

ডটনেটনুকের কাছে একটি সত্যিই ভাল এইচটিপিপি মডেল রয়েছে যা তাদের বন্ধুত্বপূর্ণ ইউআরএলগুলির জন্য এটি করে। এখনও এমন মেশিনগুলির জন্য কার্যকর যেখানে আপনি .NET v3.5 স্থাপন করতে পারবেন না।


এটির জন্য সমস্ত আইআইএস অনুরোধগুলি এএসপি.নেট
ম্যাপে জন শিহান

বা কেবল 404 ত্রুটি হ্যান্ডলার।
ফ্লাইওয়াত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.